feat: rbac完善,file接入完成
This commit is contained in:
@@ -4,6 +4,8 @@ Log:
|
|||||||
Encoding: plain
|
Encoding: plain
|
||||||
Host: 0.0.0.0
|
Host: 0.0.0.0
|
||||||
Port: 9002
|
Port: 9002
|
||||||
|
Timeout: 300000
|
||||||
|
MaxBytes: 1048576000
|
||||||
|
|
||||||
Auth:
|
Auth:
|
||||||
AccessSecret: 9149f2eb-d517-4a50-a03a-231dbcf0d872
|
AccessSecret: 9149f2eb-d517-4a50-a03a-231dbcf0d872
|
||||||
|
|||||||
+83
-1
@@ -28,10 +28,67 @@ type (
|
|||||||
PageSize int `json:"pageSize,optional"`
|
PageSize int `json:"pageSize,optional"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
}
|
}
|
||||||
|
FileListResp {
|
||||||
|
List []FileInfo `json:"list"`
|
||||||
|
Total int64 `json:"total"`
|
||||||
|
}
|
||||||
// 文件ID请求
|
// 文件ID请求
|
||||||
FileIdReq {
|
FileIdReq {
|
||||||
Id string `path:"id"`
|
Id string `path:"id"`
|
||||||
}
|
}
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
StorageConfigInfo {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
IsDefault int `json:"isDefault"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
CreateStorageConfigReq {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region,optional"`
|
||||||
|
Status int `json:"status,optional"`
|
||||||
|
Remark string `json:"remark,optional"`
|
||||||
|
}
|
||||||
|
UpdateStorageConfigReq {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region,optional"`
|
||||||
|
Status int `json:"status,optional"`
|
||||||
|
Remark string `json:"remark,optional"`
|
||||||
|
}
|
||||||
|
SetDefaultStorageConfigReq {
|
||||||
|
Id string `json:"id"`
|
||||||
|
}
|
||||||
|
StorageConfigListReq {
|
||||||
|
Current int `json:"current,optional"`
|
||||||
|
PageSize int `json:"pageSize,optional"`
|
||||||
|
Type string `json:"type,optional"`
|
||||||
|
Name string `json:"name,optional"`
|
||||||
|
}
|
||||||
|
StorageConfigListResp {
|
||||||
|
List []StorageConfigInfo `json:"list"`
|
||||||
|
Total int64 `json:"total"`
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// ========== 需要鉴权的接口 ==========
|
// ========== 需要鉴权的接口 ==========
|
||||||
@@ -51,10 +108,35 @@ service file-api {
|
|||||||
|
|
||||||
@doc "文件列表"
|
@doc "文件列表"
|
||||||
@handler GetFileList
|
@handler GetFileList
|
||||||
post /list (FileListReq)
|
post /list (FileListReq) returns (FileListResp)
|
||||||
|
|
||||||
@doc "获取文件信息"
|
@doc "获取文件信息"
|
||||||
@handler GetFileById
|
@handler GetFileById
|
||||||
get /:id (FileIdReq) returns (FileInfo)
|
get /:id (FileIdReq) returns (FileInfo)
|
||||||
|
|
||||||
|
@doc "下载文件"
|
||||||
|
@handler DownloadFile
|
||||||
|
get /download/:id (FileIdReq)
|
||||||
|
|
||||||
|
// ---------- 存储配置管理 ----------
|
||||||
|
@doc "创建存储配置"
|
||||||
|
@handler CreateStorageConfig
|
||||||
|
post /config/create (CreateStorageConfigReq)
|
||||||
|
|
||||||
|
@doc "更新存储配置"
|
||||||
|
@handler UpdateStorageConfig
|
||||||
|
post /config/update (UpdateStorageConfigReq)
|
||||||
|
|
||||||
|
@doc "删除存储配置"
|
||||||
|
@handler DeleteStorageConfig
|
||||||
|
post /config/delete (IdsReq)
|
||||||
|
|
||||||
|
@doc "设置默认存储配置"
|
||||||
|
@handler SetDefaultStorageConfig
|
||||||
|
post /config/setDefault (SetDefaultStorageConfigReq)
|
||||||
|
|
||||||
|
@doc "获取存储配置列表"
|
||||||
|
@handler GetStorageConfigList
|
||||||
|
post /config/list (StorageConfigListReq) returns (StorageConfigListResp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 创建存储配置
|
||||||
|
func CreateStorageConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.CreateStorageConfigReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewCreateStorageConfigLogic(r.Context(), svcCtx)
|
||||||
|
err := l.CreateStorageConfig(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 删除存储配置
|
||||||
|
func DeleteStorageConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.IdsReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewDeleteStorageConfigLogic(r.Context(), svcCtx)
|
||||||
|
err := l.DeleteStorageConfig(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 下载文件
|
||||||
|
func DownloadFileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.FileIdReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
httpx.ErrorCtx(r.Context(), w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewDownloadFileLogic(r.Context(), svcCtx)
|
||||||
|
err := l.DownloadFile(w, &req)
|
||||||
|
if err != nil {
|
||||||
|
httpx.ErrorCtx(r.Context(), w, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,11 +23,11 @@ func GetFileListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
l := file.NewGetFileListLogic(r.Context(), svcCtx)
|
l := file.NewGetFileListLogic(r.Context(), svcCtx)
|
||||||
err := l.GetFileList(&req)
|
resp, err := l.GetFileList(&req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.Fail(w, err.Error())
|
response.Fail(w, err.Error())
|
||||||
} else {
|
} else {
|
||||||
response.Ok(w)
|
response.OkWithData(w, resp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 获取存储配置列表
|
||||||
|
func GetStorageConfigListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.StorageConfigListReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewGetStorageConfigListLogic(r.Context(), svcCtx)
|
||||||
|
resp, err := l.GetStorageConfigList(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, resp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 设置默认存储配置
|
||||||
|
func SetDefaultStorageConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.SetDefaultStorageConfigReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewSetDefaultStorageConfigLogic(r.Context(), svcCtx)
|
||||||
|
err := l.SetDefaultStorageConfig(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/logic/file"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 更新存储配置
|
||||||
|
func UpdateStorageConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.UpdateStorageConfigReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := file.NewUpdateStorageConfigLogic(r.Context(), svcCtx)
|
||||||
|
err := l.UpdateStorageConfig(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
func UploadFileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
func UploadFileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
l := file.NewUploadFileLogic(r.Context(), svcCtx)
|
l := file.NewUploadFileLogic(r.Context(), svcCtx)
|
||||||
resp, err := l.UploadFile()
|
resp, err := l.UploadFile(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.Fail(w, err.Error())
|
response.Fail(w, err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -21,12 +21,48 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
|||||||
Path: "/:id",
|
Path: "/:id",
|
||||||
Handler: file.GetFileByIdHandler(serverCtx),
|
Handler: file.GetFileByIdHandler(serverCtx),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// 创建存储配置
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/config/create",
|
||||||
|
Handler: file.CreateStorageConfigHandler(serverCtx),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 删除存储配置
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/config/delete",
|
||||||
|
Handler: file.DeleteStorageConfigHandler(serverCtx),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 获取存储配置列表
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/config/list",
|
||||||
|
Handler: file.GetStorageConfigListHandler(serverCtx),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 设置默认存储配置
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/config/setDefault",
|
||||||
|
Handler: file.SetDefaultStorageConfigHandler(serverCtx),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 更新存储配置
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/config/update",
|
||||||
|
Handler: file.UpdateStorageConfigHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 删除文件
|
// 删除文件
|
||||||
Method: http.MethodDelete,
|
Method: http.MethodPost,
|
||||||
Path: "/delete",
|
Path: "/delete",
|
||||||
Handler: file.DeleteFileHandler(serverCtx),
|
Handler: file.DeleteFileHandler(serverCtx),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// 下载文件
|
||||||
|
Method: http.MethodGet,
|
||||||
|
Path: "/download/:id",
|
||||||
|
Handler: file.DownloadFileHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 文件列表
|
// 文件列表
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateStorageConfigLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建存储配置
|
||||||
|
func NewCreateStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateStorageConfigLogic {
|
||||||
|
return &CreateStorageConfigLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *CreateStorageConfigLogic) CreateStorageConfig(req *types.CreateStorageConfigReq) error {
|
||||||
|
_, err := l.svcCtx.FileRpc.CreateStorageConfig(l.ctx, &fileservice.CreateStorageConfigReq{
|
||||||
|
Type: req.Type,
|
||||||
|
Name: req.Name,
|
||||||
|
Endpoint: req.Endpoint,
|
||||||
|
AccessKeyId: req.AccessKeyId,
|
||||||
|
AccessKeySecret: req.AccessKeySecret,
|
||||||
|
BucketName: req.BucketName,
|
||||||
|
BucketUrl: req.BucketUrl,
|
||||||
|
Region: req.Region,
|
||||||
|
Status: int32(req.Status),
|
||||||
|
Remark: req.Remark,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -6,10 +6,11 @@ package file
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/oss_core"
|
||||||
"sundynix-micro-go/app/file/api/internal/svc"
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
"sundynix-micro-go/app/file/api/internal/types"
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DeleteFileLogic struct {
|
type DeleteFileLogic struct {
|
||||||
@@ -28,7 +29,33 @@ func NewDeleteFileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Delete
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *DeleteFileLogic) DeleteFile(req *types.IdsReq) error {
|
func (l *DeleteFileLogic) DeleteFile(req *types.IdsReq) error {
|
||||||
// todo: add your logic here and delete this line
|
if len(req.Ids) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
// 1. 查询文件记录获取OSS Key
|
||||||
|
resp, err := l.svcCtx.FileRpc.GetFilesByIds(l.ctx, &fileservice.GetFilesByIdsReq{
|
||||||
|
Ids: req.Ids,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 从OSS物理删除
|
||||||
|
factory := oss_core.NewOSSFactory(l.svcCtx.FileRpc)
|
||||||
|
uploader, err := factory.GetActiveUploader(l.ctx)
|
||||||
|
if err == nil && uploader != nil {
|
||||||
|
for _, file := range resp.Files {
|
||||||
|
if file.Key != "" {
|
||||||
|
_ = uploader.DeleteFile(l.ctx, file.Key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 从数据库删除
|
||||||
|
_, err = l.svcCtx.FileRpc.DeleteFiles(l.ctx, &fileservice.DeleteFilesReq{
|
||||||
|
Ids: req.Ids,
|
||||||
|
})
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteStorageConfigLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除存储配置
|
||||||
|
func NewDeleteStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteStorageConfigLogic {
|
||||||
|
return &DeleteStorageConfigLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *DeleteStorageConfigLogic) DeleteStorageConfig(req *types.IdsReq) error {
|
||||||
|
_, err := l.svcCtx.FileRpc.DeleteStorageConfig(l.ctx, &fileservice.DeleteFilesReq{
|
||||||
|
Ids: req.Ids,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/oss_core"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DownloadFileLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下载文件
|
||||||
|
func NewDownloadFileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DownloadFileLogic {
|
||||||
|
return &DownloadFileLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *DownloadFileLogic) DownloadFile(w http.ResponseWriter, req *types.FileIdReq) error {
|
||||||
|
// 1. 获取文件记录
|
||||||
|
resp, err := l.svcCtx.FileRpc.GetFileById(l.ctx, &fileservice.GetFileByIdReq{
|
||||||
|
Id: req.Id,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 获取具体底层client
|
||||||
|
factory := oss_core.NewOSSFactory(l.svcCtx.FileRpc)
|
||||||
|
uploader, err := factory.GetActiveUploader(l.ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 读取流
|
||||||
|
reader, err := uploader.DownloadFile(l.ctx, resp.File.Key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer reader.Close()
|
||||||
|
|
||||||
|
// 4. 返回文件流
|
||||||
|
w.Header().Set("Content-Disposition", "attachment; filename=\""+resp.File.Name+"\"")
|
||||||
|
w.Header().Set("Content-Type", "application/octet-stream")
|
||||||
|
_, err = io.Copy(w, reader)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -6,10 +6,10 @@ package file
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"sundynix-micro-go/app/file/api/internal/svc"
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
"sundynix-micro-go/app/file/api/internal/types"
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetFileByIdLogic struct {
|
type GetFileByIdLogic struct {
|
||||||
@@ -28,7 +28,20 @@ func NewGetFileByIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *GetFileByIdLogic) GetFileById(req *types.FileIdReq) (resp *types.FileInfo, err error) {
|
func (l *GetFileByIdLogic) GetFileById(req *types.FileIdReq) (resp *types.FileInfo, err error) {
|
||||||
// todo: add your logic here and delete this line
|
respRpc, err := l.svcCtx.FileRpc.GetFileById(l.ctx, &fileservice.GetFileByIdReq{
|
||||||
|
Id: req.Id,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return &types.FileInfo{
|
||||||
|
Id: respRpc.File.Id,
|
||||||
|
Name: respRpc.File.Name,
|
||||||
|
Url: respRpc.File.Url,
|
||||||
|
Tag: respRpc.File.Tag,
|
||||||
|
Key: respRpc.File.Key,
|
||||||
|
Suffix: respRpc.File.Suffix,
|
||||||
|
Md5: respRpc.File.Md5,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ package file
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"sundynix-micro-go/app/file/api/internal/svc"
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
"sundynix-micro-go/app/file/api/internal/types"
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetFileListLogic struct {
|
type GetFileListLogic struct {
|
||||||
@@ -27,8 +27,31 @@ func NewGetFileListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *GetFileListLogic) GetFileList(req *types.FileListReq) error {
|
func (l *GetFileListLogic) GetFileList(req *types.FileListReq) (resp *types.FileListResp, err error) {
|
||||||
// todo: add your logic here and delete this line
|
respRpc, err := l.svcCtx.FileRpc.GetFileList(l.ctx, &fileservice.GetFileListReq{
|
||||||
|
Current: int32(req.Current),
|
||||||
|
PageSize: int32(req.PageSize),
|
||||||
|
Name: req.Name,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
var list []types.FileInfo
|
||||||
|
for _, item := range respRpc.List {
|
||||||
|
list = append(list, types.FileInfo{
|
||||||
|
Id: item.Id,
|
||||||
|
Name: item.Name,
|
||||||
|
Url: item.Url,
|
||||||
|
Tag: item.Tag,
|
||||||
|
Key: item.Key,
|
||||||
|
Suffix: item.Suffix,
|
||||||
|
Md5: item.Md5,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.FileListResp{
|
||||||
|
List: list,
|
||||||
|
Total: respRpc.Total,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetStorageConfigListLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取存储配置列表
|
||||||
|
func NewGetStorageConfigListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetStorageConfigListLogic {
|
||||||
|
return &GetStorageConfigListLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetStorageConfigListLogic) GetStorageConfigList(req *types.StorageConfigListReq) (resp *types.StorageConfigListResp, err error) {
|
||||||
|
respRpc, err := l.svcCtx.FileRpc.GetStorageConfigList(l.ctx, &fileservice.StorageConfigListReq{
|
||||||
|
Current: int32(req.Current),
|
||||||
|
PageSize: int32(req.PageSize),
|
||||||
|
Type: req.Type,
|
||||||
|
Name: req.Name,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var list []types.StorageConfigInfo
|
||||||
|
for _, item := range respRpc.List {
|
||||||
|
list = append(list, types.StorageConfigInfo{
|
||||||
|
Id: item.Id,
|
||||||
|
Type: item.Type,
|
||||||
|
Name: item.Name,
|
||||||
|
Endpoint: item.Endpoint,
|
||||||
|
AccessKeyId: item.AccessKeyId,
|
||||||
|
AccessKeySecret: item.AccessKeySecret,
|
||||||
|
BucketName: item.BucketName,
|
||||||
|
BucketUrl: item.BucketUrl,
|
||||||
|
Region: item.Region,
|
||||||
|
IsDefault: int(item.IsDefault),
|
||||||
|
Status: int(item.Status),
|
||||||
|
Remark: item.Remark,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.StorageConfigListResp{
|
||||||
|
List: list,
|
||||||
|
Total: respRpc.Total,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SetDefaultStorageConfigLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置默认存储配置
|
||||||
|
func NewSetDefaultStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetDefaultStorageConfigLogic {
|
||||||
|
return &SetDefaultStorageConfigLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SetDefaultStorageConfigLogic) SetDefaultStorageConfig(req *types.SetDefaultStorageConfigReq) error {
|
||||||
|
_, err := l.svcCtx.FileRpc.SetDefaultStorageConfig(l.ctx, &fileservice.SetDefaultStorageConfigReq{
|
||||||
|
Id: req.Id,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UpdateStorageConfigLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新存储配置
|
||||||
|
func NewUpdateStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateStorageConfigLogic {
|
||||||
|
return &UpdateStorageConfigLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *UpdateStorageConfigLogic) UpdateStorageConfig(req *types.UpdateStorageConfigReq) error {
|
||||||
|
_, err := l.svcCtx.FileRpc.UpdateStorageConfig(l.ctx, &fileservice.UpdateStorageConfigReq{
|
||||||
|
Id: req.Id,
|
||||||
|
Type: req.Type,
|
||||||
|
Name: req.Name,
|
||||||
|
Endpoint: req.Endpoint,
|
||||||
|
AccessKeyId: req.AccessKeyId,
|
||||||
|
AccessKeySecret: req.AccessKeySecret,
|
||||||
|
BucketName: req.BucketName,
|
||||||
|
BucketUrl: req.BucketUrl,
|
||||||
|
Region: req.Region,
|
||||||
|
Status: int32(req.Status),
|
||||||
|
Remark: req.Remark,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -5,9 +5,17 @@ package file
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/file/api/internal/oss_core"
|
||||||
"sundynix-micro-go/app/file/api/internal/svc"
|
"sundynix-micro-go/app/file/api/internal/svc"
|
||||||
"sundynix-micro-go/app/file/api/internal/types"
|
"sundynix-micro-go/app/file/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
)
|
)
|
||||||
@@ -27,8 +35,84 @@ func NewUploadFileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Upload
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *UploadFileLogic) UploadFile() (resp *types.FileInfo, err error) {
|
func (l *UploadFileLogic) UploadFile(r *http.Request) (resp *types.FileInfo, err error) {
|
||||||
// todo: add your logic here and delete this line
|
err = r.ParseMultipartForm(32 << 20) // 32MB max memory
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("解析表单失败: %v", err)
|
||||||
|
}
|
||||||
|
file, fileHeader, err := r.FormFile("file")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("获取文件失败: %v", err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
return
|
// 计算文件 MD5
|
||||||
|
hash := md5.New()
|
||||||
|
if _, err := io.Copy(hash, file); err != nil {
|
||||||
|
return nil, fmt.Errorf("计算文件MD5失败: %v", err)
|
||||||
|
}
|
||||||
|
fileMd5 := hex.EncodeToString(hash.Sum(nil))
|
||||||
|
|
||||||
|
// 调用 RPC 检查文件是否已存在(秒传)
|
||||||
|
checkResp, err := l.svcCtx.FileRpc.CheckFileByMd5(l.ctx, &fileservice.CheckFileByMd5Req{Md5: fileMd5})
|
||||||
|
if err != nil {
|
||||||
|
l.Logger.Errorf("调用FileRpc检查MD5失败: %v", err)
|
||||||
|
return nil, fmt.Errorf("服务器内部异常")
|
||||||
|
}
|
||||||
|
if checkResp.Exists && checkResp.File != nil {
|
||||||
|
l.Logger.Infof("文件已存在,触发秒传: %s", fileMd5)
|
||||||
|
return &types.FileInfo{
|
||||||
|
Id: checkResp.File.Id,
|
||||||
|
Name: checkResp.File.Name,
|
||||||
|
Url: checkResp.File.Url,
|
||||||
|
Tag: checkResp.File.Tag,
|
||||||
|
Key: checkResp.File.Key,
|
||||||
|
Suffix: checkResp.File.Suffix,
|
||||||
|
Md5: checkResp.File.Md5,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 此时需要真正上传,先将文件指针拨回开头
|
||||||
|
if _, err := file.Seek(0, 0); err != nil {
|
||||||
|
return nil, fmt.Errorf("读取文件流失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
factory := oss_core.NewOSSFactory(l.svcCtx.FileRpc)
|
||||||
|
uploader, err := factory.GetActiveUploader(l.ctx)
|
||||||
|
if err != nil {
|
||||||
|
l.Logger.Errorf("获取OSS客户端失败: %v", err)
|
||||||
|
return nil, fmt.Errorf("存储服务未配置或不可用")
|
||||||
|
}
|
||||||
|
|
||||||
|
url, key, err := uploader.UploadFile(l.ctx, file, fileHeader)
|
||||||
|
if err != nil {
|
||||||
|
l.Logger.Errorf("上传文件失败: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ext := filepath.Ext(fileHeader.Filename)
|
||||||
|
|
||||||
|
// 把记录存入数据库
|
||||||
|
rpcResp, err := l.svcCtx.FileRpc.CreateFile(l.ctx, &fileservice.CreateFileReq{
|
||||||
|
Name: fileHeader.Filename,
|
||||||
|
Url: url,
|
||||||
|
Tag: "default",
|
||||||
|
Key: key,
|
||||||
|
Suffix: ext,
|
||||||
|
Md5: fileMd5, // 保存计算出的MD5
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
l.Logger.Errorf("调用FileRpc创建文件记录失败: %v", err)
|
||||||
|
return nil, fmt.Errorf("保存文件记录失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.FileInfo{
|
||||||
|
Id: rpcResp.File.Id,
|
||||||
|
Name: rpcResp.File.Name,
|
||||||
|
Url: rpcResp.File.Url,
|
||||||
|
Tag: rpcResp.File.Tag,
|
||||||
|
Key: rpcResp.File.Key,
|
||||||
|
Suffix: rpcResp.File.Suffix,
|
||||||
|
Md5: rpcResp.File.Md5,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/common/utils/hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AliyunUploader struct {
|
||||||
|
bucket *oss.Bucket
|
||||||
|
config *file.StorageConfigInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAliyunUploader(conf *file.StorageConfigInfo) (Uploader, error) {
|
||||||
|
client, err := oss.New(conf.Endpoint, conf.AccessKeyId, conf.AccessKeySecret)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
bucket, err := client.Bucket(conf.BucketName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &AliyunUploader{
|
||||||
|
bucket: bucket,
|
||||||
|
config: conf,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AliyunUploader) UploadFile(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (string, string, error) {
|
||||||
|
ext := filepath.Ext(fileHeader.Filename)
|
||||||
|
filename := hash.MD5([]byte(strings.TrimSuffix(fileHeader.Filename, ext))) + ext
|
||||||
|
timestr := fmt.Sprintf("%d", time.Now().UnixMicro())
|
||||||
|
objectKey := time.Now().Format("2006-01-02") + "/" + timestr + "-" + filename
|
||||||
|
|
||||||
|
err := a.bucket.PutObject(objectKey, file)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", fmt.Errorf("上传阿里云OSS失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
url := a.config.BucketUrl + "/" + objectKey
|
||||||
|
return url, objectKey, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AliyunUploader) DeleteFile(ctx context.Context, key string) error {
|
||||||
|
return a.bucket.DeleteObject(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AliyunUploader) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {
|
||||||
|
return a.bucket.GetObject(key)
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/fileservice"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CachedUploader struct {
|
||||||
|
Uploader Uploader
|
||||||
|
Config *file.StorageConfigInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
uploaderCache sync.Map // map[string]*CachedUploader
|
||||||
|
cacheMutex sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
|
// OSSFactory 工厂结构体
|
||||||
|
type OSSFactory struct {
|
||||||
|
fileRpc fileservice.FileService
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOSSFactory(fileRpc fileservice.FileService) *OSSFactory {
|
||||||
|
return &OSSFactory{
|
||||||
|
fileRpc: fileRpc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetActiveUploader 获取当前激活的存储上传实例
|
||||||
|
func (f *OSSFactory) GetActiveUploader(ctx context.Context) (Uploader, error) {
|
||||||
|
resp, err := f.fileRpc.GetDefaultStorageConfig(ctx, &fileservice.GetDefaultStorageConfigReq{})
|
||||||
|
if err != nil || resp.Config == nil {
|
||||||
|
return nil, fmt.Errorf("未找到激活的存储配置: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
conf := resp.Config
|
||||||
|
|
||||||
|
// 1. 尝试从缓存获取
|
||||||
|
if cachedVal, ok := uploaderCache.Load(conf.Id); ok {
|
||||||
|
cachedItem := cachedVal.(*CachedUploader)
|
||||||
|
// 优雅之处:深度对比配置是否发生变化,完美支持前端动态修改配置后实时热加载
|
||||||
|
if reflect.DeepEqual(cachedItem.Config, conf) {
|
||||||
|
return cachedItem.Uploader, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 加锁防止高并发下的重复实例化
|
||||||
|
cacheMutex.Lock()
|
||||||
|
defer cacheMutex.Unlock()
|
||||||
|
|
||||||
|
// 3. Double-Check
|
||||||
|
if cachedVal, ok := uploaderCache.Load(conf.Id); ok {
|
||||||
|
cachedItem := cachedVal.(*CachedUploader)
|
||||||
|
if reflect.DeepEqual(cachedItem.Config, conf) {
|
||||||
|
return cachedItem.Uploader, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 实例化新的 Uploader
|
||||||
|
var uploader Uploader
|
||||||
|
switch conf.Type {
|
||||||
|
case "minio":
|
||||||
|
uploader, err = NewMinioUploader(conf)
|
||||||
|
case "aliyun":
|
||||||
|
uploader, err = NewAliyunUploader(conf)
|
||||||
|
case "tencent":
|
||||||
|
uploader, err = NewTencentUploader(conf)
|
||||||
|
case "qiniu":
|
||||||
|
uploader, err = NewQiniuUploader(conf)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("不支持的存储类型: %s", conf.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 更新缓存
|
||||||
|
uploaderCache.Store(conf.Id, &CachedUploader{
|
||||||
|
Uploader: uploader,
|
||||||
|
Config: conf,
|
||||||
|
})
|
||||||
|
|
||||||
|
return uploader, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/minio/minio-go/v7"
|
||||||
|
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/common/utils/hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MinioUploader struct {
|
||||||
|
client *minio.Client
|
||||||
|
config *file.StorageConfigInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMinioUploader(conf *file.StorageConfigInfo) (Uploader, error) {
|
||||||
|
// 判断如果是 https 或者是类似云服务,可以根据 endpoint 后缀猜测 secure
|
||||||
|
useSSL := strings.HasPrefix(conf.Endpoint, "https://") || strings.Contains(conf.Endpoint, "aliyuncs.com") || conf.Endpoint == "oss-cn-hangzhou.aliyuncs.com" // 这里只是示例
|
||||||
|
if strings.HasPrefix(conf.Endpoint, "http://") || strings.HasPrefix(conf.Endpoint, "https://") {
|
||||||
|
// 移除协议头给 minio 客户端
|
||||||
|
conf.Endpoint = strings.TrimPrefix(conf.Endpoint, "http://")
|
||||||
|
conf.Endpoint = strings.TrimPrefix(conf.Endpoint, "https://")
|
||||||
|
} else {
|
||||||
|
// 默认非 SSL
|
||||||
|
useSSL = false
|
||||||
|
}
|
||||||
|
|
||||||
|
client, err := minio.New(conf.Endpoint, &minio.Options{
|
||||||
|
Creds: credentials.NewStaticV4(conf.AccessKeyId, conf.AccessKeySecret, ""),
|
||||||
|
Secure: useSSL,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 这里可以加上检查 bucket
|
||||||
|
return &MinioUploader{
|
||||||
|
client: client,
|
||||||
|
config: conf,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MinioUploader) UploadFile(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (string, string, error) {
|
||||||
|
// 直接重置文件指针(保险起见)
|
||||||
|
file.Seek(0, 0)
|
||||||
|
|
||||||
|
ext := filepath.Ext(fileHeader.Filename)
|
||||||
|
filename := hash.MD5([]byte(strings.TrimSuffix(fileHeader.Filename, ext))) + ext
|
||||||
|
timestr := fmt.Sprintf("%d", time.Now().UnixMicro())
|
||||||
|
objectKey := time.Now().Format("2006-01-02") + "/" + timestr + "-" + filename
|
||||||
|
|
||||||
|
bucketName := m.config.BucketName
|
||||||
|
|
||||||
|
// 直接执行 PutObject(流式上传,不再全部读入内存)
|
||||||
|
info, err := m.client.PutObject(ctx, bucketName, objectKey, file, fileHeader.Size, minio.PutObjectOptions{
|
||||||
|
ContentType: "application/octet-stream",
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
// 如果是因为 bucket 不存在,则尝试创建并重试
|
||||||
|
if minio.ToErrorResponse(err).Code == "NoSuchBucket" {
|
||||||
|
m.client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
|
||||||
|
// 重置文件流位置,准备重试
|
||||||
|
file.Seek(0, 0)
|
||||||
|
info, err = m.client.PutObject(ctx, bucketName, objectKey, file, fileHeader.Size, minio.PutObjectOptions{
|
||||||
|
ContentType: "application/octet-stream",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", "", fmt.Errorf("上传Minio失败: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url := m.config.BucketUrl + "/" + info.Key
|
||||||
|
return url, info.Key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MinioUploader) DeleteFile(ctx context.Context, key string) error {
|
||||||
|
return m.client.RemoveObject(ctx, m.config.BucketName, key, minio.RemoveObjectOptions{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MinioUploader) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {
|
||||||
|
obj, err := m.client.GetObject(ctx, m.config.BucketName, key, minio.GetObjectOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/qiniu/go-sdk/v7/auth/qbox"
|
||||||
|
"github.com/qiniu/go-sdk/v7/storage"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/common/utils/hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
type QiniuUploader struct {
|
||||||
|
mac *qbox.Mac
|
||||||
|
config *file.StorageConfigInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQiniuUploader(conf *file.StorageConfigInfo) (Uploader, error) {
|
||||||
|
mac := qbox.NewMac(conf.AccessKeyId, conf.AccessKeySecret)
|
||||||
|
return &QiniuUploader{
|
||||||
|
mac: mac,
|
||||||
|
config: conf,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *QiniuUploader) UploadFile(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (string, string, error) {
|
||||||
|
ext := filepath.Ext(fileHeader.Filename)
|
||||||
|
filename := hash.MD5([]byte(strings.TrimSuffix(fileHeader.Filename, ext))) + ext
|
||||||
|
timestr := fmt.Sprintf("%d", time.Now().UnixMicro())
|
||||||
|
objectKey := time.Now().Format("2006-01-02") + "/" + timestr + "-" + filename
|
||||||
|
|
||||||
|
putPolicy := storage.PutPolicy{
|
||||||
|
Scope: q.config.BucketName,
|
||||||
|
}
|
||||||
|
upToken := putPolicy.UploadToken(q.mac)
|
||||||
|
|
||||||
|
cfg := storage.Config{}
|
||||||
|
// 根据配置中的 Region 判断
|
||||||
|
// 这里简单写死,如果要自适应可以根据 config.Region 给定
|
||||||
|
cfg.Zone = &storage.ZoneHuadong
|
||||||
|
cfg.UseHTTPS = false
|
||||||
|
cfg.UseCdnDomains = false
|
||||||
|
|
||||||
|
formUploader := storage.NewFormUploader(&cfg)
|
||||||
|
ret := storage.PutRet{}
|
||||||
|
|
||||||
|
err := formUploader.Put(ctx, &ret, upToken, objectKey, file, fileHeader.Size, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", fmt.Errorf("上传七牛云失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
url := q.config.BucketUrl + "/" + ret.Key
|
||||||
|
return url, ret.Key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *QiniuUploader) DeleteFile(ctx context.Context, key string) error {
|
||||||
|
cfg := storage.Config{}
|
||||||
|
cfg.Zone = &storage.ZoneHuadong
|
||||||
|
bucketManager := storage.NewBucketManager(q.mac, &cfg)
|
||||||
|
return bucketManager.Delete(q.config.BucketName, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *QiniuUploader) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {
|
||||||
|
mac := qbox.NewMac(q.config.AccessKeyId, q.config.AccessKeySecret)
|
||||||
|
domain := q.config.BucketUrl
|
||||||
|
deadline := time.Now().Add(time.Second * 3600).Unix() // 1小时有效期
|
||||||
|
privateAccessURL := storage.MakePrivateURL(mac, domain, key, deadline)
|
||||||
|
|
||||||
|
resp, err := http.Get(privateAccessURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
resp.Body.Close()
|
||||||
|
return nil, fmt.Errorf("qiniu download failed with status: %s", resp.Status)
|
||||||
|
}
|
||||||
|
return resp.Body, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/tencentyun/cos-go-sdk-v5"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/common/utils/hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TencentUploader struct {
|
||||||
|
client *cos.Client
|
||||||
|
config *file.StorageConfigInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTencentUploader(conf *file.StorageConfigInfo) (Uploader, error) {
|
||||||
|
// Endpoint should be something like https://bucket-appid.cos.ap-guangzhou.myqcloud.com
|
||||||
|
// But usually users just put bucket name and region, here we assume endpoint is full bucket url
|
||||||
|
// Or we use bucketUrl as the endpoint for client initialization if endpoint is not formatted well
|
||||||
|
u, err := url.Parse(conf.Endpoint)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("解析Endpoint失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b := &cos.BaseURL{BucketURL: u}
|
||||||
|
client := cos.NewClient(b, &http.Client{
|
||||||
|
Transport: &cos.AuthorizationTransport{
|
||||||
|
SecretID: conf.AccessKeyId,
|
||||||
|
SecretKey: conf.AccessKeySecret,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return &TencentUploader{
|
||||||
|
client: client,
|
||||||
|
config: conf,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TencentUploader) UploadFile(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (string, string, error) {
|
||||||
|
ext := filepath.Ext(fileHeader.Filename)
|
||||||
|
filename := hash.MD5([]byte(strings.TrimSuffix(fileHeader.Filename, ext))) + ext
|
||||||
|
timestr := fmt.Sprintf("%d", time.Now().UnixMicro())
|
||||||
|
objectKey := time.Now().Format("2006-01-02") + "/" + timestr + "-" + filename
|
||||||
|
|
||||||
|
_, err := t.client.Object.Put(ctx, objectKey, file, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", fmt.Errorf("上传腾讯云COS失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileUrl := t.config.BucketUrl + "/" + objectKey
|
||||||
|
return fileUrl, objectKey, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TencentUploader) DeleteFile(ctx context.Context, key string) error {
|
||||||
|
_, err := t.client.Object.Delete(ctx, key)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TencentUploader) DownloadFile(ctx context.Context, key string) (io.ReadCloser, error) {
|
||||||
|
resp, err := t.client.Object.Get(ctx, key, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp.Body, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package oss_core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io"
|
||||||
|
"mime/multipart"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Uploader 统一存储上传接口
|
||||||
|
type Uploader interface {
|
||||||
|
// UploadFile 接收文件流并上传,返回存储的具体url,标识key和可能的错误
|
||||||
|
UploadFile(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (url string, key string, err error)
|
||||||
|
// DeleteFile 删除远端存储的文件
|
||||||
|
DeleteFile(ctx context.Context, key string) error
|
||||||
|
// DownloadFile 获取文件下载的数据流
|
||||||
|
DownloadFile(ctx context.Context, key string) (io.ReadCloser, error)
|
||||||
|
}
|
||||||
@@ -3,6 +3,19 @@
|
|||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
type CreateStorageConfigReq struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region,optional"`
|
||||||
|
Status int `json:"status,optional"`
|
||||||
|
Remark string `json:"remark,optional"`
|
||||||
|
}
|
||||||
|
|
||||||
type FileIdReq struct {
|
type FileIdReq struct {
|
||||||
Id string `path:"id"`
|
Id string `path:"id"`
|
||||||
}
|
}
|
||||||
@@ -23,6 +36,56 @@ type FileListReq struct {
|
|||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FileListResp struct {
|
||||||
|
List []FileInfo `json:"list"`
|
||||||
|
Total int64 `json:"total"`
|
||||||
|
}
|
||||||
|
|
||||||
type IdsReq struct {
|
type IdsReq struct {
|
||||||
Ids []string `json:"ids"`
|
Ids []string `json:"ids"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SetDefaultStorageConfigReq struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StorageConfigInfo struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
IsDefault int `json:"isDefault"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StorageConfigListReq struct {
|
||||||
|
Current int `json:"current,optional"`
|
||||||
|
PageSize int `json:"pageSize,optional"`
|
||||||
|
Type string `json:"type,optional"`
|
||||||
|
Name string `json:"name,optional"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StorageConfigListResp struct {
|
||||||
|
List []StorageConfigInfo `json:"list"`
|
||||||
|
Total int64 `json:"total"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateStorageConfigReq struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
BucketUrl string `json:"bucketUrl"`
|
||||||
|
Region string `json:"region,optional"`
|
||||||
|
Status int `json:"status,optional"`
|
||||||
|
Remark string `json:"remark,optional"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sundynix-micro-go/common/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StorageConfig 动态存储配置表
|
||||||
|
type StorageConfig struct {
|
||||||
|
model.BaseModel
|
||||||
|
Type string `json:"type" gorm:"column:type;type:varchar(20);comment:存储类型(minio,aliyun,tencent,qiniu)"`
|
||||||
|
Name string `json:"name" gorm:"column:name;type:varchar(50);comment:配置名称"`
|
||||||
|
Endpoint string `json:"endpoint" gorm:"column:endpoint;type:varchar(100);comment:访问端点"`
|
||||||
|
AccessKeyId string `json:"accessKeyId" gorm:"column:access_key_id;type:varchar(100);comment:访问秘钥ID"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret" gorm:"column:access_key_secret;type:varchar(200);comment:访问秘钥"`
|
||||||
|
BucketName string `json:"bucketName" gorm:"column:bucket_name;type:varchar(50);comment:存储桶名称"`
|
||||||
|
BucketUrl string `json:"bucketUrl" gorm:"column:bucket_url;type:varchar(100);comment:绑定的外部访问域名"`
|
||||||
|
Region string `json:"region" gorm:"column:region;type:varchar(50);comment:地域节点"`
|
||||||
|
IsDefault int `json:"isDefault" gorm:"column:is_default;type:tinyint(1);default:0;comment:是否默认激活(1=是,0=否)"`
|
||||||
|
Status int `json:"status" gorm:"column:status;type:tinyint(1);default:1;comment:状态(1=启用,0=禁用)"`
|
||||||
|
Remark string `json:"remark" gorm:"column:remark;type:varchar(255);comment:备注"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableName 指定表名
|
||||||
|
func (StorageConfig) TableName() string {
|
||||||
|
return "sundynix_storage_config"
|
||||||
|
}
|
||||||
+1149
-21
File diff suppressed because it is too large
Load Diff
@@ -19,8 +19,18 @@ import (
|
|||||||
const _ = grpc.SupportPackageIsVersion9
|
const _ = grpc.SupportPackageIsVersion9
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FileService_GetFileById_FullMethodName = "/file.FileService/GetFileById"
|
FileService_GetFileById_FullMethodName = "/file.FileService/GetFileById"
|
||||||
FileService_GetFilesByIds_FullMethodName = "/file.FileService/GetFilesByIds"
|
FileService_GetFilesByIds_FullMethodName = "/file.FileService/GetFilesByIds"
|
||||||
|
FileService_CreateFile_FullMethodName = "/file.FileService/CreateFile"
|
||||||
|
FileService_CheckFileByMd5_FullMethodName = "/file.FileService/CheckFileByMd5"
|
||||||
|
FileService_DeleteFiles_FullMethodName = "/file.FileService/DeleteFiles"
|
||||||
|
FileService_GetFileList_FullMethodName = "/file.FileService/GetFileList"
|
||||||
|
FileService_CreateStorageConfig_FullMethodName = "/file.FileService/CreateStorageConfig"
|
||||||
|
FileService_UpdateStorageConfig_FullMethodName = "/file.FileService/UpdateStorageConfig"
|
||||||
|
FileService_DeleteStorageConfig_FullMethodName = "/file.FileService/DeleteStorageConfig"
|
||||||
|
FileService_SetDefaultStorageConfig_FullMethodName = "/file.FileService/SetDefaultStorageConfig"
|
||||||
|
FileService_GetStorageConfigList_FullMethodName = "/file.FileService/GetStorageConfigList"
|
||||||
|
FileService_GetDefaultStorageConfig_FullMethodName = "/file.FileService/GetDefaultStorageConfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FileServiceClient is the client API for FileService service.
|
// FileServiceClient is the client API for FileService service.
|
||||||
@@ -31,6 +41,21 @@ type FileServiceClient interface {
|
|||||||
GetFileById(ctx context.Context, in *GetFileByIdReq, opts ...grpc.CallOption) (*GetFileByIdResp, error)
|
GetFileById(ctx context.Context, in *GetFileByIdReq, opts ...grpc.CallOption) (*GetFileByIdResp, error)
|
||||||
// 根据ID列表批量获取文件信息
|
// 根据ID列表批量获取文件信息
|
||||||
GetFilesByIds(ctx context.Context, in *GetFilesByIdsReq, opts ...grpc.CallOption) (*GetFilesByIdsResp, error)
|
GetFilesByIds(ctx context.Context, in *GetFilesByIdsReq, opts ...grpc.CallOption) (*GetFilesByIdsResp, error)
|
||||||
|
// 创建文件记录
|
||||||
|
CreateFile(ctx context.Context, in *CreateFileReq, opts ...grpc.CallOption) (*CreateFileResp, error)
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
CheckFileByMd5(ctx context.Context, in *CheckFileByMd5Req, opts ...grpc.CallOption) (*CheckFileByMd5Resp, error)
|
||||||
|
// 删除文件记录
|
||||||
|
DeleteFiles(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
// 获取文件列表
|
||||||
|
GetFileList(ctx context.Context, in *GetFileListReq, opts ...grpc.CallOption) (*GetFileListResp, error)
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
CreateStorageConfig(ctx context.Context, in *CreateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
UpdateStorageConfig(ctx context.Context, in *UpdateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
DeleteStorageConfig(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
SetDefaultStorageConfig(ctx context.Context, in *SetDefaultStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
GetStorageConfigList(ctx context.Context, in *StorageConfigListReq, opts ...grpc.CallOption) (*StorageConfigListResp, error)
|
||||||
|
GetDefaultStorageConfig(ctx context.Context, in *GetDefaultStorageConfigReq, opts ...grpc.CallOption) (*GetDefaultStorageConfigResp, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileServiceClient struct {
|
type fileServiceClient struct {
|
||||||
@@ -61,6 +86,106 @@ func (c *fileServiceClient) GetFilesByIds(ctx context.Context, in *GetFilesByIds
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) CreateFile(ctx context.Context, in *CreateFileReq, opts ...grpc.CallOption) (*CreateFileResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CreateFileResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_CreateFile_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) CheckFileByMd5(ctx context.Context, in *CheckFileByMd5Req, opts ...grpc.CallOption) (*CheckFileByMd5Resp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CheckFileByMd5Resp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_CheckFileByMd5_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) DeleteFiles(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_DeleteFiles_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) GetFileList(ctx context.Context, in *GetFileListReq, opts ...grpc.CallOption) (*GetFileListResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(GetFileListResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_GetFileList_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) CreateStorageConfig(ctx context.Context, in *CreateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_CreateStorageConfig_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) UpdateStorageConfig(ctx context.Context, in *UpdateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_UpdateStorageConfig_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) DeleteStorageConfig(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_DeleteStorageConfig_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) SetDefaultStorageConfig(ctx context.Context, in *SetDefaultStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_SetDefaultStorageConfig_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) GetStorageConfigList(ctx context.Context, in *StorageConfigListReq, opts ...grpc.CallOption) (*StorageConfigListResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(StorageConfigListResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_GetStorageConfigList_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *fileServiceClient) GetDefaultStorageConfig(ctx context.Context, in *GetDefaultStorageConfigReq, opts ...grpc.CallOption) (*GetDefaultStorageConfigResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(GetDefaultStorageConfigResp)
|
||||||
|
err := c.cc.Invoke(ctx, FileService_GetDefaultStorageConfig_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
// FileServiceServer is the server API for FileService service.
|
// FileServiceServer is the server API for FileService service.
|
||||||
// All implementations must embed UnimplementedFileServiceServer
|
// All implementations must embed UnimplementedFileServiceServer
|
||||||
// for forward compatibility.
|
// for forward compatibility.
|
||||||
@@ -69,6 +194,21 @@ type FileServiceServer interface {
|
|||||||
GetFileById(context.Context, *GetFileByIdReq) (*GetFileByIdResp, error)
|
GetFileById(context.Context, *GetFileByIdReq) (*GetFileByIdResp, error)
|
||||||
// 根据ID列表批量获取文件信息
|
// 根据ID列表批量获取文件信息
|
||||||
GetFilesByIds(context.Context, *GetFilesByIdsReq) (*GetFilesByIdsResp, error)
|
GetFilesByIds(context.Context, *GetFilesByIdsReq) (*GetFilesByIdsResp, error)
|
||||||
|
// 创建文件记录
|
||||||
|
CreateFile(context.Context, *CreateFileReq) (*CreateFileResp, error)
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
CheckFileByMd5(context.Context, *CheckFileByMd5Req) (*CheckFileByMd5Resp, error)
|
||||||
|
// 删除文件记录
|
||||||
|
DeleteFiles(context.Context, *DeleteFilesReq) (*CommonResp, error)
|
||||||
|
// 获取文件列表
|
||||||
|
GetFileList(context.Context, *GetFileListReq) (*GetFileListResp, error)
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
CreateStorageConfig(context.Context, *CreateStorageConfigReq) (*CommonResp, error)
|
||||||
|
UpdateStorageConfig(context.Context, *UpdateStorageConfigReq) (*CommonResp, error)
|
||||||
|
DeleteStorageConfig(context.Context, *DeleteFilesReq) (*CommonResp, error)
|
||||||
|
SetDefaultStorageConfig(context.Context, *SetDefaultStorageConfigReq) (*CommonResp, error)
|
||||||
|
GetStorageConfigList(context.Context, *StorageConfigListReq) (*StorageConfigListResp, error)
|
||||||
|
GetDefaultStorageConfig(context.Context, *GetDefaultStorageConfigReq) (*GetDefaultStorageConfigResp, error)
|
||||||
mustEmbedUnimplementedFileServiceServer()
|
mustEmbedUnimplementedFileServiceServer()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +225,36 @@ func (UnimplementedFileServiceServer) GetFileById(context.Context, *GetFileByIdR
|
|||||||
func (UnimplementedFileServiceServer) GetFilesByIds(context.Context, *GetFilesByIdsReq) (*GetFilesByIdsResp, error) {
|
func (UnimplementedFileServiceServer) GetFilesByIds(context.Context, *GetFilesByIdsReq) (*GetFilesByIdsResp, error) {
|
||||||
return nil, status.Error(codes.Unimplemented, "method GetFilesByIds not implemented")
|
return nil, status.Error(codes.Unimplemented, "method GetFilesByIds not implemented")
|
||||||
}
|
}
|
||||||
|
func (UnimplementedFileServiceServer) CreateFile(context.Context, *CreateFileReq) (*CreateFileResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method CreateFile not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) CheckFileByMd5(context.Context, *CheckFileByMd5Req) (*CheckFileByMd5Resp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method CheckFileByMd5 not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) DeleteFiles(context.Context, *DeleteFilesReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method DeleteFiles not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) GetFileList(context.Context, *GetFileListReq) (*GetFileListResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method GetFileList not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) CreateStorageConfig(context.Context, *CreateStorageConfigReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method CreateStorageConfig not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) UpdateStorageConfig(context.Context, *UpdateStorageConfigReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method UpdateStorageConfig not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) DeleteStorageConfig(context.Context, *DeleteFilesReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method DeleteStorageConfig not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) SetDefaultStorageConfig(context.Context, *SetDefaultStorageConfigReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method SetDefaultStorageConfig not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) GetStorageConfigList(context.Context, *StorageConfigListReq) (*StorageConfigListResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method GetStorageConfigList not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedFileServiceServer) GetDefaultStorageConfig(context.Context, *GetDefaultStorageConfigReq) (*GetDefaultStorageConfigResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method GetDefaultStorageConfig not implemented")
|
||||||
|
}
|
||||||
func (UnimplementedFileServiceServer) mustEmbedUnimplementedFileServiceServer() {}
|
func (UnimplementedFileServiceServer) mustEmbedUnimplementedFileServiceServer() {}
|
||||||
func (UnimplementedFileServiceServer) testEmbeddedByValue() {}
|
func (UnimplementedFileServiceServer) testEmbeddedByValue() {}
|
||||||
|
|
||||||
@@ -142,6 +312,186 @@ func _FileService_GetFilesByIds_Handler(srv interface{}, ctx context.Context, de
|
|||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func _FileService_CreateFile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CreateFileReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).CreateFile(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_CreateFile_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).CreateFile(ctx, req.(*CreateFileReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_CheckFileByMd5_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CheckFileByMd5Req)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).CheckFileByMd5(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_CheckFileByMd5_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).CheckFileByMd5(ctx, req.(*CheckFileByMd5Req))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_DeleteFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(DeleteFilesReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).DeleteFiles(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_DeleteFiles_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).DeleteFiles(ctx, req.(*DeleteFilesReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_GetFileList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetFileListReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).GetFileList(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_GetFileList_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).GetFileList(ctx, req.(*GetFileListReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_CreateStorageConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CreateStorageConfigReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).CreateStorageConfig(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_CreateStorageConfig_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).CreateStorageConfig(ctx, req.(*CreateStorageConfigReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_UpdateStorageConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(UpdateStorageConfigReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).UpdateStorageConfig(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_UpdateStorageConfig_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).UpdateStorageConfig(ctx, req.(*UpdateStorageConfigReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_DeleteStorageConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(DeleteFilesReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).DeleteStorageConfig(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_DeleteStorageConfig_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).DeleteStorageConfig(ctx, req.(*DeleteFilesReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_SetDefaultStorageConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(SetDefaultStorageConfigReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).SetDefaultStorageConfig(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_SetDefaultStorageConfig_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).SetDefaultStorageConfig(ctx, req.(*SetDefaultStorageConfigReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_GetStorageConfigList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(StorageConfigListReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).GetStorageConfigList(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_GetStorageConfigList_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).GetStorageConfigList(ctx, req.(*StorageConfigListReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _FileService_GetDefaultStorageConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetDefaultStorageConfigReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(FileServiceServer).GetDefaultStorageConfig(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: FileService_GetDefaultStorageConfig_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(FileServiceServer).GetDefaultStorageConfig(ctx, req.(*GetDefaultStorageConfigReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
// FileService_ServiceDesc is the grpc.ServiceDesc for FileService service.
|
// FileService_ServiceDesc is the grpc.ServiceDesc for FileService service.
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
// It's only intended for direct use with grpc.RegisterService,
|
||||||
// and not to be introspected or modified (even as a copy)
|
// and not to be introspected or modified (even as a copy)
|
||||||
@@ -157,6 +507,46 @@ var FileService_ServiceDesc = grpc.ServiceDesc{
|
|||||||
MethodName: "GetFilesByIds",
|
MethodName: "GetFilesByIds",
|
||||||
Handler: _FileService_GetFilesByIds_Handler,
|
Handler: _FileService_GetFilesByIds_Handler,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MethodName: "CreateFile",
|
||||||
|
Handler: _FileService_CreateFile_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "CheckFileByMd5",
|
||||||
|
Handler: _FileService_CheckFileByMd5_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "DeleteFiles",
|
||||||
|
Handler: _FileService_DeleteFiles_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetFileList",
|
||||||
|
Handler: _FileService_GetFileList_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "CreateStorageConfig",
|
||||||
|
Handler: _FileService_CreateStorageConfig_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "UpdateStorageConfig",
|
||||||
|
Handler: _FileService_UpdateStorageConfig_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "DeleteStorageConfig",
|
||||||
|
Handler: _FileService_DeleteStorageConfig_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "SetDefaultStorageConfig",
|
||||||
|
Handler: _FileService_SetDefaultStorageConfig_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetStorageConfigList",
|
||||||
|
Handler: _FileService_GetStorageConfigList_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetDefaultStorageConfig",
|
||||||
|
Handler: _FileService_GetDefaultStorageConfig_Handler,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Streams: []grpc.StreamDesc{},
|
Streams: []grpc.StreamDesc{},
|
||||||
Metadata: "pb/file.proto",
|
Metadata: "pb/file.proto",
|
||||||
|
|||||||
@@ -14,18 +14,48 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
CommonResp = file.CommonResp
|
CheckFileByMd5Req = file.CheckFileByMd5Req
|
||||||
FileInfo = file.FileInfo
|
CheckFileByMd5Resp = file.CheckFileByMd5Resp
|
||||||
GetFileByIdReq = file.GetFileByIdReq
|
CommonResp = file.CommonResp
|
||||||
GetFileByIdResp = file.GetFileByIdResp
|
CreateFileReq = file.CreateFileReq
|
||||||
GetFilesByIdsReq = file.GetFilesByIdsReq
|
CreateFileResp = file.CreateFileResp
|
||||||
GetFilesByIdsResp = file.GetFilesByIdsResp
|
CreateStorageConfigReq = file.CreateStorageConfigReq
|
||||||
|
DeleteFilesReq = file.DeleteFilesReq
|
||||||
|
FileInfo = file.FileInfo
|
||||||
|
GetDefaultStorageConfigReq = file.GetDefaultStorageConfigReq
|
||||||
|
GetDefaultStorageConfigResp = file.GetDefaultStorageConfigResp
|
||||||
|
GetFileByIdReq = file.GetFileByIdReq
|
||||||
|
GetFileByIdResp = file.GetFileByIdResp
|
||||||
|
GetFileListReq = file.GetFileListReq
|
||||||
|
GetFileListResp = file.GetFileListResp
|
||||||
|
GetFilesByIdsReq = file.GetFilesByIdsReq
|
||||||
|
GetFilesByIdsResp = file.GetFilesByIdsResp
|
||||||
|
SetDefaultStorageConfigReq = file.SetDefaultStorageConfigReq
|
||||||
|
StorageConfigInfo = file.StorageConfigInfo
|
||||||
|
StorageConfigListReq = file.StorageConfigListReq
|
||||||
|
StorageConfigListResp = file.StorageConfigListResp
|
||||||
|
UpdateStorageConfigReq = file.UpdateStorageConfigReq
|
||||||
|
|
||||||
FileService interface {
|
FileService interface {
|
||||||
// 根据ID获取文件信息
|
// 根据ID获取文件信息
|
||||||
GetFileById(ctx context.Context, in *GetFileByIdReq, opts ...grpc.CallOption) (*GetFileByIdResp, error)
|
GetFileById(ctx context.Context, in *GetFileByIdReq, opts ...grpc.CallOption) (*GetFileByIdResp, error)
|
||||||
// 根据ID列表批量获取文件信息
|
// 根据ID列表批量获取文件信息
|
||||||
GetFilesByIds(ctx context.Context, in *GetFilesByIdsReq, opts ...grpc.CallOption) (*GetFilesByIdsResp, error)
|
GetFilesByIds(ctx context.Context, in *GetFilesByIdsReq, opts ...grpc.CallOption) (*GetFilesByIdsResp, error)
|
||||||
|
// 创建文件记录
|
||||||
|
CreateFile(ctx context.Context, in *CreateFileReq, opts ...grpc.CallOption) (*CreateFileResp, error)
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
CheckFileByMd5(ctx context.Context, in *CheckFileByMd5Req, opts ...grpc.CallOption) (*CheckFileByMd5Resp, error)
|
||||||
|
// 删除文件记录
|
||||||
|
DeleteFiles(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
// 获取文件列表
|
||||||
|
GetFileList(ctx context.Context, in *GetFileListReq, opts ...grpc.CallOption) (*GetFileListResp, error)
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
CreateStorageConfig(ctx context.Context, in *CreateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
UpdateStorageConfig(ctx context.Context, in *UpdateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
DeleteStorageConfig(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
SetDefaultStorageConfig(ctx context.Context, in *SetDefaultStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
GetStorageConfigList(ctx context.Context, in *StorageConfigListReq, opts ...grpc.CallOption) (*StorageConfigListResp, error)
|
||||||
|
GetDefaultStorageConfig(ctx context.Context, in *GetDefaultStorageConfigReq, opts ...grpc.CallOption) (*GetDefaultStorageConfigResp, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultFileService struct {
|
defaultFileService struct {
|
||||||
@@ -50,3 +80,58 @@ func (m *defaultFileService) GetFilesByIds(ctx context.Context, in *GetFilesById
|
|||||||
client := file.NewFileServiceClient(m.cli.Conn())
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
return client.GetFilesByIds(ctx, in, opts...)
|
return client.GetFilesByIds(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建文件记录
|
||||||
|
func (m *defaultFileService) CreateFile(ctx context.Context, in *CreateFileReq, opts ...grpc.CallOption) (*CreateFileResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.CreateFile(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
func (m *defaultFileService) CheckFileByMd5(ctx context.Context, in *CheckFileByMd5Req, opts ...grpc.CallOption) (*CheckFileByMd5Resp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.CheckFileByMd5(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除文件记录
|
||||||
|
func (m *defaultFileService) DeleteFiles(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.DeleteFiles(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件列表
|
||||||
|
func (m *defaultFileService) GetFileList(ctx context.Context, in *GetFileListReq, opts ...grpc.CallOption) (*GetFileListResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.GetFileList(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
func (m *defaultFileService) CreateStorageConfig(ctx context.Context, in *CreateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.CreateStorageConfig(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultFileService) UpdateStorageConfig(ctx context.Context, in *UpdateStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.UpdateStorageConfig(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultFileService) DeleteStorageConfig(ctx context.Context, in *DeleteFilesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.DeleteStorageConfig(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultFileService) SetDefaultStorageConfig(ctx context.Context, in *SetDefaultStorageConfigReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.SetDefaultStorageConfig(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultFileService) GetStorageConfigList(ctx context.Context, in *StorageConfigListReq, opts ...grpc.CallOption) (*StorageConfigListResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.GetStorageConfigList(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultFileService) GetDefaultStorageConfig(ctx context.Context, in *GetDefaultStorageConfigReq, opts ...grpc.CallOption) (*GetDefaultStorageConfigResp, error) {
|
||||||
|
client := file.NewFileServiceClient(m.cli.Conn())
|
||||||
|
return client.GetDefaultStorageConfig(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"errors"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CheckFileByMd5Logic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCheckFileByMd5Logic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckFileByMd5Logic {
|
||||||
|
return &CheckFileByMd5Logic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
func (l *CheckFileByMd5Logic) CheckFileByMd5(in *file.CheckFileByMd5Req) (*file.CheckFileByMd5Resp, error) {
|
||||||
|
if in.Md5 == "" {
|
||||||
|
return &file.CheckFileByMd5Resp{Exists: false}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var ossRecord model.SundynixOss
|
||||||
|
err := l.svcCtx.DB.Where("md5 = ?", in.Md5).First(&ossRecord).Error
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
return &file.CheckFileByMd5Resp{Exists: false}, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CheckFileByMd5Resp{
|
||||||
|
Exists: true,
|
||||||
|
File: &file.FileInfo{
|
||||||
|
Id: ossRecord.ID,
|
||||||
|
Name: ossRecord.Name,
|
||||||
|
Url: ossRecord.Url,
|
||||||
|
Tag: ossRecord.Tag,
|
||||||
|
Key: ossRecord.Key,
|
||||||
|
Suffix: ossRecord.Suffix,
|
||||||
|
Md5: ossRecord.MD5,
|
||||||
|
CreatedAt: ossRecord.CreatedAt.Unix(),
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateFileLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCreateFileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateFileLogic {
|
||||||
|
return &CreateFileLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建文件记录
|
||||||
|
func (l *CreateFileLogic) CreateFile(in *file.CreateFileReq) (*file.CreateFileResp, error) {
|
||||||
|
ossRecord := &model.SundynixOss{
|
||||||
|
Name: in.Name,
|
||||||
|
Url: in.Url,
|
||||||
|
Tag: in.Tag,
|
||||||
|
Key: in.Key,
|
||||||
|
Suffix: in.Suffix,
|
||||||
|
MD5: in.Md5,
|
||||||
|
}
|
||||||
|
|
||||||
|
err := l.svcCtx.DB.Create(ossRecord).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CreateFileResp{
|
||||||
|
File: &file.FileInfo{
|
||||||
|
Id: ossRecord.ID,
|
||||||
|
Name: ossRecord.Name,
|
||||||
|
Url: ossRecord.Url,
|
||||||
|
Tag: ossRecord.Tag,
|
||||||
|
Key: ossRecord.Key,
|
||||||
|
Suffix: ossRecord.Suffix,
|
||||||
|
Md5: ossRecord.MD5,
|
||||||
|
CreatedAt: ossRecord.CreatedAt.Unix(),
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateStorageConfigLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCreateStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateStorageConfigLogic {
|
||||||
|
return &CreateStorageConfigLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
func (l *CreateStorageConfigLogic) CreateStorageConfig(in *file.CreateStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
conf := &model.StorageConfig{
|
||||||
|
Type: in.Type,
|
||||||
|
Name: in.Name,
|
||||||
|
Endpoint: in.Endpoint,
|
||||||
|
AccessKeyId: in.AccessKeyId,
|
||||||
|
AccessKeySecret: in.AccessKeySecret,
|
||||||
|
BucketName: in.BucketName,
|
||||||
|
BucketUrl: in.BucketUrl,
|
||||||
|
Region: in.Region,
|
||||||
|
IsDefault: 0, // 默认不激活,除非通过 setDefault
|
||||||
|
Status: int(in.Status),
|
||||||
|
Remark: in.Remark,
|
||||||
|
}
|
||||||
|
|
||||||
|
err := l.svcCtx.DB.Create(conf).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CommonResp{Code: 0, Msg: "创建成功"}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteFilesLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeleteFilesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteFilesLogic {
|
||||||
|
return &DeleteFilesLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除文件记录
|
||||||
|
func (l *DeleteFilesLogic) DeleteFiles(in *file.DeleteFilesReq) (*file.CommonResp, error) {
|
||||||
|
if len(in.Ids) == 0 {
|
||||||
|
return &file.CommonResp{Code: 400, Msg: "ids不能为空"}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 这里的删除只删数据库记录,真实文件的删除由 file-api 在调用这个 RPC 之前处理
|
||||||
|
err := l.svcCtx.DB.Where("id IN ?", in.Ids).Delete(&model.SundynixOss{}).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CommonResp{Code: 0, Msg: "删除成功"}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteStorageConfigLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeleteStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteStorageConfigLogic {
|
||||||
|
return &DeleteStorageConfigLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *DeleteStorageConfigLogic) DeleteStorageConfig(in *file.DeleteFilesReq) (*file.CommonResp, error) {
|
||||||
|
if len(in.Ids) == 0 {
|
||||||
|
return &file.CommonResp{Code: 400, Msg: "ids不能为空"}, nil
|
||||||
|
}
|
||||||
|
err := l.svcCtx.DB.Where("id IN ?", in.Ids).Delete(&model.StorageConfig{}).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CommonResp{Code: 0, Msg: "删除成功"}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetDefaultStorageConfigLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetDefaultStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDefaultStorageConfigLogic {
|
||||||
|
return &GetDefaultStorageConfigLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetDefaultStorageConfigLogic) GetDefaultStorageConfig(in *file.GetDefaultStorageConfigReq) (*file.GetDefaultStorageConfigResp, error) {
|
||||||
|
conf := &model.StorageConfig{}
|
||||||
|
err := l.svcCtx.DB.Where("is_default = ?", 1).First(conf).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err // let the factory handle the error
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.GetDefaultStorageConfigResp{
|
||||||
|
Config: &file.StorageConfigInfo{
|
||||||
|
Id: conf.ID,
|
||||||
|
Type: conf.Type,
|
||||||
|
Name: conf.Name,
|
||||||
|
Endpoint: conf.Endpoint,
|
||||||
|
AccessKeyId: conf.AccessKeyId,
|
||||||
|
AccessKeySecret: conf.AccessKeySecret,
|
||||||
|
BucketName: conf.BucketName,
|
||||||
|
BucketUrl: conf.BucketUrl,
|
||||||
|
Region: conf.Region,
|
||||||
|
IsDefault: int32(conf.IsDefault),
|
||||||
|
Status: int32(conf.Status),
|
||||||
|
Remark: conf.Remark,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -3,14 +3,13 @@ package logic
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
fileModel "sundynix-micro-go/app/file/model"
|
|
||||||
"sundynix-micro-go/app/file/rpc/file"
|
|
||||||
"sundynix-micro-go/app/file/rpc/internal/svc"
|
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetFileByIdLogic struct {
|
type GetFileByIdLogic struct {
|
||||||
@@ -29,7 +28,7 @@ func NewGetFileByIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFi
|
|||||||
|
|
||||||
// 根据ID获取文件信息
|
// 根据ID获取文件信息
|
||||||
func (l *GetFileByIdLogic) GetFileById(in *file.GetFileByIdReq) (*file.GetFileByIdResp, error) {
|
func (l *GetFileByIdLogic) GetFileById(in *file.GetFileByIdReq) (*file.GetFileByIdResp, error) {
|
||||||
var oss fileModel.SundynixOss
|
var oss model.SundynixOss
|
||||||
err := l.svcCtx.DB.Where("id = ?", in.Id).First(&oss).Error
|
err := l.svcCtx.DB.Where("id = ?", in.Id).First(&oss).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == gorm.ErrRecordNotFound {
|
if err == gorm.ErrRecordNotFound {
|
||||||
@@ -44,7 +43,7 @@ func (l *GetFileByIdLogic) GetFileById(in *file.GetFileByIdReq) (*file.GetFileBy
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertOssToProto(oss *fileModel.SundynixOss) *file.FileInfo {
|
func convertOssToProto(oss *model.SundynixOss) *file.FileInfo {
|
||||||
return &file.FileInfo{
|
return &file.FileInfo{
|
||||||
Id: oss.ID,
|
Id: oss.ID,
|
||||||
Name: oss.Name,
|
Name: oss.Name,
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetFileListLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetFileListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFileListLogic {
|
||||||
|
return &GetFileListLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件列表
|
||||||
|
func (l *GetFileListLogic) GetFileList(in *file.GetFileListReq) (*file.GetFileListResp, error) {
|
||||||
|
var list []model.SundynixOss
|
||||||
|
var total int64
|
||||||
|
|
||||||
|
db := l.svcCtx.DB.Model(&model.SundynixOss{})
|
||||||
|
if in.Name != "" {
|
||||||
|
db = db.Where("name LIKE ?", "%"+in.Name+"%")
|
||||||
|
}
|
||||||
|
|
||||||
|
db.Count(&total)
|
||||||
|
|
||||||
|
if in.Current > 0 && in.PageSize > 0 {
|
||||||
|
offset := (in.Current - 1) * in.PageSize
|
||||||
|
db = db.Offset(int(offset)).Limit(int(in.PageSize))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.Find(&list).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var respList []*file.FileInfo
|
||||||
|
for _, item := range list {
|
||||||
|
respList = append(respList, &file.FileInfo{
|
||||||
|
Id: item.ID,
|
||||||
|
Name: item.Name,
|
||||||
|
Url: item.Url,
|
||||||
|
Tag: item.Tag,
|
||||||
|
Key: item.Key,
|
||||||
|
Suffix: item.Suffix,
|
||||||
|
Md5: item.MD5,
|
||||||
|
CreatedAt: item.CreatedAt.Unix(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.GetFileListResp{
|
||||||
|
List: respList,
|
||||||
|
Total: total,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -3,13 +3,12 @@ package logic
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
fileModel "sundynix-micro-go/app/file/model"
|
|
||||||
"sundynix-micro-go/app/file/rpc/file"
|
|
||||||
"sundynix-micro-go/app/file/rpc/internal/svc"
|
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetFilesByIdsLogic struct {
|
type GetFilesByIdsLogic struct {
|
||||||
@@ -32,7 +31,7 @@ func (l *GetFilesByIdsLogic) GetFilesByIds(in *file.GetFilesByIdsReq) (*file.Get
|
|||||||
return &file.GetFilesByIdsResp{Files: []*file.FileInfo{}}, nil
|
return &file.GetFilesByIdsResp{Files: []*file.FileInfo{}}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var ossList []fileModel.SundynixOss
|
var ossList []model.SundynixOss
|
||||||
err := l.svcCtx.DB.Where("id IN ?", in.Ids).Find(&ossList).Error
|
err := l.svcCtx.DB.Where("id IN ?", in.Ids).Find(&ossList).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Errorf("批量查询文件失败: %v", err)
|
l.Errorf("批量查询文件失败: %v", err)
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetStorageConfigListLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetStorageConfigListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetStorageConfigListLogic {
|
||||||
|
return &GetStorageConfigListLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetStorageConfigListLogic) GetStorageConfigList(in *file.StorageConfigListReq) (*file.StorageConfigListResp, error) {
|
||||||
|
var list []model.StorageConfig
|
||||||
|
var total int64
|
||||||
|
|
||||||
|
db := l.svcCtx.DB.Model(&model.StorageConfig{})
|
||||||
|
if in.Type != "" {
|
||||||
|
db = db.Where("type = ?", in.Type)
|
||||||
|
}
|
||||||
|
if in.Name != "" {
|
||||||
|
db = db.Where("name LIKE ?", "%"+in.Name+"%")
|
||||||
|
}
|
||||||
|
|
||||||
|
db.Count(&total)
|
||||||
|
|
||||||
|
if in.Current > 0 && in.PageSize > 0 {
|
||||||
|
offset := (in.Current - 1) * in.PageSize
|
||||||
|
db = db.Offset(int(offset)).Limit(int(in.PageSize))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.Find(&list).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var respList []*file.StorageConfigInfo
|
||||||
|
for _, item := range list {
|
||||||
|
respList = append(respList, &file.StorageConfigInfo{
|
||||||
|
Id: item.ID,
|
||||||
|
Type: item.Type,
|
||||||
|
Name: item.Name,
|
||||||
|
Endpoint: item.Endpoint,
|
||||||
|
AccessKeyId: item.AccessKeyId,
|
||||||
|
AccessKeySecret: item.AccessKeySecret,
|
||||||
|
BucketName: item.BucketName,
|
||||||
|
BucketUrl: item.BucketUrl,
|
||||||
|
Region: item.Region,
|
||||||
|
IsDefault: int32(item.IsDefault),
|
||||||
|
Status: int32(item.Status),
|
||||||
|
Remark: item.Remark,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.StorageConfigListResp{
|
||||||
|
List: respList,
|
||||||
|
Total: total,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SetDefaultStorageConfigLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSetDefaultStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetDefaultStorageConfigLogic {
|
||||||
|
return &SetDefaultStorageConfigLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SetDefaultStorageConfigLogic) SetDefaultStorageConfig(in *file.SetDefaultStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
tx := l.svcCtx.DB.Begin()
|
||||||
|
if err := tx.Model(&model.StorageConfig{}).Where("1 = 1").Update("is_default", 0).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := tx.Model(&model.StorageConfig{}).Where("id = ?", in.Id).Update("is_default", 1).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tx.Commit()
|
||||||
|
|
||||||
|
return &file.CommonResp{Code: 0, Msg: "设置成功"}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/file/model"
|
||||||
|
"sundynix-micro-go/app/file/rpc/file"
|
||||||
|
"sundynix-micro-go/app/file/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UpdateStorageConfigLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUpdateStorageConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateStorageConfigLogic {
|
||||||
|
return &UpdateStorageConfigLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *UpdateStorageConfigLogic) UpdateStorageConfig(in *file.UpdateStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
conf := &model.StorageConfig{}
|
||||||
|
if err := l.svcCtx.DB.Where("id = ?", in.Id).First(conf).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
conf.Type = in.Type
|
||||||
|
conf.Name = in.Name
|
||||||
|
conf.Endpoint = in.Endpoint
|
||||||
|
conf.AccessKeyId = in.AccessKeyId
|
||||||
|
conf.AccessKeySecret = in.AccessKeySecret
|
||||||
|
conf.BucketName = in.BucketName
|
||||||
|
conf.BucketUrl = in.BucketUrl
|
||||||
|
conf.Region = in.Region
|
||||||
|
conf.Status = int(in.Status)
|
||||||
|
conf.Remark = in.Remark
|
||||||
|
|
||||||
|
if err := l.svcCtx.DB.Save(conf).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &file.CommonResp{Code: 0, Msg: "更新成功"}, nil
|
||||||
|
}
|
||||||
@@ -34,3 +34,58 @@ func (s *FileServiceServer) GetFilesByIds(ctx context.Context, in *file.GetFiles
|
|||||||
l := logic.NewGetFilesByIdsLogic(ctx, s.svcCtx)
|
l := logic.NewGetFilesByIdsLogic(ctx, s.svcCtx)
|
||||||
return l.GetFilesByIds(in)
|
return l.GetFilesByIds(in)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建文件记录
|
||||||
|
func (s *FileServiceServer) CreateFile(ctx context.Context, in *file.CreateFileReq) (*file.CreateFileResp, error) {
|
||||||
|
l := logic.NewCreateFileLogic(ctx, s.svcCtx)
|
||||||
|
return l.CreateFile(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
func (s *FileServiceServer) CheckFileByMd5(ctx context.Context, in *file.CheckFileByMd5Req) (*file.CheckFileByMd5Resp, error) {
|
||||||
|
l := logic.NewCheckFileByMd5Logic(ctx, s.svcCtx)
|
||||||
|
return l.CheckFileByMd5(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除文件记录
|
||||||
|
func (s *FileServiceServer) DeleteFiles(ctx context.Context, in *file.DeleteFilesReq) (*file.CommonResp, error) {
|
||||||
|
l := logic.NewDeleteFilesLogic(ctx, s.svcCtx)
|
||||||
|
return l.DeleteFiles(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件列表
|
||||||
|
func (s *FileServiceServer) GetFileList(ctx context.Context, in *file.GetFileListReq) (*file.GetFileListResp, error) {
|
||||||
|
l := logic.NewGetFileListLogic(ctx, s.svcCtx)
|
||||||
|
return l.GetFileList(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
func (s *FileServiceServer) CreateStorageConfig(ctx context.Context, in *file.CreateStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
l := logic.NewCreateStorageConfigLogic(ctx, s.svcCtx)
|
||||||
|
return l.CreateStorageConfig(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FileServiceServer) UpdateStorageConfig(ctx context.Context, in *file.UpdateStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
l := logic.NewUpdateStorageConfigLogic(ctx, s.svcCtx)
|
||||||
|
return l.UpdateStorageConfig(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FileServiceServer) DeleteStorageConfig(ctx context.Context, in *file.DeleteFilesReq) (*file.CommonResp, error) {
|
||||||
|
l := logic.NewDeleteStorageConfigLogic(ctx, s.svcCtx)
|
||||||
|
return l.DeleteStorageConfig(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FileServiceServer) SetDefaultStorageConfig(ctx context.Context, in *file.SetDefaultStorageConfigReq) (*file.CommonResp, error) {
|
||||||
|
l := logic.NewSetDefaultStorageConfigLogic(ctx, s.svcCtx)
|
||||||
|
return l.SetDefaultStorageConfig(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FileServiceServer) GetStorageConfigList(ctx context.Context, in *file.StorageConfigListReq) (*file.StorageConfigListResp, error) {
|
||||||
|
l := logic.NewGetStorageConfigListLogic(ctx, s.svcCtx)
|
||||||
|
return l.GetStorageConfigList(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FileServiceServer) GetDefaultStorageConfig(ctx context.Context, in *file.GetDefaultStorageConfigReq) (*file.GetDefaultStorageConfigResp, error) {
|
||||||
|
l := logic.NewGetDefaultStorageConfigLogic(ctx, s.svcCtx)
|
||||||
|
return l.GetDefaultStorageConfig(in)
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,7 +25,10 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
// 自动迁移
|
// 自动迁移
|
||||||
if err := db.AutoMigrate(&fileModel.SundynixOss{}); err != nil {
|
if err := db.AutoMigrate(
|
||||||
|
&fileModel.SundynixOss{},
|
||||||
|
&fileModel.StorageConfig{},
|
||||||
|
); err != nil {
|
||||||
logx.Errorf("数据库迁移失败: %v", err)
|
logx.Errorf("数据库迁移失败: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,108 @@ message GetFilesByIdsResp {
|
|||||||
repeated FileInfo files = 1;
|
repeated FileInfo files = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
|
||||||
|
message StorageConfigInfo {
|
||||||
|
string id = 1;
|
||||||
|
string type = 2;
|
||||||
|
string name = 3;
|
||||||
|
string endpoint = 4;
|
||||||
|
string accessKeyId = 5;
|
||||||
|
string accessKeySecret = 6;
|
||||||
|
string bucketName = 7;
|
||||||
|
string bucketUrl = 8;
|
||||||
|
string region = 9;
|
||||||
|
int32 isDefault = 10;
|
||||||
|
int32 status = 11;
|
||||||
|
string remark = 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CreateStorageConfigReq {
|
||||||
|
string type = 1;
|
||||||
|
string name = 2;
|
||||||
|
string endpoint = 3;
|
||||||
|
string accessKeyId = 4;
|
||||||
|
string accessKeySecret = 5;
|
||||||
|
string bucketName = 6;
|
||||||
|
string bucketUrl = 7;
|
||||||
|
string region = 8;
|
||||||
|
int32 status = 9;
|
||||||
|
string remark = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UpdateStorageConfigReq {
|
||||||
|
string id = 1;
|
||||||
|
string type = 2;
|
||||||
|
string name = 3;
|
||||||
|
string endpoint = 4;
|
||||||
|
string accessKeyId = 5;
|
||||||
|
string accessKeySecret = 6;
|
||||||
|
string bucketName = 7;
|
||||||
|
string bucketUrl = 8;
|
||||||
|
string region = 9;
|
||||||
|
int32 status = 10;
|
||||||
|
string remark = 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SetDefaultStorageConfigReq {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message StorageConfigListReq {
|
||||||
|
int32 current = 1;
|
||||||
|
int32 pageSize = 2;
|
||||||
|
string type = 3;
|
||||||
|
string name = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message StorageConfigListResp {
|
||||||
|
repeated StorageConfigInfo list = 1;
|
||||||
|
int64 total = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetDefaultStorageConfigReq {}
|
||||||
|
message GetDefaultStorageConfigResp {
|
||||||
|
StorageConfigInfo config = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CreateFileReq {
|
||||||
|
string name = 1;
|
||||||
|
string url = 2;
|
||||||
|
string tag = 3;
|
||||||
|
string key = 4;
|
||||||
|
string suffix = 5;
|
||||||
|
string md5 = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CreateFileResp {
|
||||||
|
FileInfo file = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CheckFileByMd5Req {
|
||||||
|
string md5 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CheckFileByMd5Resp {
|
||||||
|
bool exists = 1;
|
||||||
|
FileInfo file = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DeleteFilesReq {
|
||||||
|
repeated string ids = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetFileListReq {
|
||||||
|
int32 current = 1;
|
||||||
|
int32 pageSize = 2;
|
||||||
|
string name = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetFileListResp {
|
||||||
|
repeated FileInfo list = 1;
|
||||||
|
int64 total = 2;
|
||||||
|
}
|
||||||
|
|
||||||
// ---------- 服务定义 ----------
|
// ---------- 服务定义 ----------
|
||||||
|
|
||||||
service FileService {
|
service FileService {
|
||||||
@@ -49,4 +151,20 @@ service FileService {
|
|||||||
rpc GetFileById(GetFileByIdReq) returns (GetFileByIdResp);
|
rpc GetFileById(GetFileByIdReq) returns (GetFileByIdResp);
|
||||||
// 根据ID列表批量获取文件信息
|
// 根据ID列表批量获取文件信息
|
||||||
rpc GetFilesByIds(GetFilesByIdsReq) returns (GetFilesByIdsResp);
|
rpc GetFilesByIds(GetFilesByIdsReq) returns (GetFilesByIdsResp);
|
||||||
|
// 创建文件记录
|
||||||
|
rpc CreateFile(CreateFileReq) returns (CreateFileResp);
|
||||||
|
// 通过MD5检查文件是否存在
|
||||||
|
rpc CheckFileByMd5(CheckFileByMd5Req) returns (CheckFileByMd5Resp);
|
||||||
|
// 删除文件记录
|
||||||
|
rpc DeleteFiles(DeleteFilesReq) returns (CommonResp);
|
||||||
|
// 获取文件列表
|
||||||
|
rpc GetFileList(GetFileListReq) returns (GetFileListResp);
|
||||||
|
|
||||||
|
// ---------- 存储配置 ----------
|
||||||
|
rpc CreateStorageConfig(CreateStorageConfigReq) returns (CommonResp);
|
||||||
|
rpc UpdateStorageConfig(UpdateStorageConfigReq) returns (CommonResp);
|
||||||
|
rpc DeleteStorageConfig(DeleteFilesReq) returns (CommonResp); // 复用idsReq
|
||||||
|
rpc SetDefaultStorageConfig(SetDefaultStorageConfigReq) returns (CommonResp);
|
||||||
|
rpc GetStorageConfigList(StorageConfigListReq) returns (StorageConfigListResp);
|
||||||
|
rpc GetDefaultStorageConfig(GetDefaultStorageConfigReq) returns (GetDefaultStorageConfigResp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package role
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/logic/role"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AssignRoleMenusHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.AssignRoleMenusReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
l := role.NewAssignRoleMenusLogic(r.Context(), svcCtx)
|
||||||
|
err := l.AssignRoleMenus(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.Ok(w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package role
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/logic/role"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 角色详情(含已授权菜单)
|
||||||
|
func GetRoleDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.IdQueryReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := role.NewGetRoleDetailLogic(r.Context(), svcCtx)
|
||||||
|
resp, err := l.GetRoleDetail(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, resp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -138,6 +138,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
|||||||
|
|
||||||
server.AddRoutes(
|
server.AddRoutes(
|
||||||
[]rest.Route{
|
[]rest.Route{
|
||||||
|
{
|
||||||
|
// 角色授权菜单
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/role/assignMenus",
|
||||||
|
Handler: role.AssignRoleMenusHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 创建角色
|
// 创建角色
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
@@ -150,6 +156,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
|||||||
Path: "/role/delete",
|
Path: "/role/delete",
|
||||||
Handler: role.DeleteRoleHandler(serverCtx),
|
Handler: role.DeleteRoleHandler(serverCtx),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// 角色详情(含已授权菜单)
|
||||||
|
Method: http.MethodGet,
|
||||||
|
Path: "/role/detail",
|
||||||
|
Handler: role.GetRoleDetailHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 角色列表
|
// 角色列表
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
@@ -169,6 +181,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
|||||||
|
|
||||||
server.AddRoutes(
|
server.AddRoutes(
|
||||||
[]rest.Route{
|
[]rest.Route{
|
||||||
|
{
|
||||||
|
// 用户授权角色
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Path: "/user/assignRoles",
|
||||||
|
Handler: user.AssignUserRolesHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 创建用户
|
// 创建用户
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
@@ -181,6 +199,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
|||||||
Path: "/user/delete",
|
Path: "/user/delete",
|
||||||
Handler: user.DeleteUserHandler(serverCtx),
|
Handler: user.DeleteUserHandler(serverCtx),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// 用户详情(含角色信息)
|
||||||
|
Method: http.MethodGet,
|
||||||
|
Path: "/user/detail",
|
||||||
|
Handler: user.GetUserDetailHandler(serverCtx),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// 用户列表
|
// 用户列表
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/logic/user"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AssignUserRolesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.AssignUserRolesReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
l := user.NewAssignUserRolesLogic(r.Context(), svcCtx)
|
||||||
|
err := l.AssignUserRoles(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.Ok(w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/logic/user"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 用户详情(含角色信息)
|
||||||
|
func GetUserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req types.IdQueryReq
|
||||||
|
if err := httpx.Parse(r, &req); err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := user.NewGetUserDetailLogic(r.Context(), svcCtx)
|
||||||
|
resp, err := l.GetUserDetail(&req)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(w, err.Error())
|
||||||
|
} else {
|
||||||
|
response.OkWithData(w, resp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package role
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AssignRoleMenusLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAssignRoleMenusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AssignRoleMenusLogic {
|
||||||
|
return &AssignRoleMenusLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *AssignRoleMenusLogic) AssignRoleMenus(req *types.AssignRoleMenusReq) error {
|
||||||
|
_, err := l.svcCtx.SystemRpc.AssignRoleMenus(l.ctx, &system.AssignRoleMenusReq{
|
||||||
|
RoleId: req.RoleId,
|
||||||
|
MenuIds: req.MenuIds,
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package role
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetRoleDetailLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 角色详情(含已授权菜单)
|
||||||
|
func NewGetRoleDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleDetailLogic {
|
||||||
|
return &GetRoleDetailLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetRoleDetailLogic) GetRoleDetail(req *types.IdQueryReq) (resp *types.RoleDetailResp, err error) {
|
||||||
|
rpcResp, err := l.svcCtx.SystemRpc.GetRoleDetail(l.ctx, &system.GetRoleDetailReq{
|
||||||
|
Id: req.Id,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.RoleDetailResp{
|
||||||
|
Id: rpcResp.Id,
|
||||||
|
Name: rpcResp.Name,
|
||||||
|
Code: rpcResp.Code,
|
||||||
|
Sort: int(rpcResp.Sort),
|
||||||
|
MenuIds: rpcResp.MenuIds,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@ func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Update
|
|||||||
|
|
||||||
func (l *UpdateRoleLogic) UpdateRole(req *types.RoleUpdateReq) error {
|
func (l *UpdateRoleLogic) UpdateRole(req *types.RoleUpdateReq) error {
|
||||||
_, err := l.svcCtx.SystemRpc.UpdateRole(l.ctx, &system.RoleUpdateReq{
|
_, err := l.svcCtx.SystemRpc.UpdateRole(l.ctx, &system.RoleUpdateReq{
|
||||||
Id: req.Id, Name: req.Name, Code: req.Code, Sort: int32(req.Sort), MenuIds: req.MenuIds,
|
Id: req.Id, Name: req.Name, Code: req.Code, Sort: int32(req.Sort),
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AssignUserRolesLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAssignUserRolesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AssignUserRolesLogic {
|
||||||
|
return &AssignUserRolesLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *AssignUserRolesLogic) AssignUserRoles(req *types.AssignUserRolesReq) error {
|
||||||
|
_, err := l.svcCtx.SystemRpc.AssignUserRoles(l.ctx, &system.AssignUserRolesReq{
|
||||||
|
UserId: req.UserId,
|
||||||
|
RoleIds: req.RoleIds,
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -21,11 +21,21 @@ func NewCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Create
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *CreateUserLogic) CreateUser(req *types.UserCreateReq) error {
|
func (l *CreateUserLogic) CreateUser(req *types.UserCreateReq) error {
|
||||||
_, err := l.svcCtx.SystemRpc.CreateUser(l.ctx, &system.CreateUserReq{
|
resp, err := l.svcCtx.SystemRpc.CreateUser(l.ctx, &system.CreateUserReq{
|
||||||
Name: req.Name,
|
Name: req.Name,
|
||||||
Account: req.Account,
|
Account: req.Account,
|
||||||
Password: req.Password,
|
Password: req.Password,
|
||||||
Phone: req.Phone,
|
Phone: req.Phone,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// 创建完成后立即绑定角色
|
||||||
|
if len(req.RoleIds) > 0 && resp != nil {
|
||||||
|
_, err = l.svcCtx.SystemRpc.AssignUserRoles(l.ctx, &system.AssignUserRolesReq{
|
||||||
|
UserId: resp.User.Id,
|
||||||
|
RoleIds: req.RoleIds,
|
||||||
|
})
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// Code scaffolded by goctl. Safe to edit.
|
||||||
|
// goctl 1.10.1
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"sundynix-micro-go/app/system/api/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/api/internal/types"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetUserDetailLogic struct {
|
||||||
|
logx.Logger
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户详情(含角色信息)
|
||||||
|
func NewGetUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserDetailLogic {
|
||||||
|
return &GetUserDetailLogic{
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetUserDetailLogic) GetUserDetail(req *types.IdQueryReq) (resp *types.UserDetailResp, err error) {
|
||||||
|
rpcResp, err := l.svcCtx.SystemRpc.GetUserDetail(l.ctx, &system.GetUserDetailReq{
|
||||||
|
Id: req.Id,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.UserDetailResp{
|
||||||
|
Id: rpcResp.Id,
|
||||||
|
Name: rpcResp.Name,
|
||||||
|
Account: rpcResp.Account,
|
||||||
|
NickName: rpcResp.NickName,
|
||||||
|
Phone: rpcResp.Phone,
|
||||||
|
RoleIds: rpcResp.RoleIds,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -32,6 +32,15 @@ func (l *GetUserListLogic) GetUserList(req *types.UserListReq) (resp interface{}
|
|||||||
}
|
}
|
||||||
var list []map[string]interface{}
|
var list []map[string]interface{}
|
||||||
for _, u := range rpcResp.List {
|
for _, u := range rpcResp.List {
|
||||||
|
var roles []map[string]interface{}
|
||||||
|
for _, r := range u.Roles {
|
||||||
|
roles = append(roles, map[string]interface{}{
|
||||||
|
"id": r.Id,
|
||||||
|
"name": r.Name,
|
||||||
|
"code": r.Code,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
list = append(list, map[string]interface{}{
|
list = append(list, map[string]interface{}{
|
||||||
"id": u.Id,
|
"id": u.Id,
|
||||||
"name": u.Name,
|
"name": u.Name,
|
||||||
@@ -40,6 +49,7 @@ func (l *GetUserListLogic) GetUserList(req *types.UserListReq) (resp interface{}
|
|||||||
"phone": u.Phone,
|
"phone": u.Phone,
|
||||||
"gender": u.Gender,
|
"gender": u.Gender,
|
||||||
"createdAt": u.CreatedAt,
|
"createdAt": u.CreatedAt,
|
||||||
|
"roles": roles,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return map[string]interface{}{"list": list, "total": rpcResp.Total}, nil
|
return map[string]interface{}{"list": list, "total": rpcResp.Total}, nil
|
||||||
|
|||||||
@@ -3,6 +3,16 @@
|
|||||||
|
|
||||||
package types
|
package types
|
||||||
|
|
||||||
|
type AssignRoleMenusReq struct {
|
||||||
|
RoleId string `json:"roleId"`
|
||||||
|
MenuIds []string `json:"menuIds"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssignUserRolesReq struct {
|
||||||
|
UserId string `json:"userId"`
|
||||||
|
RoleIds []string `json:"roleIds"`
|
||||||
|
}
|
||||||
|
|
||||||
type ClientListReq struct {
|
type ClientListReq struct {
|
||||||
Current int `json:"current,optional"`
|
Current int `json:"current,optional"`
|
||||||
PageSize int `json:"pageSize,optional"`
|
PageSize int `json:"pageSize,optional"`
|
||||||
@@ -49,6 +59,10 @@ type DictUpdateReq struct {
|
|||||||
Desc string `json:"desc,optional"`
|
Desc string `json:"desc,optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IdQueryReq struct {
|
||||||
|
Id string `form:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
type IdReq struct {
|
type IdReq struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
}
|
}
|
||||||
@@ -103,6 +117,14 @@ type ResetPasswordReq struct {
|
|||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RoleDetailResp struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
Sort int `json:"sort"`
|
||||||
|
MenuIds []string `json:"menuIds"`
|
||||||
|
}
|
||||||
|
|
||||||
type RoleListReq struct {
|
type RoleListReq struct {
|
||||||
Current int `json:"current,optional"`
|
Current int `json:"current,optional"`
|
||||||
PageSize int `json:"pageSize,optional"`
|
PageSize int `json:"pageSize,optional"`
|
||||||
@@ -117,11 +139,10 @@ type RoleReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RoleUpdateReq struct {
|
type RoleUpdateReq struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
Code string `json:"code,optional"`
|
Code string `json:"code,optional"`
|
||||||
Sort int `json:"sort,optional"`
|
Sort int `json:"sort,optional"`
|
||||||
MenuIds []string `json:"menuIds,optional"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserCreateReq struct {
|
type UserCreateReq struct {
|
||||||
@@ -133,6 +154,15 @@ type UserCreateReq struct {
|
|||||||
RoleIds []string `json:"roleIds,optional"`
|
RoleIds []string `json:"roleIds,optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UserDetailResp struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Account string `json:"account"`
|
||||||
|
NickName string `json:"nickName"`
|
||||||
|
Phone string `json:"phone"`
|
||||||
|
RoleIds []string `json:"roleIds"`
|
||||||
|
}
|
||||||
|
|
||||||
type UserListReq struct {
|
type UserListReq struct {
|
||||||
Current int `json:"current,optional"`
|
Current int `json:"current,optional"`
|
||||||
PageSize int `json:"pageSize,optional"`
|
PageSize int `json:"pageSize,optional"`
|
||||||
@@ -141,10 +171,9 @@ type UserListReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type UserUpdateReq struct {
|
type UserUpdateReq struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
Account string `json:"account,optional"`
|
Account string `json:"account,optional"`
|
||||||
Phone string `json:"phone,optional"`
|
Phone string `json:"phone,optional"`
|
||||||
NickName string `json:"nickName,optional"`
|
NickName string `json:"nickName,optional"`
|
||||||
RoleIds []string `json:"roleIds,optional"`
|
|
||||||
}
|
}
|
||||||
|
|||||||
+51
-11
@@ -12,6 +12,9 @@ type (
|
|||||||
IdReq {
|
IdReq {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
}
|
}
|
||||||
|
IdQueryReq {
|
||||||
|
Id string `form:"id"`
|
||||||
|
}
|
||||||
IdsReq {
|
IdsReq {
|
||||||
Ids []string `json:"ids"`
|
Ids []string `json:"ids"`
|
||||||
}
|
}
|
||||||
@@ -49,17 +52,27 @@ type (
|
|||||||
MenuIds []string `json:"menuIds,optional"`
|
MenuIds []string `json:"menuIds,optional"`
|
||||||
}
|
}
|
||||||
RoleUpdateReq {
|
RoleUpdateReq {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
Code string `json:"code,optional"`
|
Code string `json:"code,optional"`
|
||||||
Sort int `json:"sort,optional"`
|
Sort int `json:"sort,optional"`
|
||||||
MenuIds []string `json:"menuIds,optional"`
|
|
||||||
}
|
}
|
||||||
RoleListReq {
|
RoleListReq {
|
||||||
Current int `json:"current,optional"`
|
Current int `json:"current,optional"`
|
||||||
PageSize int `json:"pageSize,optional"`
|
PageSize int `json:"pageSize,optional"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
}
|
}
|
||||||
|
RoleDetailResp {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
Sort int `json:"sort"`
|
||||||
|
MenuIds []string `json:"menuIds"`
|
||||||
|
}
|
||||||
|
AssignRoleMenusReq {
|
||||||
|
RoleId string `json:"roleId"`
|
||||||
|
MenuIds []string `json:"menuIds"`
|
||||||
|
}
|
||||||
// ---------- 菜单 ----------
|
// ---------- 菜单 ----------
|
||||||
MenuReq {
|
MenuReq {
|
||||||
ParentId string `json:"parentId,optional"`
|
ParentId string `json:"parentId,optional"`
|
||||||
@@ -125,12 +138,11 @@ type (
|
|||||||
RoleIds []string `json:"roleIds,optional"`
|
RoleIds []string `json:"roleIds,optional"`
|
||||||
}
|
}
|
||||||
UserUpdateReq {
|
UserUpdateReq {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
Account string `json:"account,optional"`
|
Account string `json:"account,optional"`
|
||||||
Phone string `json:"phone,optional"`
|
Phone string `json:"phone,optional"`
|
||||||
NickName string `json:"nickName,optional"`
|
NickName string `json:"nickName,optional"`
|
||||||
RoleIds []string `json:"roleIds,optional"`
|
|
||||||
}
|
}
|
||||||
UserListReq {
|
UserListReq {
|
||||||
Current int `json:"current,optional"`
|
Current int `json:"current,optional"`
|
||||||
@@ -138,10 +150,22 @@ type (
|
|||||||
Name string `json:"name,optional"`
|
Name string `json:"name,optional"`
|
||||||
Account string `json:"account,optional"`
|
Account string `json:"account,optional"`
|
||||||
}
|
}
|
||||||
|
UserDetailResp {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Account string `json:"account"`
|
||||||
|
NickName string `json:"nickName"`
|
||||||
|
Phone string `json:"phone"`
|
||||||
|
RoleIds []string `json:"roleIds"`
|
||||||
|
}
|
||||||
ResetPasswordReq {
|
ResetPasswordReq {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
}
|
}
|
||||||
|
AssignUserRolesReq {
|
||||||
|
UserId string `json:"userId"`
|
||||||
|
RoleIds []string `json:"roleIds"`
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// ========== 需要鉴权的接口 ==========
|
// ========== 需要鉴权的接口 ==========
|
||||||
@@ -189,6 +213,14 @@ service system-api {
|
|||||||
@doc "角色列表"
|
@doc "角色列表"
|
||||||
@handler GetRoleList
|
@handler GetRoleList
|
||||||
post /role/list (RoleListReq)
|
post /role/list (RoleListReq)
|
||||||
|
|
||||||
|
@doc "角色详情(含已授权菜单)"
|
||||||
|
@handler GetRoleDetail
|
||||||
|
get /role/detail (IdQueryReq) returns (RoleDetailResp)
|
||||||
|
|
||||||
|
@doc "角色授权菜单"
|
||||||
|
@handler AssignRoleMenus
|
||||||
|
post /role/assignMenus (AssignRoleMenusReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
@server (
|
@server (
|
||||||
@@ -266,6 +298,10 @@ service system-api {
|
|||||||
@handler GetUserList
|
@handler GetUserList
|
||||||
post /user/list (UserListReq)
|
post /user/list (UserListReq)
|
||||||
|
|
||||||
|
@doc "用户详情(含角色信息)"
|
||||||
|
@handler GetUserDetail
|
||||||
|
get /user/detail (IdQueryReq) returns (UserDetailResp)
|
||||||
|
|
||||||
@doc "创建用户"
|
@doc "创建用户"
|
||||||
@handler CreateUser
|
@handler CreateUser
|
||||||
post /user/create (UserCreateReq)
|
post /user/create (UserCreateReq)
|
||||||
@@ -281,5 +317,9 @@ service system-api {
|
|||||||
@doc "重置密码"
|
@doc "重置密码"
|
||||||
@handler ResetPassword
|
@handler ResetPassword
|
||||||
post /user/resetPassword (ResetPasswordReq)
|
post /user/resetPassword (ResetPasswordReq)
|
||||||
|
|
||||||
|
@doc "用户授权角色"
|
||||||
|
@handler AssignUserRoles
|
||||||
|
post /user/assignRoles (AssignUserRolesReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ type SundynixRole struct {
|
|||||||
Name string `gorm:"size:20;column:name" json:"name"`
|
Name string `gorm:"size:20;column:name" json:"name"`
|
||||||
Code string `gorm:"size:20;column:code" json:"code"`
|
Code string `gorm:"size:20;column:code" json:"code"`
|
||||||
Sort int `gorm:"column:sort" json:"sort"`
|
Sort int `gorm:"column:sort" json:"sort"`
|
||||||
Menus []*SundynixMenu `gorm:"many2many:sundynix_role_menu;" json:"menus"`
|
Menus []*SundynixMenu `gorm:"many2many:sundynix_role_menu;joinForeignKey:role_id;joinReferences:menu_id" json:"menus"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (SundynixRole) TableName() string {
|
func (SundynixRole) TableName() string {
|
||||||
@@ -114,6 +114,8 @@ type SundynixUser struct {
|
|||||||
Gender int `gorm:"default:0;column:gender" json:"gender"`
|
Gender int `gorm:"default:0;column:gender" json:"gender"`
|
||||||
LastLoginIP string `gorm:"size:20;column:last_login_ip" json:"lastLoginIp"`
|
LastLoginIP string `gorm:"size:20;column:last_login_ip" json:"lastLoginIp"`
|
||||||
LastLoginAt *time.Time `gorm:"column:last_login_at" json:"lastLoginAt"`
|
LastLoginAt *time.Time `gorm:"column:last_login_at" json:"lastLoginAt"`
|
||||||
|
|
||||||
|
Roles []*SundynixRole `gorm:"many2many:sundynix_user_role;joinForeignKey:user_id;joinReferences:role_id" json:"roles"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (SundynixUser) TableName() string {
|
func (SundynixUser) TableName() string {
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
sysModel "sundynix-micro-go/app/system/model"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AssignRoleMenusLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAssignRoleMenusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AssignRoleMenusLogic {
|
||||||
|
return &AssignRoleMenusLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssignRoleMenus 给角色授权菜单(全量替换)
|
||||||
|
func (l *AssignRoleMenusLogic) AssignRoleMenus(in *system.AssignRoleMenusReq) (*system.CommonResp, error) {
|
||||||
|
err := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
||||||
|
// 先清除旧的菜单关联
|
||||||
|
if err := tx.Where("role_id = ?", in.RoleId).Delete(&sysModel.SundynixRoleMenu{}).Error; err != nil {
|
||||||
|
return fmt.Errorf("清除菜单关联失败: %w", err)
|
||||||
|
}
|
||||||
|
// 重新批量写入
|
||||||
|
for _, mid := range in.MenuIds {
|
||||||
|
if err := tx.Create(&sysModel.SundynixRoleMenu{RoleID: in.RoleId, MenuID: mid}).Error; err != nil {
|
||||||
|
return fmt.Errorf("关联菜单失败: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &system.CommonResp{Code: 200, Msg: "success"}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
sysModel "sundynix-micro-go/app/system/model"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AssignUserRolesLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAssignUserRolesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AssignUserRolesLogic {
|
||||||
|
return &AssignUserRolesLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssignUserRoles 给用户授权角色(全量替换)
|
||||||
|
func (l *AssignUserRolesLogic) AssignUserRoles(in *system.AssignUserRolesReq) (*system.CommonResp, error) {
|
||||||
|
err := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
||||||
|
// 先清除旧的角色关联
|
||||||
|
if err := tx.Where("user_id = ?", in.UserId).Delete(&sysModel.SundynixUserRole{}).Error; err != nil {
|
||||||
|
return fmt.Errorf("清除角色关联失败: %w", err)
|
||||||
|
}
|
||||||
|
// 重新批量写入
|
||||||
|
for _, rid := range in.RoleIds {
|
||||||
|
if err := tx.Create(&sysModel.SundynixUserRole{UserID: in.UserId, RoleID: rid}).Error; err != nil {
|
||||||
|
return fmt.Errorf("关联角色失败: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &system.CommonResp{Code: 200, Msg: "success"}, nil
|
||||||
|
}
|
||||||
@@ -28,7 +28,6 @@ func (l *CreateRoleLogic) CreateRole(in *system.RoleReq) (*system.CommonResp, er
|
|||||||
if err := tx.Create(&role).Error; err != nil {
|
if err := tx.Create(&role).Error; err != nil {
|
||||||
return fmt.Errorf("创建角色失败: %w", err)
|
return fmt.Errorf("创建角色失败: %w", err)
|
||||||
}
|
}
|
||||||
// 关联菜单
|
|
||||||
for _, mid := range in.MenuIds {
|
for _, mid := range in.MenuIds {
|
||||||
if err := tx.Create(&sysModel.SundynixRoleMenu{RoleID: role.ID, MenuID: mid}).Error; err != nil {
|
if err := tx.Create(&sysModel.SundynixRoleMenu{RoleID: role.ID, MenuID: mid}).Error; err != nil {
|
||||||
return fmt.Errorf("关联菜单失败: %w", err)
|
return fmt.Errorf("关联菜单失败: %w", err)
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
sysModel "sundynix-micro-go/app/system/model"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetRoleDetailLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetRoleDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleDetailLogic {
|
||||||
|
return &GetRoleDetailLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetRoleDetailLogic) GetRoleDetail(in *system.GetRoleDetailReq) (*system.RoleDetailResp, error) {
|
||||||
|
var role sysModel.SundynixRole
|
||||||
|
if err := l.svcCtx.DB.Preload("Menus").Where("id = ?", in.Id).First(&role).Error; err != nil {
|
||||||
|
return nil, fmt.Errorf("获取角色详情失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var menuIds []string
|
||||||
|
for _, menu := range role.Menus {
|
||||||
|
menuIds = append(menuIds, menu.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &system.RoleDetailResp{
|
||||||
|
Id: role.ID,
|
||||||
|
Name: role.Name,
|
||||||
|
Code: role.Code,
|
||||||
|
Sort: int32(role.Sort),
|
||||||
|
MenuIds: menuIds,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -39,7 +39,13 @@ func (l *GetRoleListLogic) GetRoleList(in *system.RoleListReq) (*system.RoleList
|
|||||||
}
|
}
|
||||||
var items []*system.RoleInfo
|
var items []*system.RoleInfo
|
||||||
for _, r := range list {
|
for _, r := range list {
|
||||||
items = append(items, &system.RoleInfo{Id: r.ID, Name: r.Name, Code: r.Code, Sort: int32(r.Sort)})
|
items = append(items, &system.RoleInfo{
|
||||||
|
Id: r.ID,
|
||||||
|
Name: r.Name,
|
||||||
|
Code: r.Code,
|
||||||
|
Sort: int32(r.Sort),
|
||||||
|
CreatedAt: r.CreatedAt.Unix(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return &system.RoleListResp{List: items, Total: total}, nil
|
return &system.RoleListResp{List: items, Total: total}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
sysModel "sundynix-micro-go/app/system/model"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GetUserDetailLogic struct {
|
||||||
|
ctx context.Context
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
logx.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGetUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserDetailLogic {
|
||||||
|
return &GetUserDetailLogic{
|
||||||
|
ctx: ctx,
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
Logger: logx.WithContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *GetUserDetailLogic) GetUserDetail(in *system.GetUserDetailReq) (*system.UserDetailResp, error) {
|
||||||
|
var user sysModel.SundynixUser
|
||||||
|
if err := l.svcCtx.DB.Preload("Roles").Where("id = ?", in.Id).First(&user).Error; err != nil {
|
||||||
|
return nil, fmt.Errorf("获取用户详情失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var roleIds []string
|
||||||
|
for _, role := range user.Roles {
|
||||||
|
roleIds = append(roleIds, role.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &system.UserDetailResp{
|
||||||
|
Id: user.ID,
|
||||||
|
Name: user.Name,
|
||||||
|
Account: user.Account,
|
||||||
|
NickName: user.NickName,
|
||||||
|
Phone: user.Phone,
|
||||||
|
RoleIds: roleIds,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -41,7 +41,7 @@ func (l *GetUserListLogic) GetUserList(in *system.GetUserListReq) (*system.GetUs
|
|||||||
if current <= 0 {
|
if current <= 0 {
|
||||||
current = 1
|
current = 1
|
||||||
}
|
}
|
||||||
db.Offset((current - 1) * pageSize).Limit(pageSize).Order("created_at DESC").Find(&list)
|
db.Preload("Roles").Offset((current - 1) * pageSize).Limit(pageSize).Order("created_at DESC").Find(&list)
|
||||||
|
|
||||||
var protoList []*system.UserInfo
|
var protoList []*system.UserInfo
|
||||||
for _, u := range list {
|
for _, u := range list {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"sundynix-micro-go/app/system/rpc/system"
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdateRoleLogic struct {
|
type UpdateRoleLogic struct {
|
||||||
@@ -23,26 +22,10 @@ func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Update
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *UpdateRoleLogic) UpdateRole(in *system.RoleUpdateReq) (*system.CommonResp, error) {
|
func (l *UpdateRoleLogic) UpdateRole(in *system.RoleUpdateReq) (*system.CommonResp, error) {
|
||||||
err := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
if err := l.svcCtx.DB.Model(&sysModel.SundynixRole{}).Where("id = ?", in.Id).Updates(map[string]interface{}{
|
||||||
if err := tx.Model(&sysModel.SundynixRole{}).Where("id = ?", in.Id).Updates(map[string]interface{}{
|
"name": in.Name, "code": in.Code, "sort": in.Sort,
|
||||||
"name": in.Name, "code": in.Code, "sort": in.Sort,
|
}).Error; err != nil {
|
||||||
}).Error; err != nil {
|
return nil, fmt.Errorf("更新角色失败: %w", err)
|
||||||
return fmt.Errorf("更新角色失败: %w", err)
|
|
||||||
}
|
|
||||||
// 先删除旧的菜单关联
|
|
||||||
if err := tx.Where("role_id = ?", in.Id).Delete(&sysModel.SundynixRoleMenu{}).Error; err != nil {
|
|
||||||
return fmt.Errorf("清除菜单关联失败: %w", err)
|
|
||||||
}
|
|
||||||
// 重新关联菜单
|
|
||||||
for _, mid := range in.MenuIds {
|
|
||||||
if err := tx.Create(&sysModel.SundynixRoleMenu{RoleID: in.Id, MenuID: mid}).Error; err != nil {
|
|
||||||
return fmt.Errorf("关联菜单失败: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return &system.CommonResp{Code: 200, Msg: "success"}, nil
|
return &system.CommonResp{Code: 200, Msg: "success"}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,5 +27,15 @@ func convertUserToProto(u *sysModel.SundynixUser) *system.UserInfo {
|
|||||||
if u.LastLoginAt != nil {
|
if u.LastLoginAt != nil {
|
||||||
info.LastLoginAt = u.LastLoginAt.Unix()
|
info.LastLoginAt = u.LastLoginAt.Unix()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, r := range u.Roles {
|
||||||
|
info.Roles = append(info.Roles, &system.RoleInfo{
|
||||||
|
Id: r.ID,
|
||||||
|
Name: r.Name,
|
||||||
|
Code: r.Code,
|
||||||
|
Sort: int32(r.Sort),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,11 @@ func (s *SystemServiceServer) GetUserList(ctx context.Context, in *system.GetUse
|
|||||||
return l.GetUserList(in)
|
return l.GetUserList(in)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SystemServiceServer) GetUserDetail(ctx context.Context, in *system.GetUserDetailReq) (*system.UserDetailResp, error) {
|
||||||
|
l := logic.NewGetUserDetailLogic(ctx, s.svcCtx)
|
||||||
|
return l.GetUserDetail(in)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SystemServiceServer) DeleteUser(ctx context.Context, in *system.DeleteUserReq) (*system.CommonResp, error) {
|
func (s *SystemServiceServer) DeleteUser(ctx context.Context, in *system.DeleteUserReq) (*system.CommonResp, error) {
|
||||||
l := logic.NewDeleteUserLogic(ctx, s.svcCtx)
|
l := logic.NewDeleteUserLogic(ctx, s.svcCtx)
|
||||||
return l.DeleteUser(in)
|
return l.DeleteUser(in)
|
||||||
@@ -90,6 +95,22 @@ func (s *SystemServiceServer) GetRoleList(ctx context.Context, in *system.RoleLi
|
|||||||
return l.GetRoleList(in)
|
return l.GetRoleList(in)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SystemServiceServer) GetRoleDetail(ctx context.Context, in *system.GetRoleDetailReq) (*system.RoleDetailResp, error) {
|
||||||
|
l := logic.NewGetRoleDetailLogic(ctx, s.svcCtx)
|
||||||
|
return l.GetRoleDetail(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SystemServiceServer) AssignRoleMenus(ctx context.Context, in *system.AssignRoleMenusReq) (*system.CommonResp, error) {
|
||||||
|
l := logic.NewAssignRoleMenusLogic(ctx, s.svcCtx)
|
||||||
|
return l.AssignRoleMenus(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
func (s *SystemServiceServer) AssignUserRoles(ctx context.Context, in *system.AssignUserRolesReq) (*system.CommonResp, error) {
|
||||||
|
l := logic.NewAssignUserRolesLogic(ctx, s.svcCtx)
|
||||||
|
return l.AssignUserRoles(in)
|
||||||
|
}
|
||||||
|
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
func (s *SystemServiceServer) GetMenusByRoleId(ctx context.Context, in *system.GetMenusByRoleIdReq) (*system.GetMenusByRoleIdResp, error) {
|
func (s *SystemServiceServer) GetMenusByRoleId(ctx context.Context, in *system.GetMenusByRoleIdReq) (*system.GetMenusByRoleIdResp, error) {
|
||||||
l := logic.NewGetMenusByRoleIdLogic(ctx, s.svcCtx)
|
l := logic.NewGetMenusByRoleIdLogic(ctx, s.svcCtx)
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package task
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CleanOperLogJob 定义清理操作日志的定时任务
|
||||||
|
type CleanOperLogJob struct {
|
||||||
|
svcCtx *svc.ServiceContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCleanOperLogJob(svcCtx *svc.ServiceContext) *CleanOperLogJob {
|
||||||
|
return &CleanOperLogJob{
|
||||||
|
svcCtx: svcCtx,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (j *CleanOperLogJob) Run() {
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
logx.WithContext(ctx).Infof("[CRON] 开始执行定时清理操作日志任务")
|
||||||
|
|
||||||
|
// 删除 3 天前的日志
|
||||||
|
threeDaysAgo := time.Now().AddDate(0, 0, -3)
|
||||||
|
|
||||||
|
// 执行硬删除
|
||||||
|
res := j.svcCtx.DB.WithContext(ctx).Exec("DELETE FROM sundynix_operation_record WHERE created_at < ?", threeDaysAgo)
|
||||||
|
if res.Error != nil {
|
||||||
|
logx.WithContext(ctx).Errorf("[CRON] 清理操作日志失败: %v", res.Error)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logx.WithContext(ctx).Infof("[CRON] 定时清理操作日志完成,共删除了 %d 条数据", res.RowsAffected)
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ message RoleInfo {
|
|||||||
string code = 3;
|
string code = 3;
|
||||||
int32 sort = 4;
|
int32 sort = 4;
|
||||||
repeated string menuIds = 5;
|
repeated string menuIds = 5;
|
||||||
|
int64 createdAt = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RoleReq {
|
message RoleReq {
|
||||||
@@ -41,7 +42,17 @@ message RoleUpdateReq {
|
|||||||
string name = 2;
|
string name = 2;
|
||||||
string code = 3;
|
string code = 3;
|
||||||
int32 sort = 4;
|
int32 sort = 4;
|
||||||
repeated string menuIds = 5;
|
}
|
||||||
|
|
||||||
|
// RBAC 授权
|
||||||
|
message AssignRoleMenusReq {
|
||||||
|
string roleId = 1;
|
||||||
|
repeated string menuIds = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AssignUserRolesReq {
|
||||||
|
string userId = 1;
|
||||||
|
repeated string roleIds = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RoleListReq {
|
message RoleListReq {
|
||||||
@@ -55,6 +66,18 @@ message RoleListResp {
|
|||||||
int64 total = 2;
|
int64 total = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetRoleDetailReq {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RoleDetailResp {
|
||||||
|
string id = 1;
|
||||||
|
string name = 2;
|
||||||
|
string code = 3;
|
||||||
|
int32 sort = 4;
|
||||||
|
repeated string menuIds = 5;
|
||||||
|
}
|
||||||
|
|
||||||
// ========== 菜单 ==========
|
// ========== 菜单 ==========
|
||||||
|
|
||||||
message MenuInfo {
|
message MenuInfo {
|
||||||
@@ -253,6 +276,7 @@ message UserInfo {
|
|||||||
int64 createdAt = 22;
|
int64 createdAt = 22;
|
||||||
int64 updatedAt = 23;
|
int64 updatedAt = 23;
|
||||||
string avatarUrl = 24;
|
string avatarUrl = 24;
|
||||||
|
repeated RoleInfo roles = 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
message GetUserByIdReq {
|
message GetUserByIdReq {
|
||||||
@@ -315,6 +339,19 @@ message GetUserListResp {
|
|||||||
int64 total = 2;
|
int64 total = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetUserDetailReq {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UserDetailResp {
|
||||||
|
string id = 1;
|
||||||
|
string name = 2;
|
||||||
|
string account = 3;
|
||||||
|
string nickName = 4;
|
||||||
|
string phone = 5;
|
||||||
|
repeated string roleIds = 6;
|
||||||
|
}
|
||||||
|
|
||||||
message DeleteUserReq {
|
message DeleteUserReq {
|
||||||
repeated string ids = 1;
|
repeated string ids = 1;
|
||||||
}
|
}
|
||||||
@@ -360,6 +397,7 @@ service SystemService {
|
|||||||
rpc CreateUser(CreateUserReq) returns (CreateUserResp);
|
rpc CreateUser(CreateUserReq) returns (CreateUserResp);
|
||||||
rpc UpdateUser(UpdateUserReq) returns (CommonResp);
|
rpc UpdateUser(UpdateUserReq) returns (CommonResp);
|
||||||
rpc GetUserList(GetUserListReq) returns (GetUserListResp);
|
rpc GetUserList(GetUserListReq) returns (GetUserListResp);
|
||||||
|
rpc GetUserDetail(GetUserDetailReq) returns (UserDetailResp);
|
||||||
rpc DeleteUser(DeleteUserReq) returns (CommonResp);
|
rpc DeleteUser(DeleteUserReq) returns (CommonResp);
|
||||||
rpc ResetPassword(ResetPasswordReq) returns (CommonResp);
|
rpc ResetPassword(ResetPasswordReq) returns (CommonResp);
|
||||||
|
|
||||||
@@ -369,6 +407,11 @@ service SystemService {
|
|||||||
rpc UpdateRole(RoleUpdateReq) returns (CommonResp);
|
rpc UpdateRole(RoleUpdateReq) returns (CommonResp);
|
||||||
rpc DeleteRole(IdsReq) returns (CommonResp);
|
rpc DeleteRole(IdsReq) returns (CommonResp);
|
||||||
rpc GetRoleList(RoleListReq) returns (RoleListResp);
|
rpc GetRoleList(RoleListReq) returns (RoleListResp);
|
||||||
|
rpc GetRoleDetail(GetRoleDetailReq) returns (RoleDetailResp);
|
||||||
|
rpc AssignRoleMenus(AssignRoleMenusReq) returns (CommonResp);
|
||||||
|
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
rpc AssignUserRoles(AssignUserRolesReq) returns (CommonResp);
|
||||||
|
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
rpc GetMenusByRoleId(GetMenusByRoleIdReq) returns (GetMenusByRoleIdResp);
|
rpc GetMenusByRoleId(GetMenusByRoleIdReq) returns (GetMenusByRoleIdResp);
|
||||||
|
|||||||
@@ -7,9 +7,12 @@ import (
|
|||||||
"sundynix-micro-go/app/system/rpc/internal/config"
|
"sundynix-micro-go/app/system/rpc/internal/config"
|
||||||
"sundynix-micro-go/app/system/rpc/internal/server"
|
"sundynix-micro-go/app/system/rpc/internal/server"
|
||||||
"sundynix-micro-go/app/system/rpc/internal/svc"
|
"sundynix-micro-go/app/system/rpc/internal/svc"
|
||||||
|
"sundynix-micro-go/app/system/rpc/internal/task"
|
||||||
"sundynix-micro-go/app/system/rpc/system"
|
"sundynix-micro-go/app/system/rpc/system"
|
||||||
|
"sundynix-micro-go/common/utils/timer"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/conf"
|
"github.com/zeromicro/go-zero/core/conf"
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"github.com/zeromicro/go-zero/core/service"
|
"github.com/zeromicro/go-zero/core/service"
|
||||||
"github.com/zeromicro/go-zero/core/stat"
|
"github.com/zeromicro/go-zero/core/stat"
|
||||||
"github.com/zeromicro/go-zero/zrpc"
|
"github.com/zeromicro/go-zero/zrpc"
|
||||||
@@ -36,6 +39,19 @@ func main() {
|
|||||||
})
|
})
|
||||||
defer s.Stop()
|
defer s.Stop()
|
||||||
|
|
||||||
|
// 初始化定时任务系统
|
||||||
|
cronTimer := timer.NewTimerTask()
|
||||||
|
defer cronTimer.Close()
|
||||||
|
|
||||||
|
// 注册定时清理操作日志任务 (每天凌晨 3:00 执行)
|
||||||
|
cleanJob := task.NewCleanOperLogJob(ctx)
|
||||||
|
_, err := cronTimer.AddTaskByJob("systemCron", "0 3 * * *", cleanJob, "cleanOperLogTask")
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorf("❌ 注册定时清理操作日志任务失败: %v", err)
|
||||||
|
} else {
|
||||||
|
logx.Infof("✅ 注册定时清理操作日志任务成功 (每天凌晨3点)")
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
|
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
|
||||||
s.Start()
|
s.Start()
|
||||||
}
|
}
|
||||||
|
|||||||
+658
-254
File diff suppressed because it is too large
Load Diff
@@ -25,6 +25,7 @@ const (
|
|||||||
SystemService_CreateUser_FullMethodName = "/system.SystemService/CreateUser"
|
SystemService_CreateUser_FullMethodName = "/system.SystemService/CreateUser"
|
||||||
SystemService_UpdateUser_FullMethodName = "/system.SystemService/UpdateUser"
|
SystemService_UpdateUser_FullMethodName = "/system.SystemService/UpdateUser"
|
||||||
SystemService_GetUserList_FullMethodName = "/system.SystemService/GetUserList"
|
SystemService_GetUserList_FullMethodName = "/system.SystemService/GetUserList"
|
||||||
|
SystemService_GetUserDetail_FullMethodName = "/system.SystemService/GetUserDetail"
|
||||||
SystemService_DeleteUser_FullMethodName = "/system.SystemService/DeleteUser"
|
SystemService_DeleteUser_FullMethodName = "/system.SystemService/DeleteUser"
|
||||||
SystemService_ResetPassword_FullMethodName = "/system.SystemService/ResetPassword"
|
SystemService_ResetPassword_FullMethodName = "/system.SystemService/ResetPassword"
|
||||||
SystemService_GetRolesByUserId_FullMethodName = "/system.SystemService/GetRolesByUserId"
|
SystemService_GetRolesByUserId_FullMethodName = "/system.SystemService/GetRolesByUserId"
|
||||||
@@ -32,6 +33,9 @@ const (
|
|||||||
SystemService_UpdateRole_FullMethodName = "/system.SystemService/UpdateRole"
|
SystemService_UpdateRole_FullMethodName = "/system.SystemService/UpdateRole"
|
||||||
SystemService_DeleteRole_FullMethodName = "/system.SystemService/DeleteRole"
|
SystemService_DeleteRole_FullMethodName = "/system.SystemService/DeleteRole"
|
||||||
SystemService_GetRoleList_FullMethodName = "/system.SystemService/GetRoleList"
|
SystemService_GetRoleList_FullMethodName = "/system.SystemService/GetRoleList"
|
||||||
|
SystemService_GetRoleDetail_FullMethodName = "/system.SystemService/GetRoleDetail"
|
||||||
|
SystemService_AssignRoleMenus_FullMethodName = "/system.SystemService/AssignRoleMenus"
|
||||||
|
SystemService_AssignUserRoles_FullMethodName = "/system.SystemService/AssignUserRoles"
|
||||||
SystemService_GetMenusByRoleId_FullMethodName = "/system.SystemService/GetMenusByRoleId"
|
SystemService_GetMenusByRoleId_FullMethodName = "/system.SystemService/GetMenusByRoleId"
|
||||||
SystemService_CreateMenu_FullMethodName = "/system.SystemService/CreateMenu"
|
SystemService_CreateMenu_FullMethodName = "/system.SystemService/CreateMenu"
|
||||||
SystemService_UpdateMenu_FullMethodName = "/system.SystemService/UpdateMenu"
|
SystemService_UpdateMenu_FullMethodName = "/system.SystemService/UpdateMenu"
|
||||||
@@ -62,6 +66,7 @@ type SystemServiceClient interface {
|
|||||||
CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*CreateUserResp, error)
|
CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*CreateUserResp, error)
|
||||||
UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
GetUserList(ctx context.Context, in *GetUserListReq, opts ...grpc.CallOption) (*GetUserListResp, error)
|
GetUserList(ctx context.Context, in *GetUserListReq, opts ...grpc.CallOption) (*GetUserListResp, error)
|
||||||
|
GetUserDetail(ctx context.Context, in *GetUserDetailReq, opts ...grpc.CallOption) (*UserDetailResp, error)
|
||||||
DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
ResetPassword(ctx context.Context, in *ResetPasswordReq, opts ...grpc.CallOption) (*CommonResp, error)
|
ResetPassword(ctx context.Context, in *ResetPasswordReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
// --- 角色 ---
|
// --- 角色 ---
|
||||||
@@ -70,6 +75,10 @@ type SystemServiceClient interface {
|
|||||||
UpdateRole(ctx context.Context, in *RoleUpdateReq, opts ...grpc.CallOption) (*CommonResp, error)
|
UpdateRole(ctx context.Context, in *RoleUpdateReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
DeleteRole(ctx context.Context, in *IdsReq, opts ...grpc.CallOption) (*CommonResp, error)
|
DeleteRole(ctx context.Context, in *IdsReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
GetRoleList(ctx context.Context, in *RoleListReq, opts ...grpc.CallOption) (*RoleListResp, error)
|
GetRoleList(ctx context.Context, in *RoleListReq, opts ...grpc.CallOption) (*RoleListResp, error)
|
||||||
|
GetRoleDetail(ctx context.Context, in *GetRoleDetailReq, opts ...grpc.CallOption) (*RoleDetailResp, error)
|
||||||
|
AssignRoleMenus(ctx context.Context, in *AssignRoleMenusReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
AssignUserRoles(ctx context.Context, in *AssignUserRolesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error)
|
GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error)
|
||||||
CreateMenu(ctx context.Context, in *MenuReq, opts ...grpc.CallOption) (*CommonResp, error)
|
CreateMenu(ctx context.Context, in *MenuReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
@@ -161,6 +170,16 @@ func (c *systemServiceClient) GetUserList(ctx context.Context, in *GetUserListRe
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *systemServiceClient) GetUserDetail(ctx context.Context, in *GetUserDetailReq, opts ...grpc.CallOption) (*UserDetailResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(UserDetailResp)
|
||||||
|
err := c.cc.Invoke(ctx, SystemService_GetUserDetail_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *systemServiceClient) DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
func (c *systemServiceClient) DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
out := new(CommonResp)
|
out := new(CommonResp)
|
||||||
@@ -231,6 +250,36 @@ func (c *systemServiceClient) GetRoleList(ctx context.Context, in *RoleListReq,
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *systemServiceClient) GetRoleDetail(ctx context.Context, in *GetRoleDetailReq, opts ...grpc.CallOption) (*RoleDetailResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(RoleDetailResp)
|
||||||
|
err := c.cc.Invoke(ctx, SystemService_GetRoleDetail_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *systemServiceClient) AssignRoleMenus(ctx context.Context, in *AssignRoleMenusReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, SystemService_AssignRoleMenus_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *systemServiceClient) AssignUserRoles(ctx context.Context, in *AssignUserRolesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
|
out := new(CommonResp)
|
||||||
|
err := c.cc.Invoke(ctx, SystemService_AssignUserRoles_FullMethodName, in, out, cOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *systemServiceClient) GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error) {
|
func (c *systemServiceClient) GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error) {
|
||||||
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
|
||||||
out := new(GetMenusByRoleIdResp)
|
out := new(GetMenusByRoleIdResp)
|
||||||
@@ -412,6 +461,7 @@ type SystemServiceServer interface {
|
|||||||
CreateUser(context.Context, *CreateUserReq) (*CreateUserResp, error)
|
CreateUser(context.Context, *CreateUserReq) (*CreateUserResp, error)
|
||||||
UpdateUser(context.Context, *UpdateUserReq) (*CommonResp, error)
|
UpdateUser(context.Context, *UpdateUserReq) (*CommonResp, error)
|
||||||
GetUserList(context.Context, *GetUserListReq) (*GetUserListResp, error)
|
GetUserList(context.Context, *GetUserListReq) (*GetUserListResp, error)
|
||||||
|
GetUserDetail(context.Context, *GetUserDetailReq) (*UserDetailResp, error)
|
||||||
DeleteUser(context.Context, *DeleteUserReq) (*CommonResp, error)
|
DeleteUser(context.Context, *DeleteUserReq) (*CommonResp, error)
|
||||||
ResetPassword(context.Context, *ResetPasswordReq) (*CommonResp, error)
|
ResetPassword(context.Context, *ResetPasswordReq) (*CommonResp, error)
|
||||||
// --- 角色 ---
|
// --- 角色 ---
|
||||||
@@ -420,6 +470,10 @@ type SystemServiceServer interface {
|
|||||||
UpdateRole(context.Context, *RoleUpdateReq) (*CommonResp, error)
|
UpdateRole(context.Context, *RoleUpdateReq) (*CommonResp, error)
|
||||||
DeleteRole(context.Context, *IdsReq) (*CommonResp, error)
|
DeleteRole(context.Context, *IdsReq) (*CommonResp, error)
|
||||||
GetRoleList(context.Context, *RoleListReq) (*RoleListResp, error)
|
GetRoleList(context.Context, *RoleListReq) (*RoleListResp, error)
|
||||||
|
GetRoleDetail(context.Context, *GetRoleDetailReq) (*RoleDetailResp, error)
|
||||||
|
AssignRoleMenus(context.Context, *AssignRoleMenusReq) (*CommonResp, error)
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
AssignUserRoles(context.Context, *AssignUserRolesReq) (*CommonResp, error)
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
GetMenusByRoleId(context.Context, *GetMenusByRoleIdReq) (*GetMenusByRoleIdResp, error)
|
GetMenusByRoleId(context.Context, *GetMenusByRoleIdReq) (*GetMenusByRoleIdResp, error)
|
||||||
CreateMenu(context.Context, *MenuReq) (*CommonResp, error)
|
CreateMenu(context.Context, *MenuReq) (*CommonResp, error)
|
||||||
@@ -469,6 +523,9 @@ func (UnimplementedSystemServiceServer) UpdateUser(context.Context, *UpdateUserR
|
|||||||
func (UnimplementedSystemServiceServer) GetUserList(context.Context, *GetUserListReq) (*GetUserListResp, error) {
|
func (UnimplementedSystemServiceServer) GetUserList(context.Context, *GetUserListReq) (*GetUserListResp, error) {
|
||||||
return nil, status.Error(codes.Unimplemented, "method GetUserList not implemented")
|
return nil, status.Error(codes.Unimplemented, "method GetUserList not implemented")
|
||||||
}
|
}
|
||||||
|
func (UnimplementedSystemServiceServer) GetUserDetail(context.Context, *GetUserDetailReq) (*UserDetailResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method GetUserDetail not implemented")
|
||||||
|
}
|
||||||
func (UnimplementedSystemServiceServer) DeleteUser(context.Context, *DeleteUserReq) (*CommonResp, error) {
|
func (UnimplementedSystemServiceServer) DeleteUser(context.Context, *DeleteUserReq) (*CommonResp, error) {
|
||||||
return nil, status.Error(codes.Unimplemented, "method DeleteUser not implemented")
|
return nil, status.Error(codes.Unimplemented, "method DeleteUser not implemented")
|
||||||
}
|
}
|
||||||
@@ -490,6 +547,15 @@ func (UnimplementedSystemServiceServer) DeleteRole(context.Context, *IdsReq) (*C
|
|||||||
func (UnimplementedSystemServiceServer) GetRoleList(context.Context, *RoleListReq) (*RoleListResp, error) {
|
func (UnimplementedSystemServiceServer) GetRoleList(context.Context, *RoleListReq) (*RoleListResp, error) {
|
||||||
return nil, status.Error(codes.Unimplemented, "method GetRoleList not implemented")
|
return nil, status.Error(codes.Unimplemented, "method GetRoleList not implemented")
|
||||||
}
|
}
|
||||||
|
func (UnimplementedSystemServiceServer) GetRoleDetail(context.Context, *GetRoleDetailReq) (*RoleDetailResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method GetRoleDetail not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedSystemServiceServer) AssignRoleMenus(context.Context, *AssignRoleMenusReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method AssignRoleMenus not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedSystemServiceServer) AssignUserRoles(context.Context, *AssignUserRolesReq) (*CommonResp, error) {
|
||||||
|
return nil, status.Error(codes.Unimplemented, "method AssignUserRoles not implemented")
|
||||||
|
}
|
||||||
func (UnimplementedSystemServiceServer) GetMenusByRoleId(context.Context, *GetMenusByRoleIdReq) (*GetMenusByRoleIdResp, error) {
|
func (UnimplementedSystemServiceServer) GetMenusByRoleId(context.Context, *GetMenusByRoleIdReq) (*GetMenusByRoleIdResp, error) {
|
||||||
return nil, status.Error(codes.Unimplemented, "method GetMenusByRoleId not implemented")
|
return nil, status.Error(codes.Unimplemented, "method GetMenusByRoleId not implemented")
|
||||||
}
|
}
|
||||||
@@ -670,6 +736,24 @@ func _SystemService_GetUserList_Handler(srv interface{}, ctx context.Context, de
|
|||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func _SystemService_GetUserDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetUserDetailReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SystemServiceServer).GetUserDetail(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: SystemService_GetUserDetail_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SystemServiceServer).GetUserDetail(ctx, req.(*GetUserDetailReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
func _SystemService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
func _SystemService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
in := new(DeleteUserReq)
|
in := new(DeleteUserReq)
|
||||||
if err := dec(in); err != nil {
|
if err := dec(in); err != nil {
|
||||||
@@ -796,6 +880,60 @@ func _SystemService_GetRoleList_Handler(srv interface{}, ctx context.Context, de
|
|||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func _SystemService_GetRoleDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetRoleDetailReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SystemServiceServer).GetRoleDetail(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: SystemService_GetRoleDetail_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SystemServiceServer).GetRoleDetail(ctx, req.(*GetRoleDetailReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SystemService_AssignRoleMenus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(AssignRoleMenusReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SystemServiceServer).AssignRoleMenus(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: SystemService_AssignRoleMenus_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SystemServiceServer).AssignRoleMenus(ctx, req.(*AssignRoleMenusReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SystemService_AssignUserRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(AssignUserRolesReq)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SystemServiceServer).AssignUserRoles(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: SystemService_AssignUserRoles_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SystemServiceServer).AssignUserRoles(ctx, req.(*AssignUserRolesReq))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
func _SystemService_GetMenusByRoleId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
func _SystemService_GetMenusByRoleId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
in := new(GetMenusByRoleIdReq)
|
in := new(GetMenusByRoleIdReq)
|
||||||
if err := dec(in); err != nil {
|
if err := dec(in); err != nil {
|
||||||
@@ -1133,6 +1271,10 @@ var SystemService_ServiceDesc = grpc.ServiceDesc{
|
|||||||
MethodName: "GetUserList",
|
MethodName: "GetUserList",
|
||||||
Handler: _SystemService_GetUserList_Handler,
|
Handler: _SystemService_GetUserList_Handler,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetUserDetail",
|
||||||
|
Handler: _SystemService_GetUserDetail_Handler,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
MethodName: "DeleteUser",
|
MethodName: "DeleteUser",
|
||||||
Handler: _SystemService_DeleteUser_Handler,
|
Handler: _SystemService_DeleteUser_Handler,
|
||||||
@@ -1161,6 +1303,18 @@ var SystemService_ServiceDesc = grpc.ServiceDesc{
|
|||||||
MethodName: "GetRoleList",
|
MethodName: "GetRoleList",
|
||||||
Handler: _SystemService_GetRoleList_Handler,
|
Handler: _SystemService_GetRoleList_Handler,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetRoleDetail",
|
||||||
|
Handler: _SystemService_GetRoleDetail_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "AssignRoleMenus",
|
||||||
|
Handler: _SystemService_AssignRoleMenus_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "AssignUserRoles",
|
||||||
|
Handler: _SystemService_AssignUserRoles_Handler,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
MethodName: "GetMenusByRoleId",
|
MethodName: "GetMenusByRoleId",
|
||||||
Handler: _SystemService_GetMenusByRoleId_Handler,
|
Handler: _SystemService_GetMenusByRoleId_Handler,
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
AssignRoleMenusReq = system.AssignRoleMenusReq
|
||||||
|
AssignUserRolesReq = system.AssignUserRolesReq
|
||||||
ClientInfo = system.ClientInfo
|
ClientInfo = system.ClientInfo
|
||||||
ClientListReq = system.ClientListReq
|
ClientListReq = system.ClientListReq
|
||||||
ClientListResp = system.ClientListResp
|
ClientListResp = system.ClientListResp
|
||||||
@@ -33,12 +35,16 @@ type (
|
|||||||
GetClientByIdResp = system.GetClientByIdResp
|
GetClientByIdResp = system.GetClientByIdResp
|
||||||
GetMenusByRoleIdReq = system.GetMenusByRoleIdReq
|
GetMenusByRoleIdReq = system.GetMenusByRoleIdReq
|
||||||
GetMenusByRoleIdResp = system.GetMenusByRoleIdResp
|
GetMenusByRoleIdResp = system.GetMenusByRoleIdResp
|
||||||
|
GetRoleDetailReq = system.GetRoleDetailReq
|
||||||
|
GetRoleListReq = system.RoleListReq
|
||||||
|
GetRoleListResp = system.RoleListResp
|
||||||
GetRolesByUserIdReq = system.GetRolesByUserIdReq
|
GetRolesByUserIdReq = system.GetRolesByUserIdReq
|
||||||
GetRolesByUserIdResp = system.GetRolesByUserIdResp
|
GetRolesByUserIdResp = system.GetRolesByUserIdResp
|
||||||
GetUserByIdReq = system.GetUserByIdReq
|
GetUserByIdReq = system.GetUserByIdReq
|
||||||
GetUserByIdResp = system.GetUserByIdResp
|
GetUserByIdResp = system.GetUserByIdResp
|
||||||
GetUserByOpenIdReq = system.GetUserByOpenIdReq
|
GetUserByOpenIdReq = system.GetUserByOpenIdReq
|
||||||
GetUserByOpenIdResp = system.GetUserByOpenIdResp
|
GetUserByOpenIdResp = system.GetUserByOpenIdResp
|
||||||
|
GetUserDetailReq = system.GetUserDetailReq
|
||||||
GetUserListReq = system.GetUserListReq
|
GetUserListReq = system.GetUserListReq
|
||||||
GetUserListResp = system.GetUserListResp
|
GetUserListResp = system.GetUserListResp
|
||||||
IdReq = system.IdReq
|
IdReq = system.IdReq
|
||||||
@@ -53,12 +59,14 @@ type (
|
|||||||
OperationRecordListReq = system.OperationRecordListReq
|
OperationRecordListReq = system.OperationRecordListReq
|
||||||
OperationRecordListResp = system.OperationRecordListResp
|
OperationRecordListResp = system.OperationRecordListResp
|
||||||
ResetPasswordReq = system.ResetPasswordReq
|
ResetPasswordReq = system.ResetPasswordReq
|
||||||
|
RoleDetailResp = system.RoleDetailResp
|
||||||
RoleInfo = system.RoleInfo
|
RoleInfo = system.RoleInfo
|
||||||
RoleListReq = system.RoleListReq
|
RoleListReq = system.RoleListReq
|
||||||
RoleListResp = system.RoleListResp
|
RoleListResp = system.RoleListResp
|
||||||
RoleReq = system.RoleReq
|
RoleReq = system.RoleReq
|
||||||
RoleUpdateReq = system.RoleUpdateReq
|
RoleUpdateReq = system.RoleUpdateReq
|
||||||
UpdateUserReq = system.UpdateUserReq
|
UpdateUserReq = system.UpdateUserReq
|
||||||
|
UserDetailResp = system.UserDetailResp
|
||||||
UserInfo = system.UserInfo
|
UserInfo = system.UserInfo
|
||||||
|
|
||||||
SystemService interface {
|
SystemService interface {
|
||||||
@@ -69,6 +77,7 @@ type (
|
|||||||
CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*CreateUserResp, error)
|
CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*CreateUserResp, error)
|
||||||
UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
GetUserList(ctx context.Context, in *GetUserListReq, opts ...grpc.CallOption) (*GetUserListResp, error)
|
GetUserList(ctx context.Context, in *GetUserListReq, opts ...grpc.CallOption) (*GetUserListResp, error)
|
||||||
|
GetUserDetail(ctx context.Context, in *GetUserDetailReq, opts ...grpc.CallOption) (*UserDetailResp, error)
|
||||||
DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
ResetPassword(ctx context.Context, in *ResetPasswordReq, opts ...grpc.CallOption) (*CommonResp, error)
|
ResetPassword(ctx context.Context, in *ResetPasswordReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
// --- 角色 ---
|
// --- 角色 ---
|
||||||
@@ -77,6 +86,10 @@ type (
|
|||||||
UpdateRole(ctx context.Context, in *RoleUpdateReq, opts ...grpc.CallOption) (*CommonResp, error)
|
UpdateRole(ctx context.Context, in *RoleUpdateReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
DeleteRole(ctx context.Context, in *IdsReq, opts ...grpc.CallOption) (*CommonResp, error)
|
DeleteRole(ctx context.Context, in *IdsReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
GetRoleList(ctx context.Context, in *RoleListReq, opts ...grpc.CallOption) (*RoleListResp, error)
|
GetRoleList(ctx context.Context, in *RoleListReq, opts ...grpc.CallOption) (*RoleListResp, error)
|
||||||
|
GetRoleDetail(ctx context.Context, in *GetRoleDetailReq, opts ...grpc.CallOption) (*RoleDetailResp, error)
|
||||||
|
AssignRoleMenus(ctx context.Context, in *AssignRoleMenusReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
AssignUserRoles(ctx context.Context, in *AssignUserRolesReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error)
|
GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error)
|
||||||
CreateMenu(ctx context.Context, in *MenuReq, opts ...grpc.CallOption) (*CommonResp, error)
|
CreateMenu(ctx context.Context, in *MenuReq, opts ...grpc.CallOption) (*CommonResp, error)
|
||||||
@@ -142,6 +155,11 @@ func (m *defaultSystemService) GetUserList(ctx context.Context, in *GetUserListR
|
|||||||
return client.GetUserList(ctx, in, opts...)
|
return client.GetUserList(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *defaultSystemService) GetUserDetail(ctx context.Context, in *GetUserDetailReq, opts ...grpc.CallOption) (*UserDetailResp, error) {
|
||||||
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
|
return client.GetUserDetail(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *defaultSystemService) DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
func (m *defaultSystemService) DeleteUser(ctx context.Context, in *DeleteUserReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
client := system.NewSystemServiceClient(m.cli.Conn())
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
return client.DeleteUser(ctx, in, opts...)
|
return client.DeleteUser(ctx, in, opts...)
|
||||||
@@ -178,6 +196,22 @@ func (m *defaultSystemService) GetRoleList(ctx context.Context, in *RoleListReq,
|
|||||||
return client.GetRoleList(ctx, in, opts...)
|
return client.GetRoleList(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *defaultSystemService) GetRoleDetail(ctx context.Context, in *GetRoleDetailReq, opts ...grpc.CallOption) (*RoleDetailResp, error) {
|
||||||
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
|
return client.GetRoleDetail(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *defaultSystemService) AssignRoleMenus(ctx context.Context, in *AssignRoleMenusReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
|
return client.AssignRoleMenus(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- RBAC 用户授权 ---
|
||||||
|
func (m *defaultSystemService) AssignUserRoles(ctx context.Context, in *AssignUserRolesReq, opts ...grpc.CallOption) (*CommonResp, error) {
|
||||||
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
|
return client.AssignUserRoles(ctx, in, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
// --- 菜单 ---
|
// --- 菜单 ---
|
||||||
func (m *defaultSystemService) GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error) {
|
func (m *defaultSystemService) GetMenusByRoleId(ctx context.Context, in *GetMenusByRoleIdReq, opts ...grpc.CallOption) (*GetMenusByRoleIdResp, error) {
|
||||||
client := system.NewSystemServiceClient(m.cli.Conn())
|
client := system.NewSystemServiceClient(m.cli.Conn())
|
||||||
|
|||||||
@@ -0,0 +1,219 @@
|
|||||||
|
package timer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/robfig/cron/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Timer interface {
|
||||||
|
FindCronList() map[string]*taskManager
|
||||||
|
AddTaskByFuncWithSecond(cronName string, spec string, fun func(), taskName string, options ...cron.Option) (cron.EntryID, error) // 添加Task Func以秒的形式加入
|
||||||
|
AddTaskByJobWithSecond(cronName string, spec string, job interface{ Run() }, taskName string, options ...cron.Option) (cron.EntryID, error) // 添加Task Job以秒的形式加入
|
||||||
|
AddTaskByFunc(cronName string, spec string, task func(), taskName string, options ...cron.Option) (cron.EntryID, error) // 添加Task Func加入
|
||||||
|
AddTaskByJob(cronName string, spec string, job interface{ Run() }, taskName string, options ...cron.Option) (cron.EntryID, error) // 添加Task Job加入
|
||||||
|
FindCron(cronName string) (*taskManager, bool) //获取对应taskName的cron 可能会为空
|
||||||
|
StartCron(cronName string) // 启动对应cron
|
||||||
|
StopCron(cronName string) // 停止对应cron
|
||||||
|
FindTask(cronName string, taskName string) (*task, bool) //获取对应taskName的task
|
||||||
|
RemoveTask(cronName string, id int) //删除对应taskName的task
|
||||||
|
RemoveTaskByName(cronName string, taskName string) //删除对应taskName的task
|
||||||
|
Clear(cronName string) //清空对应cronName的task
|
||||||
|
Close() // 关闭所有定时任务
|
||||||
|
}
|
||||||
|
|
||||||
|
type task struct {
|
||||||
|
EntryId cron.EntryID
|
||||||
|
Spec string
|
||||||
|
TaskName string
|
||||||
|
}
|
||||||
|
type taskManager struct {
|
||||||
|
corn *cron.Cron
|
||||||
|
tasks map[cron.EntryID]*task
|
||||||
|
}
|
||||||
|
|
||||||
|
// timer 定时任务管理
|
||||||
|
type timer struct {
|
||||||
|
cronList map[string]*taskManager
|
||||||
|
sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddTaskByFuncWithSecond 通过函数的方法使用WithSeconds添加任务
|
||||||
|
func (t *timer) AddTaskByFuncWithSecond(cronName string, spec string, fun func(), taskName string, option ...cron.Option) (cron.EntryID, error) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
option = append(option, cron.WithSeconds())
|
||||||
|
if _, ok := t.cronList[cronName]; !ok {
|
||||||
|
tasks := make(map[cron.EntryID]*task)
|
||||||
|
t.cronList[cronName] = &taskManager{
|
||||||
|
corn: cron.New(option...),
|
||||||
|
tasks: tasks,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id, err := t.cronList[cronName].corn.AddFunc(spec, fun)
|
||||||
|
t.cronList[cronName].corn.Start()
|
||||||
|
t.cronList[cronName].tasks[id] = &task{
|
||||||
|
EntryId: id,
|
||||||
|
Spec: spec,
|
||||||
|
TaskName: taskName,
|
||||||
|
}
|
||||||
|
return id, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddTaskByFunc 通过函数的方法添加任务
|
||||||
|
func (t *timer) AddTaskByFunc(cronName string, spec string, fun func(), taskName string, option ...cron.Option) (cron.EntryID, error) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if _, ok := t.cronList[cronName]; !ok {
|
||||||
|
tasks := make(map[cron.EntryID]*task)
|
||||||
|
t.cronList[cronName] = &taskManager{
|
||||||
|
corn: cron.New(option...),
|
||||||
|
tasks: tasks,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id, err := t.cronList[cronName].corn.AddFunc(spec, fun)
|
||||||
|
t.cronList[cronName].corn.Start()
|
||||||
|
t.cronList[cronName].tasks[id] = &task{
|
||||||
|
EntryId: id,
|
||||||
|
Spec: spec,
|
||||||
|
TaskName: taskName,
|
||||||
|
}
|
||||||
|
return id, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddTaskByJobWithSecond 通过Job的方法使用WithSeconds添加任务
|
||||||
|
func (t *timer) AddTaskByJobWithSecond(cronName string, spec string, job interface{ Run() }, taskName string, option ...cron.Option) (cron.EntryID, error) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
option = append(option, cron.WithSeconds())
|
||||||
|
if _, ok := t.cronList[cronName]; !ok {
|
||||||
|
tasks := make(map[cron.EntryID]*task)
|
||||||
|
t.cronList[cronName] = &taskManager{
|
||||||
|
corn: cron.New(option...),
|
||||||
|
tasks: tasks,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id, err := t.cronList[cronName].corn.AddJob(spec, job)
|
||||||
|
t.cronList[cronName].corn.Start()
|
||||||
|
t.cronList[cronName].tasks[id] = &task{
|
||||||
|
EntryId: id,
|
||||||
|
Spec: spec,
|
||||||
|
TaskName: taskName,
|
||||||
|
}
|
||||||
|
return id, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddTaskByJob 通过Job的方法添加任务
|
||||||
|
func (t *timer) AddTaskByJob(cronName string, spec string, job interface{ Run() }, taskName string, option ...cron.Option) (cron.EntryID, error) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if _, ok := t.cronList[cronName]; !ok {
|
||||||
|
tasks := make(map[cron.EntryID]*task)
|
||||||
|
t.cronList[cronName] = &taskManager{
|
||||||
|
corn: cron.New(option...),
|
||||||
|
tasks: tasks,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id, err := t.cronList[cronName].corn.AddJob(spec, job)
|
||||||
|
t.cronList[cronName].corn.Start()
|
||||||
|
t.cronList[cronName].tasks[id] = &task{
|
||||||
|
EntryId: id,
|
||||||
|
Spec: spec,
|
||||||
|
TaskName: taskName,
|
||||||
|
}
|
||||||
|
return id, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindCron 获取对应cronName的cron 可能会为空
|
||||||
|
func (t *timer) FindCron(cronName string) (*taskManager, bool) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
v, ok := t.cronList[cronName]
|
||||||
|
return v, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindTask 获取对应taskName的task
|
||||||
|
func (t *timer) FindTask(cronName string, taskName string) (*task, bool) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
v, ok := t.cronList[cronName]
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
for _, t2 := range v.tasks {
|
||||||
|
if t2.TaskName == taskName {
|
||||||
|
return t2, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindCronList 获取所有cron
|
||||||
|
func (t *timer) FindCronList() map[string]*taskManager {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
return t.cronList
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartCron 启动对应cron
|
||||||
|
func (t *timer) StartCron(cronName string) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if v, ok := t.cronList[cronName]; ok {
|
||||||
|
v.corn.Start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// StopCron 停止对应cron
|
||||||
|
func (t *timer) StopCron(cronName string) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if v, ok := t.cronList[cronName]; ok {
|
||||||
|
v.corn.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveTask 从cronName 删除指定任务
|
||||||
|
func (t *timer) RemoveTask(cronName string, id int) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if v, ok := t.cronList[cronName]; ok {
|
||||||
|
v.corn.Remove(cron.EntryID(id))
|
||||||
|
delete(v.tasks, cron.EntryID(id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveTaskByName 从cronName 删除指定任务
|
||||||
|
func (t *timer) RemoveTaskByName(cronName string, taskName string) {
|
||||||
|
fTask, ok := t.FindTask(cronName, taskName)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.RemoveTask(cronName, int(fTask.EntryId))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear 清空对应cronName的task
|
||||||
|
func (t *timer) Clear(cronName string) {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
if v, ok := t.cronList[cronName]; ok {
|
||||||
|
v.corn.Stop()
|
||||||
|
delete(t.cronList, cronName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close 关闭所有定时任务 释放资源
|
||||||
|
func (t *timer) Close() {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
for _, v := range t.cronList {
|
||||||
|
v.corn.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTimerTask 创建定时任务
|
||||||
|
func NewTimerTask() Timer {
|
||||||
|
return &timer{
|
||||||
|
cronList: make(map[string]*taskManager),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,11 +3,14 @@ module sundynix-micro-go
|
|||||||
go 1.26.2
|
go 1.26.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
|
||||||
github.com/golang-jwt/jwt/v5 v5.3.1
|
github.com/golang-jwt/jwt/v5 v5.3.1
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/minio/minio-go/v7 v7.0.100
|
github.com/minio/minio-go/v7 v7.1.0
|
||||||
github.com/mojocn/base64Captcha v1.3.8
|
github.com/mojocn/base64Captcha v1.3.8
|
||||||
|
github.com/qiniu/go-sdk/v7 v7.26.10
|
||||||
github.com/redis/go-redis/v9 v9.18.0
|
github.com/redis/go-redis/v9 v9.18.0
|
||||||
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.73
|
||||||
github.com/zeromicro/go-zero v1.10.1
|
github.com/zeromicro/go-zero v1.10.1
|
||||||
golang.org/x/crypto v0.50.0
|
golang.org/x/crypto v0.50.0
|
||||||
google.golang.org/grpc v1.80.0
|
google.golang.org/grpc v1.80.0
|
||||||
@@ -18,9 +21,12 @@ require (
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
|
github.com/BurntSushi/toml v1.3.2 // indirect
|
||||||
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/clbanning/mxj v1.8.4 // indirect
|
||||||
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
|
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
|
||||||
github.com/coreos/go-semver v0.3.1 // indirect
|
github.com/coreos/go-semver v0.3.1 // indirect
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
@@ -33,6 +39,7 @@ require (
|
|||||||
github.com/fatih/color v1.18.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fullstorydev/grpcurl v1.9.3 // indirect
|
github.com/fullstorydev/grpcurl v1.9.3 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
||||||
|
github.com/gammazero/toposort v0.1.1 // indirect
|
||||||
github.com/go-ini/ini v1.67.0 // indirect
|
github.com/go-ini/ini v1.67.0 // indirect
|
||||||
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
|
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
@@ -41,12 +48,14 @@ require (
|
|||||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
||||||
github.com/go-openapi/swag v0.23.0 // indirect
|
github.com/go-openapi/swag v0.23.0 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.9.3 // indirect
|
github.com/go-sql-driver/mysql v1.9.3 // indirect
|
||||||
|
github.com/gofrs/flock v0.8.1 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/gnostic-models v0.7.0 // indirect
|
github.com/google/gnostic-models v0.7.0 // indirect
|
||||||
github.com/google/go-cmp v0.7.0 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
|
github.com/google/go-querystring v1.0.0 // indirect
|
||||||
github.com/grafana/pyroscope-go v1.2.8 // indirect
|
github.com/grafana/pyroscope-go v1.2.8 // indirect
|
||||||
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
|
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect
|
||||||
@@ -64,8 +73,10 @@ require (
|
|||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/minio/crc64nvme v1.1.1 // indirect
|
github.com/minio/crc64nvme v1.1.1 // indirect
|
||||||
github.com/minio/md5-simd v1.1.2 // indirect
|
github.com/minio/md5-simd v1.1.2 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
||||||
|
github.com/mozillazg/go-httpheader v0.2.1 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/openzipkin/zipkin-go v0.4.3 // indirect
|
github.com/openzipkin/zipkin-go v0.4.3 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.3.0 // indirect
|
github.com/pelletier/go-toml/v2 v2.3.0 // indirect
|
||||||
@@ -78,12 +89,14 @@ require (
|
|||||||
github.com/prometheus/client_model v0.6.2 // indirect
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
github.com/prometheus/common v0.66.1 // indirect
|
github.com/prometheus/common v0.66.1 // indirect
|
||||||
github.com/prometheus/procfs v0.16.1 // indirect
|
github.com/prometheus/procfs v0.16.1 // indirect
|
||||||
|
github.com/robfig/cron/v3 v3.0.1 // indirect
|
||||||
github.com/rs/xid v1.6.0 // indirect
|
github.com/rs/xid v1.6.0 // indirect
|
||||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||||
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
|
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
|
||||||
github.com/tinylib/msgp v1.6.1 // indirect
|
github.com/tinylib/msgp v1.6.1 // indirect
|
||||||
github.com/titanous/json5 v1.0.0 // indirect
|
github.com/titanous/json5 v1.0.0 // indirect
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
|
github.com/zeebo/xxh3 v1.1.0 // indirect
|
||||||
go.etcd.io/etcd/api/v3 v3.5.21 // indirect
|
go.etcd.io/etcd/api/v3 v3.5.21 // indirect
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect
|
go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect
|
||||||
go.etcd.io/etcd/client/v3 v3.5.21 // indirect
|
go.etcd.io/etcd/client/v3 v3.5.21 // indirect
|
||||||
@@ -125,6 +138,7 @@ require (
|
|||||||
k8s.io/klog/v2 v2.130.1 // indirect
|
k8s.io/klog/v2 v2.130.1 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
|
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
|
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect
|
||||||
|
modernc.org/fileutil v1.0.0 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
|
||||||
sigs.k8s.io/randfill v1.0.0 // indirect
|
sigs.k8s.io/randfill v1.0.0 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
|
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
|
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
|
||||||
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4=
|
||||||
|
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
|
||||||
github.com/alicebob/miniredis/v2 v2.37.0 h1:RheObYW32G1aiJIj81XVt78ZHJpHonHLHW7OLIshq68=
|
github.com/alicebob/miniredis/v2 v2.37.0 h1:RheObYW32G1aiJIj81XVt78ZHJpHonHLHW7OLIshq68=
|
||||||
github.com/alicebob/miniredis/v2 v2.37.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
|
github.com/alicebob/miniredis/v2 v2.37.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
@@ -16,6 +22,8 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x
|
|||||||
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
|
||||||
|
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
|
||||||
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
|
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
|
||||||
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
|
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
|
||||||
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
||||||
@@ -42,6 +50,8 @@ github.com/fullstorydev/grpcurl v1.9.3 h1:PC1Xi3w+JAvEE2Tg2Gf2RfVgPbf9+tbuQr1Zky
|
|||||||
github.com/fullstorydev/grpcurl v1.9.3/go.mod h1:/b4Wxe8bG6ndAjlfSUjwseQReUDUvBJiFEB7UllOlUE=
|
github.com/fullstorydev/grpcurl v1.9.3/go.mod h1:/b4Wxe8bG6ndAjlfSUjwseQReUDUvBJiFEB7UllOlUE=
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
||||||
|
github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg=
|
||||||
|
github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw=
|
||||||
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
|
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
|
||||||
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||||
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
|
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
|
||||||
@@ -65,10 +75,13 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe
|
|||||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
|
||||||
|
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
|
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
|
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
|
||||||
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
|
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||||
@@ -80,11 +93,16 @@ github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7O
|
|||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
|
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||||
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
||||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||||
|
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||||
github.com/grafana/pyroscope-go v1.2.8 h1:UvCwIhlx9DeV7F6TW/z8q1Mi4PIm3vuUJ2ZlCEvmA4M=
|
github.com/grafana/pyroscope-go v1.2.8 h1:UvCwIhlx9DeV7F6TW/z8q1Mi4PIm3vuUJ2ZlCEvmA4M=
|
||||||
github.com/grafana/pyroscope-go v1.2.8/go.mod h1:SSi59eQ1/zmKoY/BKwa5rSFsJaq+242Bcrr4wPix1g8=
|
github.com/grafana/pyroscope-go v1.2.8/go.mod h1:SSi59eQ1/zmKoY/BKwa5rSFsJaq+242Bcrr4wPix1g8=
|
||||||
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 h1:c1Us8i6eSmkW+Ez05d3co8kasnuOY813tbMN8i/a3Og=
|
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 h1:c1Us8i6eSmkW+Ez05d3co8kasnuOY813tbMN8i/a3Og=
|
||||||
@@ -136,8 +154,10 @@ github.com/minio/crc64nvme v1.1.1 h1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI
|
|||||||
github.com/minio/crc64nvme v1.1.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
|
github.com/minio/crc64nvme v1.1.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
|
||||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||||
github.com/minio/minio-go/v7 v7.0.100 h1:ShkWi8Tyj9RtU57OQB2HIXKz4bFgtVib0bbT1sbtLI8=
|
github.com/minio/minio-go/v7 v7.1.0 h1:QEt5IStDpxgGjEdtOgpiZ5QhmSl3ax7qy61vi2SwHO8=
|
||||||
github.com/minio/minio-go/v7 v7.0.100/go.mod h1:EtGNKtlX20iL2yaYnxEigaIvj0G0GwSDnifnG8ClIdw=
|
github.com/minio/minio-go/v7 v7.1.0/go.mod h1:Dm7WS1AgLmBa0NcQD6SeJnJf+K/EUW3GR7Ks6olB3OA=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -146,6 +166,8 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
|
|||||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg=
|
github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg=
|
||||||
github.com/mojocn/base64Captcha v1.3.8/go.mod h1:QFZy927L8HVP3+VV5z2b1EAEiv1KxVJKZbAucVgLUy4=
|
github.com/mojocn/base64Captcha v1.3.8/go.mod h1:QFZy927L8HVP3+VV5z2b1EAEiv1KxVJKZbAucVgLUy4=
|
||||||
|
github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
|
||||||
|
github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
|
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
|
||||||
@@ -176,14 +198,19 @@ github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9Z
|
|||||||
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
|
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
|
||||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
|
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
|
||||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
|
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
|
||||||
|
github.com/qiniu/go-sdk/v7 v7.26.10 h1:1c2c+grH7b8k5inIDKc95CI8+mAzB5YtfQ/dLOB2nNo=
|
||||||
|
github.com/qiniu/go-sdk/v7 v7.26.10/go.mod h1:ri7fGwbio0pRDFr8EK5TUpx0DbnpIMJ2bMSDxGWfCbk=
|
||||||
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
|
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
|
||||||
github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0=
|
github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/robertkrimen/otto v0.2.1 h1:FVP0PJ0AHIjC+N4pKCG9yCDz6LHNPCwi/GKID5pGGF0=
|
github.com/robertkrimen/otto v0.2.1 h1:FVP0PJ0AHIjC+N4pKCG9yCDz6LHNPCwi/GKID5pGGF0=
|
||||||
github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL//farB5FlRY=
|
github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL//farB5FlRY=
|
||||||
|
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||||
|
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
|
github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA=
|
||||||
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||||
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||||
@@ -203,6 +230,11 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
|
|||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||||
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
|
||||||
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
|
||||||
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.73 h1:uFfgp1A7cQaAGR6QP9DsIkoEQ67b8ewj5r1RV6XB540=
|
||||||
|
github.com/tencentyun/cos-go-sdk-v5 v0.7.73/go.mod h1:STbTNaNKq03u+gscPEGOahKzLcGSYOj6Dzc5zNay7Pg=
|
||||||
|
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20250515025012-e0eec8a5d123/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
|
||||||
github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY=
|
github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY=
|
||||||
github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
|
github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
|
||||||
github.com/titanous/json5 v1.0.0 h1:hJf8Su1d9NuI/ffpxgxQfxh/UiBFZX7bMPid0rIL/7s=
|
github.com/titanous/json5 v1.0.0 h1:hJf8Su1d9NuI/ffpxgxQfxh/UiBFZX7bMPid0rIL/7s=
|
||||||
@@ -214,8 +246,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
|
|||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
|
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
|
||||||
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
|
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
|
||||||
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
|
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
|
||||||
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
|
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||||
|
github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=
|
||||||
|
github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s=
|
||||||
github.com/zeromicro/go-zero v1.10.1 h1:1nM3ilvYx97GUqyaNH2IQPtfNyK7tp5JvN63c7m6QKU=
|
github.com/zeromicro/go-zero v1.10.1 h1:1nM3ilvYx97GUqyaNH2IQPtfNyK7tp5JvN63c7m6QKU=
|
||||||
github.com/zeromicro/go-zero v1.10.1/go.mod h1:z41DXmO6gx/Se7Ow5UIwPxcUmpVj3ebhoNCcZ1gfp5k=
|
github.com/zeromicro/go-zero v1.10.1/go.mod h1:z41DXmO6gx/Se7Ow5UIwPxcUmpVj3ebhoNCcZ1gfp5k=
|
||||||
go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8=
|
go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8=
|
||||||
@@ -405,6 +439,8 @@ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOP
|
|||||||
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
|
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
|
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
|
||||||
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
||||||
|
modernc.org/fileutil v1.0.0 h1:Z1AFLZwl6BO8A5NldQg/xTSjGLetp+1Ubvl4alfGx8w=
|
||||||
|
modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
|
||||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
||||||
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
||||||
|
|||||||
Reference in New Issue
Block a user