🚧 developing...

This commit is contained in:
2025-03-27 01:01:30 +08:00
parent 781a71a27c
commit afcd128256
30 changed files with 1696 additions and 44 deletions

View File

@@ -0,0 +1,134 @@
package storage
import (
"context"
"encoding/json"
"errors"
"github.com/redis/go-redis/v9"
"schisandra-album-cloud-microservices/app/auth/model/mysql/model"
"schisandra-album-cloud-microservices/common/constant"
"schisandra-album-cloud-microservices/common/encrypt"
"schisandra-album-cloud-microservices/common/storage/config"
"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 GetImageBedUploadListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetImageBedUploadListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetImageBedUploadListLogic {
return &GetImageBedUploadListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetImageBedUploadListLogic) GetImageBedUploadList(req *types.ImageBedUploadListRequest) (resp *types.ImageBedUploadListResponse, err error) {
uid, ok := l.ctx.Value("user_id").(string)
if !ok {
return nil, errors.New("user_id not found")
}
storageImgBed := l.svcCtx.DB.ScaStorageImgBed
imgBeds, err := storageImgBed.Where(
storageImgBed.UserID.Eq(uid),
storageImgBed.Provider.Eq(req.Provider),
storageImgBed.Bucket.Eq(req.Bucket)).Find()
if err != nil {
return nil, err
}
cacheKey := constant.UserOssConfigPrefix + uid + ":" + req.Provider
ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, req.Provider)
if err != nil {
return nil, errors.New("get oss config failed")
}
//service, err := l.svcCtx.StorageManager.GetStorage(uid, ossConfig)
//if err != nil {
// return nil, errors.New("get storage failed")
//}
var records []types.ImageBedUploadMeta
for _, imgBed := range imgBeds {
records = append(records, types.ImageBedUploadMeta{
ID: imgBed.ID,
FileName: imgBed.FileName,
FileSize: imgBed.FileSize,
FileType: imgBed.FileType,
Path: ossConfig.Endpoint + "/" + ossConfig.BucketName + "/" + imgBed.Path,
Thumbnail: ossConfig.Endpoint + "/" + ossConfig.BucketName + "/" + imgBed.ThumbPath,
CreatedAt: imgBed.CreatedAt.Format("2006-01-02 15:04:05"),
Width: int64(imgBed.Width),
Height: int64(imgBed.Height),
})
}
return &types.ImageBedUploadListResponse{
Records: records,
}, nil
}
// 提取解密操作为函数
func (l *GetImageBedUploadListLogic) decryptConfig(dbConfig *model.ScaStorageConfig) (*config.StorageConfig, error) {
accessKey, err := encrypt.Decrypt(dbConfig.AccessKey, l.svcCtx.Config.Encrypt.Key)
if err != nil {
return nil, errors.New("decrypt access key failed")
}
secretKey, err := encrypt.Decrypt(dbConfig.SecretKey, l.svcCtx.Config.Encrypt.Key)
if err != nil {
return nil, errors.New("decrypt secret key failed")
}
return &config.StorageConfig{
Provider: dbConfig.Provider,
Endpoint: dbConfig.Endpoint,
AccessKey: accessKey,
SecretKey: secretKey,
BucketName: dbConfig.Bucket,
Region: dbConfig.Region,
}, nil
}
// 从缓存或数据库中获取 OSS 配置
func (l *GetImageBedUploadListLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) {
result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result()
if err != nil && !errors.Is(err, redis.Nil) {
return nil, errors.New("get oss config failed")
}
var ossConfig *config.StorageConfig
if result != "" {
var redisOssConfig model.ScaStorageConfig
if err = json.Unmarshal([]byte(result), &redisOssConfig); err != nil {
return nil, errors.New("unmarshal oss config failed")
}
return l.decryptConfig(&redisOssConfig)
}
// 缓存未命中,从数据库中加载
scaOssConfig := l.svcCtx.DB.ScaStorageConfig
dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First()
if err != nil {
return nil, err
}
// 缓存数据库配置
ossConfig, err = l.decryptConfig(dbOssConfig)
if err != nil {
return nil, err
}
marshalData, err := json.Marshal(dbOssConfig)
if err != nil {
return nil, errors.New("marshal oss config failed")
}
err = l.svcCtx.RedisClient.Set(l.ctx, cacheKey, marshalData, 0).Err()
if err != nil {
return nil, errors.New("set oss config failed")
}
return ossConfig, nil
}

View File

@@ -0,0 +1,177 @@
package storage
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/ccpwcn/kgo"
"github.com/redis/go-redis/v9"
"net/http"
"path"
"path/filepath"
"schisandra-album-cloud-microservices/app/auth/model/mysql/model"
"schisandra-album-cloud-microservices/common/constant"
"schisandra-album-cloud-microservices/common/encrypt"
"schisandra-album-cloud-microservices/common/storage/config"
"strings"
"time"
"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 ImageBedUploadLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewImageBedUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ImageBedUploadLogic {
return &ImageBedUploadLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *ImageBedUploadLogic) ImageBedUpload(r *http.Request) (resp *types.ImageBedUploadResponse, err error) {
uid, ok := l.ctx.Value("user_id").(string)
if !ok {
return nil, errors.New("user_id not found")
}
formValue := r.PostFormValue("data")
var result types.ImageBedMeta
if err := json.Unmarshal([]byte(formValue), &result); err != nil {
return nil, errors.New("invalid result")
}
file, header, err := r.FormFile("file")
if err != nil {
return nil, errors.New("file not found")
}
defer file.Close()
// 解析缩略图
thumbFile, _, err := r.FormFile("thumbnail")
if err != nil {
return nil, errors.New("thumbnail not found")
}
defer thumbFile.Close()
// 上传文件到OSS
cacheKey := constant.UserOssConfigPrefix + uid + ":" + result.Provider
ossConfig, err := l.getOssConfigFromCacheOrDb(cacheKey, uid, result.Provider)
if err != nil {
return nil, errors.New("get oss config failed")
}
service, err := l.svcCtx.StorageManager.GetStorage(uid, ossConfig)
if err != nil {
return nil, errors.New("get storage failed")
}
filePath := path.Join(
constant.ImageBedSpace,
constant.ImageSpace,
uid,
time.Now().Format("2006/01"), // 按年/月划分目录
fmt.Sprintf("%s_%s%s", strings.TrimSuffix(header.Filename, filepath.Ext(header.Filename)), kgo.SimpleUuid(), filepath.Ext(header.Filename)),
)
_, err = service.UploadFileSimple(l.ctx, ossConfig.BucketName, filePath, file, map[string]string{
"Content-Type": header.Header.Get("Content-Type")})
// 上传缩略图到OSS
if err != nil {
return nil, errors.New("upload file failed")
}
thumbFilePath := path.Join(
constant.ImageBedSpace,
constant.ThumbnailSpace,
uid,
time.Now().Format("2006/01"), // 按年/月划分目录
fmt.Sprintf("%s_%s%s", strings.TrimSuffix(header.Filename, filepath.Ext(header.Filename)), kgo.SimpleUuid(), filepath.Ext(header.Filename)),
)
_, err = service.UploadFileSimple(l.ctx, ossConfig.BucketName, thumbFilePath, thumbFile, map[string]string{
"Content-Type": header.Header.Get("Content-Type")})
if err != nil {
return nil, errors.New("upload file failed")
}
imgBed := model.ScaStorageImgBed{
UserID: uid,
Provider: result.Provider,
Bucket: ossConfig.BucketName,
Path: filePath,
ThumbPath: thumbFilePath,
FileSize: header.Size,
FileType: header.Header.Get("Content-Type"),
FileName: header.Filename,
Width: float64(result.Width),
Height: float64(result.Height),
}
err = l.svcCtx.DB.ScaStorageImgBed.Create(&imgBed)
if err != nil {
return nil, errors.New("create image bed failed")
}
return &types.ImageBedUploadResponse{ID: imgBed.ID}, nil
}
// 提取解密操作为函数
func (l *ImageBedUploadLogic) decryptConfig(dbConfig *model.ScaStorageConfig) (*config.StorageConfig, error) {
accessKey, err := encrypt.Decrypt(dbConfig.AccessKey, l.svcCtx.Config.Encrypt.Key)
if err != nil {
return nil, errors.New("decrypt access key failed")
}
secretKey, err := encrypt.Decrypt(dbConfig.SecretKey, l.svcCtx.Config.Encrypt.Key)
if err != nil {
return nil, errors.New("decrypt secret key failed")
}
return &config.StorageConfig{
Provider: dbConfig.Provider,
Endpoint: dbConfig.Endpoint,
AccessKey: accessKey,
SecretKey: secretKey,
BucketName: dbConfig.Bucket,
Region: dbConfig.Region,
}, nil
}
// 从缓存或数据库中获取 OSS 配置
func (l *ImageBedUploadLogic) getOssConfigFromCacheOrDb(cacheKey, uid, provider string) (*config.StorageConfig, error) {
result, err := l.svcCtx.RedisClient.Get(l.ctx, cacheKey).Result()
if err != nil && !errors.Is(err, redis.Nil) {
return nil, errors.New("get oss config failed")
}
var ossConfig *config.StorageConfig
if result != "" {
var redisOssConfig model.ScaStorageConfig
if err = json.Unmarshal([]byte(result), &redisOssConfig); err != nil {
return nil, errors.New("unmarshal oss config failed")
}
return l.decryptConfig(&redisOssConfig)
}
// 缓存未命中,从数据库中加载
scaOssConfig := l.svcCtx.DB.ScaStorageConfig
dbOssConfig, err := scaOssConfig.Where(scaOssConfig.UserID.Eq(uid), scaOssConfig.Provider.Eq(provider)).First()
if err != nil {
return nil, err
}
// 缓存数据库配置
ossConfig, err = l.decryptConfig(dbOssConfig)
if err != nil {
return nil, err
}
marshalData, err := json.Marshal(dbOssConfig)
if err != nil {
return nil, errors.New("marshal oss config failed")
}
err = l.svcCtx.RedisClient.Set(l.ctx, cacheKey, marshalData, 0).Err()
if err != nil {
return nil, errors.New("set oss config failed")
}
return ossConfig, nil
}

View File

@@ -0,0 +1,48 @@
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 RecoverImageLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewRecoverImageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RecoverImageLogic {
return &RecoverImageLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *RecoverImageLogic) RecoverImage(req *types.RecoverImageRequest) (resp string, err error) {
uid, ok := l.ctx.Value("user_id").(string)
if !ok {
return "", errors.New("user_id not found")
}
storageInfo := l.svcCtx.DB.ScaStorageInfo
info, err := storageInfo.Where(
storageInfo.UserID.Eq(uid),
storageInfo.ID.Eq(req.ID),
storageInfo.Provider.Eq(req.Provider),
storageInfo.Bucket.Eq(req.Bucket),
).Update(storageInfo.DeletedAt, nil)
if err != nil {
return "", err
}
if info.RowsAffected == 0 {
return "", errors.New("image not found")
}
return "success", nil
}

View File

@@ -0,0 +1,36 @@
package system
import (
"context"
"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 GetAllCommentListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetAllCommentListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAllCommentListLogic {
return &GetAllCommentListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetAllCommentListLogic) GetAllCommentList() (resp *types.AllCommentListResponse, err error) {
commentReply := l.svcCtx.DB.ScaCommentReply
var records []types.CommentReplyMeta
err = commentReply.Scan(&records)
if err != nil {
return nil, err
}
return &types.AllCommentListResponse{
Records: records,
}, nil
}

View File

@@ -0,0 +1,33 @@
package system
import (
"context"
"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 GetAllRoleListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetAllRoleListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAllRoleListLogic {
return &GetAllRoleListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetAllRoleListLogic) GetAllRoleList() (resp *types.RoleListResponse, err error) {
authRole := l.svcCtx.DB.ScaAuthRole
var roles []types.RoleMeta
err = authRole.Scan(&roles)
if err != nil {
return nil, err
}
return &types.RoleListResponse{Records: roles}, nil
}

View File

@@ -0,0 +1,30 @@
package system
import (
"context"
"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 GetAllStorageListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetAllStorageListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAllStorageListLogic {
return &GetAllStorageListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetAllStorageListLogic) GetAllStorageList() (resp *types.AllStorageListResponse, err error) {
// todo: add your logic here and delete this line
return
}

View File

@@ -0,0 +1,36 @@
package system
import (
"context"
"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 GetPermissionRuleListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetPermissionRuleListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPermissionRuleListLogic {
return &GetPermissionRuleListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetPermissionRuleListLogic) GetPermissionRuleList() (resp *types.PermissionRuleListResponse, err error) {
permissionRule := l.svcCtx.DB.ScaAuthPermissionRule
var permissionRuleList []types.PermissionRuleMeta
err = permissionRule.Scan(&permissionRuleList)
if err != nil {
return nil, err
}
return &types.PermissionRuleListResponse{Records: permissionRuleList}, nil
}

View File

@@ -2,7 +2,6 @@ package system
import (
"context"
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
"schisandra-album-cloud-microservices/app/auth/api/internal/types"
@@ -24,7 +23,28 @@ func NewGetUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUs
}
func (l *GetUserListLogic) GetUserList() (resp *types.UserInfoListResponse, err error) {
// todo: add your logic here and delete this line
return
authUser := l.svcCtx.DB.ScaAuthUser
var userMetaList []types.UserMeta
err = authUser.Select(
authUser.ID,
authUser.UID,
authUser.Username,
authUser.Nickname,
authUser.Email,
authUser.Phone,
authUser.Gender,
authUser.Avatar,
authUser.Location,
authUser.Company,
authUser.Blog,
authUser.Introduce,
authUser.Status,
authUser.CreatedAt,
authUser.UpdatedAt,
authUser.DeletedAt,
).Scan(&userMetaList)
if err != nil {
return nil, err
}
return &types.UserInfoListResponse{Records: userMetaList}, nil
}

View File

@@ -0,0 +1,35 @@
package system
import (
"context"
"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 GetUserLoginLogListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetUserLoginLogListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLoginLogListLogic {
return &GetUserLoginLogListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetUserLoginLogListLogic) GetUserLoginLogList() (resp *types.UserLoginLogListResponse, err error) {
userDevice := l.svcCtx.DB.ScaAuthUserDevice
var userLoginLogs []types.UserLoginLogMeta
err = userDevice.Scan(&userLoginLogs)
if err != nil {
return nil, err
}
return &types.UserLoginLogListResponse{Records: userLoginLogs}, nil
}

View File

@@ -0,0 +1,34 @@
package system
import (
"context"
"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 GetUserThirdPartyLoginListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetUserThirdPartyLoginListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserThirdPartyLoginListLogic {
return &GetUserThirdPartyLoginListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetUserThirdPartyLoginListLogic) GetUserThirdPartyLoginList() (resp *types.UserThirdPartyLoginListResponse, err error) {
userSocial := l.svcCtx.DB.ScaAuthUserSocial
var userSocialList []types.UserThirdPartyLoginMeta
err = userSocial.Scan(&userSocialList)
if err != nil {
}
return &types.UserThirdPartyLoginListResponse{Records: userSocialList}, nil
}