improve image sharing function

This commit is contained in:
2025-02-20 23:04:58 +08:00
parent b196e50aee
commit db4c59f6f6
37 changed files with 2188 additions and 95 deletions

View File

@@ -4,6 +4,7 @@ import (
"context"
"errors"
"schisandra-album-cloud-microservices/app/auth/model/mysql/model"
"schisandra-album-cloud-microservices/common/constant"
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
"schisandra-album-cloud-microservices/app/auth/api/internal/types"
@@ -33,7 +34,7 @@ func (l *CreateAlbumLogic) CreateAlbum(req *types.AlbumCreateRequest) (resp *typ
storageAlbum := &model.ScaStorageAlbum{
UserID: uid,
AlbumName: req.Name,
AlbumType: "0",
AlbumType: constant.AlbumTypeMine,
}
err = l.svcCtx.DB.ScaStorageAlbum.Create(storageAlbum)
if err != nil {

View File

@@ -68,6 +68,7 @@ func (l *GetAlbumDetailLogic) GetAlbumDetail(req *types.AlbumDetailListRequest)
storageInfo.FileName,
storageInfo.CreatedAt,
storageThumb.ThumbPath,
storageInfo.Path,
storageThumb.ThumbW,
storageThumb.ThumbH,
storageThumb.ThumbSize).
@@ -86,17 +87,17 @@ func (l *GetAlbumDetailLogic) GetAlbumDetail(req *types.AlbumDetailListRequest)
return &types.AlbumDetailListResponse{}, nil
}
//// 加载用户oss配置信息
//cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider
//ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider)
//if err != nil {
// return nil, err
//}
//
//service, err := l.svcCtx.StorageManager.GetStorage(uid, ossConfig)
//if err != nil {
// return nil, errors.New("get storage failed")
//}
// 加载用户oss配置信息
cacheOssConfigKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider
ossConfig, err := l.getOssConfigFromCacheOrDb(cacheOssConfigKey, uid, req.Provider)
if err != nil {
return nil, err
}
service, err := l.svcCtx.StorageManager.GetStorage(uid, ossConfig)
if err != nil {
return nil, errors.New("get storage failed")
}
// 按日期进行分组
var wg sync.WaitGroup
@@ -114,6 +115,11 @@ func (l *GetAlbumDetailLogic) GetAlbumDetail(req *types.AlbumDetailListRequest)
logx.Error(err)
return
}
url, err := service.PresignedURL(l.ctx, ossConfig.BucketName, dbFileInfo.Path, time.Hour*24*7)
if err != nil {
logx.Error(err)
return
}
// 使用 Load 或 Store 确保原子操作
value, _ := groupedImages.LoadOrStore(date, []types.ImageMeta{})
images := value.([]types.ImageMeta)
@@ -121,7 +127,8 @@ func (l *GetAlbumDetailLogic) GetAlbumDetail(req *types.AlbumDetailListRequest)
images = append(images, types.ImageMeta{
ID: dbFileInfo.ID,
FileName: dbFileInfo.FileName,
URL: presignedUrl.String(),
Thumbnail: presignedUrl.String(),
URL: url,
Width: dbFileInfo.ThumbW,
Height: dbFileInfo.ThumbH,
CreatedAt: dbFileInfo.CreatedAt.Format("2006-01-02 15:04:05"),

View File

@@ -3,6 +3,7 @@ package storage
import (
"context"
"errors"
"gorm.io/gen"
"gorm.io/gen/field"
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
@@ -37,7 +38,15 @@ func (l *GetAlbumListLogic) GetAlbumList(req *types.AlbumListRequest) (resp *typ
} else {
orderConditions = append(orderConditions, storageAlbum.AlbumName.Desc())
}
albums, err := storageAlbum.Where(storageAlbum.UserID.Eq(uid), storageAlbum.AlbumType.Eq(req.Type)).Order(orderConditions...).Find()
var typeConditions []gen.Condition
if req.Type != -1 {
// 获取全部相册
typeConditions = append(typeConditions, storageAlbum.AlbumType.Eq(req.Type))
typeConditions = append(typeConditions, storageAlbum.UserID.Eq(uid))
}
albums, err := storageAlbum.Where(
typeConditions...).
Order(orderConditions...).Find()
if err != nil {
return nil, err
}

View File

@@ -0,0 +1,80 @@
package storage
import (
"context"
"errors"
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
"schisandra-album-cloud-microservices/app/auth/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type GetUserStorageListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetUserStorageListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserStorageListLogic {
return &GetUserStorageListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// providerNameMap 存储商映射表
var providerNameMap = map[string]string{
"ali": "阿里云OSS",
"tencent": "腾讯云COS",
"aws": "Amazon S3",
"qiniu": "七牛云",
"huawei": "华为云OBS",
}
func (l *GetUserStorageListLogic) GetUserStorageList() (resp *types.StorageListResponse, err error) {
uid, ok := l.ctx.Value("user_id").(string)
if !ok {
return nil, errors.New("user_id not found")
}
storageConfig := l.svcCtx.DB.ScaStorageConfig
storageConfigs, err := storageConfig.Select(
storageConfig.Provider,
storageConfig.Bucket).
Where(
storageConfig.UserID.Eq(uid)).Find()
if err != nil {
return nil, err
}
// 使用 map 组织数据
providerMap := make(map[string][]types.StorageMeta)
for _, config := range storageConfigs {
providerMap[config.Provider] = append(providerMap[config.Provider], types.StorageMeta{
Value: config.Bucket,
Name: config.Bucket,
})
}
// 组装返回结构
var records []types.StroageNode
for provider, buckets := range providerMap {
records = append(records, types.StroageNode{
Value: provider,
Name: l.getProviderName(provider),
Children: buckets,
})
}
// 返回数据
return &types.StorageListResponse{
Records: records,
}, nil
}
// getProviderName 获取存储商的中文名称
func (l *GetUserStorageListLogic) getProviderName(provider string) string {
if name, exists := providerNameMap[provider]; exists {
return name
}
return provider
}

View File

@@ -288,6 +288,7 @@ func (l *UploadFileLogic) uploadFileToOSS(uid string, header *multipart.FileHead
}
objectKey := path.Join(
"image_space",
uid,
time.Now().Format("2006/01"), // 按年/月划分目录
l.classifyFile(result.FileType, result.IsScreenshot),