From d91f0554fdbead6f5269234ba9e420ee68bd06b7 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Fri, 21 Aug 2026 14:00:19 +0800 Subject: [PATCH] refactor: organize service dto contracts --- .tmp/init-check-data/db/kra.db | Bin 471040 -> 0 bytes .tmp/init-check-data/kra-init.db | Bin 520192 -> 0 bytes .tmp/init-check/config.yaml | 35 -- .tmp/init-check/db/kra.db | Bin 503808 -> 0 bytes .tmp/init-smoke/config.yaml | 30 -- cmd/main.go | 3 +- internal/server/handler/announcement.go | 9 +- internal/server/handler/api.go | 29 +- internal/server/handler/api_token.go | 7 +- internal/server/handler/audit.go | 25 +- internal/server/handler/authority.go | 17 +- internal/server/handler/dictionary.go | 25 +- internal/server/handler/email.go | 3 +- internal/server/handler/export.go | 11 +- internal/server/handler/integration_config.go | 3 +- internal/server/handler/media.go | 21 +- internal/server/handler/menu.go | 17 +- internal/server/handler/organization.go | 33 +- internal/server/handler/parameter.go | 7 +- internal/server/handler/payment.go | 21 +- internal/server/handler/payment_test.go | 4 +- internal/server/handler/permission.go | 5 +- internal/server/handler/public.go | 9 +- internal/server/handler/system_config.go | 5 +- internal/server/handler/task.go | 15 +- internal/server/handler/user.go | 21 +- internal/server/handler/version.go | 7 +- internal/server/middleware/audit.go | 3 +- internal/service/announcement.go | 17 +- internal/service/api.go | 39 +-- internal/service/api_token.go | 11 +- internal/service/audit.go | 41 +-- internal/service/audit_error.go | 23 +- internal/service/audit_log_file.go | 21 +- internal/service/authentication.go | 9 +- internal/service/authority.go | 25 +- internal/service/department.go | 25 +- internal/service/dictionary.go | 65 ++-- internal/service/dictionary_import.go | 17 +- internal/service/dto_alias.go | 164 --------- internal/service/export.go | 31 +- internal/service/integration_config.go | 15 +- internal/service/media.go | 37 ++- internal/service/media_upload.go | 10 +- internal/service/menu.go | 65 ++-- internal/service/menu_test.go | 7 +- internal/service/parameter.go | 21 +- internal/service/payment.go | 39 +-- internal/service/position.go | 21 +- internal/service/security.go | 11 +- internal/service/system_config.go | 4 +- internal/service/system_info.go | 16 +- internal/service/system_init.go | 5 +- internal/service/task.go | 29 +- internal/service/user.go | 27 +- internal/service/user_conversion.go | 25 +- internal/service/version.go | 19 +- web/src/api/payment.js | 8 + web/src/assets/styles/vue-cropper.css | 1 + web/src/assets/styles/wangeditor.css | 27 ++ web/src/components/richtext/rich-edit.vue | 2 +- web/src/components/richtext/rich-view.vue | 2 +- web/src/components/upload/cropper.vue | 2 +- web/src/view/media/scanUpload.vue | 2 +- web/src/view/systemTools/logViewer/index.vue | 313 +++++++++++++++++- 65 files changed, 865 insertions(+), 696 deletions(-) delete mode 100644 .tmp/init-check-data/db/kra.db delete mode 100644 .tmp/init-check-data/kra-init.db delete mode 100644 .tmp/init-check/config.yaml delete mode 100644 .tmp/init-check/db/kra.db delete mode 100644 .tmp/init-smoke/config.yaml delete mode 100644 internal/service/dto_alias.go create mode 100644 web/src/assets/styles/vue-cropper.css create mode 100644 web/src/assets/styles/wangeditor.css diff --git a/.tmp/init-check-data/db/kra.db b/.tmp/init-check-data/db/kra.db deleted file mode 100644 index 4caf312d9ded63aa05df738958221f548000278b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471040 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 diff --git a/.tmp/init-check-data/kra-init.db b/.tmp/init-check-data/kra-init.db deleted file mode 100644 index 91113584774888276e65bb3302a8d6a2e9604f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520192 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 Jfl|We{{VNU;9UR! diff --git a/.tmp/init-check/config.yaml b/.tmp/init-check/config.yaml deleted file mode 100644 index 63b5408..0000000 --- a/.tmp/init-check/config.yaml +++ /dev/null @@ -1,35 +0,0 @@ -server: - http: - network: tcp - addr: 127.0.0.1:18001 - timeout: 60s -data: - database: - driver: sqlite - path: .tmp/init-check-data - name: kra-init - source: .tmp\init-check-data\kra-init.db - prefix: "" - log_mode: silent - config: "" - host: "" - password: "" - port: "" - user: "" - redis: - addr: "" -admin: - router_prefix: "" - jwt: - signing_key: 7bd3e9cb-e201-4982-9af9-2ea209a80179 - expires_time: 3600s - buffer_time: 300s - issuer: kra - system: - disable_auto_migrate: false - local: - store_path: .tmp/init-check-data/uploads - path_prefix: uploads/file - app: - app_id: kra - env: test diff --git a/.tmp/init-check/db/kra.db b/.tmp/init-check/db/kra.db deleted file mode 100644 index 4a2df9b266b3074fe5d3f118ec4e8bf32f45fdba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503808 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 Xsj1QNW-H`eL;z8Xs72InZ`A&Oc#9~c diff --git a/.tmp/init-smoke/config.yaml b/.tmp/init-smoke/config.yaml deleted file mode 100644 index dfeed99..0000000 --- a/.tmp/init-smoke/config.yaml +++ /dev/null @@ -1,30 +0,0 @@ -server: - http: - network: tcp - addr: 127.0.0.1:18000 - timeout: 60s -data: - database: - driver: sqlite - path: .tmp/init-smoke - name: fresh - source: "" - prefix: "" - log_mode: silent - redis: - addr: "" -admin: - router_prefix: "" - jwt: - signing_key: init-test-secret - expires_time: 3600s - buffer_time: 300s - issuer: kra - system: - disable_auto_migrate: false - local: - store_path: .tmp/init-smoke/uploads - path_prefix: uploads/file - app: - app_id: kra - env: test diff --git a/cmd/main.go b/cmd/main.go index 7f6d7c2..b683650 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -11,6 +11,7 @@ import ( "kra/internal/conf" "kra/internal/service" + "kra/internal/service/dto" "kra/internal/worker" "kra/pkg/logging" "kra/pkg/mq" @@ -43,7 +44,7 @@ func init() { func newApp(logger *slog.Logger, hs *kratoshttp.Server, scheduler *worker.TaskScheduler, audit *service.AuditRecorder, loggerControl *logging.ReloadableLogger, _ mq.Client) *kratos.App { if audit != nil && loggerControl != nil { loggerControl.SetErrorSink(logging.ErrorSinkFunc(func(ctx context.Context, entry logging.ErrorEntry) error { - return audit.CreateErrorRequest(ctx, &service.ErrorRecordRequest{Form: entry.Form, Info: entry.Info, Level: entry.Level, RequestID: entry.RequestID, TraceID: entry.TraceID}) + return audit.CreateErrorRequest(ctx, &dto.ErrorRecordRequest{Form: entry.Form, Info: entry.Info, Level: entry.Level, RequestID: entry.RequestID, TraceID: entry.TraceID}) })) } return kratos.New( diff --git a/internal/server/handler/announcement.go b/internal/server/handler/announcement.go index f4b002a..4118208 100644 --- a/internal/server/handler/announcement.go +++ b/internal/server/handler/announcement.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "time" "github.com/gin-gonic/gin" @@ -13,12 +14,12 @@ func NewAnnouncement(service *service.AnnouncementService) *Announcement { return &Announcement{service: service} } -func announcementInput(req service.AnnouncementRequest) service.AnnouncementInput { +func announcementInput(req dto.AnnouncementRequest) service.AnnouncementInput { return service.AnnouncementInput{ID: req.ID, Title: req.Title, Content: req.Content, UserID: req.UserID, Attachments: req.Attachments} } func (h *Announcement) Create(c *gin.Context) { - var req service.AnnouncementRequest + var req dto.AnnouncementRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -47,7 +48,7 @@ func (h *Announcement) DeleteByIDs(c *gin.Context) { } func (h *Announcement) Update(c *gin.Context) { - var req service.AnnouncementRequest + var req dto.AnnouncementRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -69,7 +70,7 @@ func (h *Announcement) Find(c *gin.Context) { } func (h *Announcement) List(c *gin.Context) { - var req service.AnnouncementSearchRequest + var req dto.AnnouncementSearchRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/api.go b/internal/server/handler/api.go index 5c61759..c81c452 100644 --- a/internal/server/handler/api.go +++ b/internal/server/handler/api.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -11,7 +12,7 @@ type API struct{ service *service.APIService } func NewAPI(service *service.APIService) *API { return &API{service: service} } func (h *API) List(c *gin.Context) { - var req service.APIListRequest + var req dto.APIListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -40,7 +41,7 @@ func (h *API) All(c *gin.Context) { Write(c, CodeSuccess, gin.H{"apis": items}, "获取成功") } func (h *API) Create(c *gin.Context) { - var req service.APIRequest + var req dto.APIRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -57,7 +58,7 @@ func (h *API) Create(c *gin.Context) { Write(c, CodeSuccess, created, "创建成功") } func (h *API) Update(c *gin.Context) { - var req service.APIRequest + var req dto.APIRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -73,7 +74,7 @@ func (h *API) Update(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "修改成功") } func (h *API) Delete(c *gin.Context) { - var req service.DeleteAPIRequest + var req dto.DeleteAPIRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -89,7 +90,7 @@ func (h *API) Delete(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *API) DeleteByIDs(c *gin.Context) { - var req service.DeleteAPIsRequest + var req dto.DeleteAPIsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -101,7 +102,7 @@ func (h *API) DeleteByIDs(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *API) Find(c *gin.Context) { - var req service.GetAPIRequest + var req dto.GetAPIRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -142,7 +143,7 @@ func (h *API) Roles(c *gin.Context) { Write(c, CodeSuccess, ids, "获取成功") } func (h *API) SetRoles(c *gin.Context) { - var req service.SetAPIRolesRequest + var req dto.SetAPIRolesRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -160,9 +161,9 @@ func (h *API) SetRoles(c *gin.Context) { func (h *API) Sync(engine *gin.Engine) gin.HandlerFunc { return func(c *gin.Context) { routes := engine.Routes() - values := make([]service.APIRequest, 0, len(routes)) + values := make([]dto.APIRequest, 0, len(routes)) for _, route := range routes { - values = append(values, service.APIRequest{Path: route.Path, Method: route.Method}) + values = append(values, dto.APIRequest{Path: route.Path, Method: route.Method}) } result, err := h.service.SyncAPIResponses(c.Request.Context(), values) if err != nil { @@ -173,7 +174,7 @@ func (h *API) Sync(engine *gin.Engine) gin.HandlerFunc { } } func (h *API) Ignore(c *gin.Context) { - var req service.IgnoreAPIRequest + var req dto.IgnoreAPIRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -185,7 +186,7 @@ func (h *API) Ignore(c *gin.Context) { OK(c) } func (h *API) ApplySync(c *gin.Context) { - var req service.ApplyAPISyncRequest + var req dto.ApplyAPISyncRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -205,7 +206,7 @@ func (h *API) FreshCasbin(c *gin.Context) { } func (h *API) SetPolicyPaths(c *gin.Context) { - var req service.SetPolicyPathsRequest + var req dto.SetPolicyPathsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -221,7 +222,7 @@ func (h *API) SetPolicyPaths(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *API) PolicyPaths(c *gin.Context) { - var req service.GetPolicyPathsRequest + var req dto.GetPolicyPathsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -238,7 +239,7 @@ func (h *API) PolicyPaths(c *gin.Context) { Write(c, CodeSuccess, gin.H{"paths": paths}, "获取成功") } -func validateAPIRequest(req *service.APIRequest) string { +func validateAPIRequest(req *dto.APIRequest) string { switch { case req.Path == "": return "Path值不能为空" diff --git a/internal/server/handler/api_token.go b/internal/server/handler/api_token.go index 6953eae..fa8096a 100644 --- a/internal/server/handler/api_token.go +++ b/internal/server/handler/api_token.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -15,7 +16,7 @@ func NewAPIToken(service *service.TokenService) *APIToken { } func (h *APIToken) Create(c *gin.Context) { - var req service.CreateAPITokenRequest + var req dto.CreateAPITokenRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -29,7 +30,7 @@ func (h *APIToken) Create(c *gin.Context) { } func (h *APIToken) List(c *gin.Context) { - var req service.APITokenListRequest + var req dto.APITokenListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -43,7 +44,7 @@ func (h *APIToken) List(c *gin.Context) { } func (h *APIToken) Delete(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/audit.go b/internal/server/handler/audit.go index e860a80..1090fcb 100644 --- a/internal/server/handler/audit.go +++ b/internal/server/handler/audit.go @@ -8,6 +8,7 @@ import ( "kra/internal/biz" "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -24,7 +25,7 @@ func NewAudit(service *service.AuditService, recorder *service.AuditRecorder, lo } func (h *Audit) Operations(c *gin.Context) { - var req service.OperationRecordSearchRequest + var req dto.OperationRecordSearchRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -37,7 +38,7 @@ func (h *Audit) Operations(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功") } func (h *Audit) Operation(c *gin.Context) { - var req service.AuditIDQuery + var req dto.AuditIDQuery if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -54,7 +55,7 @@ func (h *Audit) Operation(c *gin.Context) { Write(c, CodeSuccess, gin.H{"reSysOperationRecord": item}, "查询成功") } func (h *Audit) DeleteOperation(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -66,7 +67,7 @@ func (h *Audit) DeleteOperation(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Audit) DeleteOperations(c *gin.Context) { - var req service.AuditIDsRequest + var req dto.AuditIDsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -79,7 +80,7 @@ func (h *Audit) DeleteOperations(c *gin.Context) { } func (h *Audit) Logins(c *gin.Context) { - var req service.LoginLogSearchRequest + var req dto.LoginLogSearchRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -92,7 +93,7 @@ func (h *Audit) Logins(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功") } func (h *Audit) Login(c *gin.Context) { - var req service.AuditIDQuery + var req dto.AuditIDQuery if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -105,7 +106,7 @@ func (h *Audit) Login(c *gin.Context) { Write(c, CodeSuccess, item, "查询成功") } func (h *Audit) DeleteLogin(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -117,7 +118,7 @@ func (h *Audit) DeleteLogin(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Audit) DeleteLogins(c *gin.Context) { - var req service.AuditIDsRequest + var req dto.AuditIDsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -130,7 +131,7 @@ func (h *Audit) DeleteLogins(c *gin.Context) { } func (h *Audit) DataAccess(c *gin.Context) { - var req service.DataAccessListRequest + var req dto.DataAccessListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -143,7 +144,7 @@ func (h *Audit) DataAccess(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功") } func (h *Audit) DeleteDataAccess(c *gin.Context) { - var req service.IDsRequest + var req dto.IDsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -246,7 +247,7 @@ func (h *Audit) DeleteErrors(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "批量删除成功") } func (h *Audit) UpdateError(c *gin.Context) { - var req service.ErrorRecordMutationRequest + var req dto.ErrorRecordMutationRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -289,7 +290,7 @@ func (h *Audit) Errors(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: p, PageSize: size}, "获取成功") } func (h *Audit) CreateError(c *gin.Context) { - var req service.ErrorRecordMutationRequest + var req dto.ErrorRecordMutationRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/authority.go b/internal/server/handler/authority.go index 5af9d73..22f5f0a 100644 --- a/internal/server/handler/authority.go +++ b/internal/server/handler/authority.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -19,7 +20,7 @@ func (h *Authority) List(c *gin.Context) { Write(c, CodeSuccess, items, "获取成功") } func (h *Authority) Create(c *gin.Context) { - var req service.AuthorityRequest + var req dto.AuthorityRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -40,7 +41,7 @@ func (h *Authority) Create(c *gin.Context) { Write(c, CodeSuccess, gin.H{"authority": value}, "创建成功") } func (h *Authority) Copy(c *gin.Context) { - var req service.CopyAuthorityRequest + var req dto.CopyAuthorityRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -65,7 +66,7 @@ func (h *Authority) Copy(c *gin.Context) { Write(c, CodeSuccess, gin.H{"authority": value}, "拷贝成功") } func (h *Authority) Update(c *gin.Context) { - var req service.AuthorityRequest + var req dto.AuthorityRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -86,7 +87,7 @@ func (h *Authority) Update(c *gin.Context) { Write(c, CodeSuccess, gin.H{"authority": value}, "更新成功") } func (h *Authority) Delete(c *gin.Context) { - var req service.DeleteAuthorityRequest + var req dto.DeleteAuthorityRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -102,7 +103,7 @@ func (h *Authority) Delete(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Authority) SetUsers(c *gin.Context) { - var req service.SetRoleUsersRequest + var req dto.SetRoleUsersRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -118,7 +119,7 @@ func (h *Authority) SetUsers(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "设置成功") } func (h *Authority) Users(c *gin.Context) { - var req service.SetRoleUsersRequest + var req dto.SetRoleUsersRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -134,7 +135,7 @@ func (h *Authority) Users(c *gin.Context) { Write(c, CodeSuccess, ids, "获取成功") } func (h *Authority) SetDataScope(c *gin.Context) { - var req service.SetDataScopeRequest + var req dto.SetDataScopeRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -150,7 +151,7 @@ func (h *Authority) SetDataScope(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "设置成功") } func (h *Authority) DataScopeDepartments(c *gin.Context) { - var req service.SetDataScopeRequest + var req dto.SetDataScopeRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/dictionary.go b/internal/server/handler/dictionary.go index ad9f991..652a58d 100644 --- a/internal/server/handler/dictionary.go +++ b/internal/server/handler/dictionary.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "strconv" "github.com/gin-gonic/gin" @@ -14,7 +15,7 @@ func NewDictionary(service *service.DictionaryService) *Dictionary { } func (h *Dictionary) Create(c *gin.Context) { - var req service.DictionaryRequest + var req dto.DictionaryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -27,7 +28,7 @@ func (h *Dictionary) Create(c *gin.Context) { Write(c, CodeSuccess, created, "创建成功") } func (h *Dictionary) Update(c *gin.Context) { - var req service.DictionaryRequest + var req dto.DictionaryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -39,7 +40,7 @@ func (h *Dictionary) Update(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *Dictionary) Delete(c *gin.Context) { - var req service.DictionaryRequest + var req dto.DictionaryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -51,7 +52,7 @@ func (h *Dictionary) Delete(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Dictionary) Find(c *gin.Context) { - var req service.DictionaryRequest + var req dto.DictionaryRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -74,7 +75,7 @@ func (h *Dictionary) List(details bool) gin.HandlerFunc { } } func (h *Dictionary) Export(c *gin.Context) { - var req service.DictionaryRequest + var req dto.DictionaryRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -91,7 +92,7 @@ func (h *Dictionary) Export(c *gin.Context) { Write(c, CodeSuccess, item, "导出成功") } func (h *Dictionary) Import(c *gin.Context) { - var req service.ImportDictionaryRequest + var req dto.ImportDictionaryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -104,7 +105,7 @@ func (h *Dictionary) Import(c *gin.Context) { } func (h *Dictionary) CreateDetail(c *gin.Context) { - var req service.DictionaryDetailRequest + var req dto.DictionaryDetailRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -116,7 +117,7 @@ func (h *Dictionary) CreateDetail(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "创建成功") } func (h *Dictionary) UpdateDetail(c *gin.Context) { - var req service.DictionaryDetailRequest + var req dto.DictionaryDetailRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -128,7 +129,7 @@ func (h *Dictionary) UpdateDetail(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *Dictionary) DeleteDetail(c *gin.Context) { - var req service.DictionaryDetailRequest + var req dto.DictionaryDetailRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -140,7 +141,7 @@ func (h *Dictionary) DeleteDetail(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Dictionary) FindDetail(c *gin.Context) { - var req service.DictionaryDetailRequest + var req dto.DictionaryDetailRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -171,7 +172,7 @@ func (h *Dictionary) Details(c *gin.Context) { return } } - filter := service.DictionaryDetailListRequest{DictionaryID: uint(dictionaryID), Label: c.Query("label"), Value: c.Query("value")} + filter := dto.DictionaryDetailListRequest{DictionaryID: uint(dictionaryID), Label: c.Query("label"), Value: c.Query("value")} if raw, exists := c.GetQuery("status"); exists { value, parseErr := strconv.ParseBool(raw) if parseErr != nil { @@ -231,7 +232,7 @@ func (h *Dictionary) Tree(byType bool) gin.HandlerFunc { } } func (h *Dictionary) DetailsByParent(c *gin.Context) { - var req service.DictionaryDetailsByParentRequest + var req dto.DictionaryDetailsByParentRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/email.go b/internal/server/handler/email.go index 4be30bb..2446c2e 100644 --- a/internal/server/handler/email.go +++ b/internal/server/handler/email.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -19,7 +20,7 @@ func (h *Email) Test(c *gin.Context) { } func (h *Email) Send(c *gin.Context) { - var req service.SendEmailRequest + var req dto.SendEmailRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/export.go b/internal/server/handler/export.go index c64de7b..d4889ab 100644 --- a/internal/server/handler/export.go +++ b/internal/server/handler/export.go @@ -3,6 +3,7 @@ package handler import ( "errors" "kra/internal/service" + "kra/internal/service/dto" "net/http" "net/url" "strings" @@ -42,7 +43,7 @@ func exportIssueParams(values url.Values, blank bool) (map[string]string, error) } func (h *Export) Create(c *gin.Context) { - var req service.ExportTemplateRequest + var req dto.ExportTemplateRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -58,7 +59,7 @@ func (h *Export) Create(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "创建成功") } func (h *Export) Update(c *gin.Context) { - var req service.ExportTemplateRequest + var req dto.ExportTemplateRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -74,7 +75,7 @@ func (h *Export) Update(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *Export) Delete(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -92,7 +93,7 @@ func (h *Export) Delete(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Export) DeleteMany(c *gin.Context) { - var req service.IDsRequest + var req dto.IDsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -104,7 +105,7 @@ func (h *Export) DeleteMany(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "批量删除成功") } func (h *Export) Find(c *gin.Context) { - var req service.ExportTemplateRequest + var req dto.ExportTemplateRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/integration_config.go b/internal/server/handler/integration_config.go index 173f340..b1184db 100644 --- a/internal/server/handler/integration_config.go +++ b/internal/server/handler/integration_config.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -33,7 +34,7 @@ func (h *IntegrationConfig) Find(c *gin.Context) { } func (h *IntegrationConfig) Save(c *gin.Context) { - var req service.IntegrationConfigRequest + var req dto.IntegrationConfigRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/media.go b/internal/server/handler/media.go index a60922f..e3efaf3 100644 --- a/internal/server/handler/media.go +++ b/internal/server/handler/media.go @@ -3,6 +3,7 @@ package handler import ( "errors" "kra/internal/service" + "kra/internal/service/dto" "net/http" "strconv" @@ -66,7 +67,7 @@ func (h *Media) Upload(c *gin.Context) { } func (h *Media) List(c *gin.Context) { - var req service.MediaListRequest + var req dto.MediaListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -79,7 +80,7 @@ func (h *Media) List(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功") } func (h *Media) Delete(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -91,7 +92,7 @@ func (h *Media) Delete(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Media) DeleteMany(c *gin.Context) { - var req service.MediaBatchDeleteRequest + var req dto.MediaBatchDeleteRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -122,7 +123,7 @@ func (h *Media) Find(c *gin.Context) { OKWithData(c, item) } func (h *Media) Rename(c *gin.Context) { - var req service.RenameMediaRequest + var req dto.RenameMediaRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -134,7 +135,7 @@ func (h *Media) Rename(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "编辑成功") } func (h *Media) ImportURLs(c *gin.Context) { - var req []service.ImportMediaRequest + var req []dto.ImportMediaRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -146,7 +147,7 @@ func (h *Media) ImportURLs(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "导入URL成功") } func (h *Media) Storage(c *gin.Context) { - var req service.StorageListRequest + var req dto.StorageListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -168,7 +169,7 @@ func (h *Media) Categories(c *gin.Context) { OKWithData(c, items) } func (h *Media) SaveCategory(c *gin.Context) { - var req service.CategoryRequest + var req dto.CategoryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, "参数错误") return @@ -180,7 +181,7 @@ func (h *Media) SaveCategory(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "创建/更新成功") } func (h *Media) DeleteCategory(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if c.ShouldBindJSON(&req) != nil || req.ID == 0 { Fail(c, "参数错误") return @@ -194,7 +195,7 @@ func (h *Media) DeleteCategory(c *gin.Context) { func (h *Media) InitUpload(c *gin.Context) { claims := Claims(c) - var req service.InitUploadRequest + var req dto.InitUploadRequest if claims == nil { Fail(c, "参数错误") return @@ -257,7 +258,7 @@ func (h *Media) SaveChunk(c *gin.Context) { } func (h *Media) CompleteUpload(c *gin.Context) { claims := Claims(c) - var req service.CompleteUploadRequest + var req dto.CompleteUploadRequest if claims == nil { Fail(c, "参数错误") return diff --git a/internal/server/handler/menu.go b/internal/server/handler/menu.go index 4e3acd1..e0014b2 100644 --- a/internal/server/handler/menu.go +++ b/internal/server/handler/menu.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -29,7 +30,7 @@ func (h *Menu) Tree(c *gin.Context) { } func (h *Menu) Create(c *gin.Context) { - var req service.MenuRequest + var req dto.MenuRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -62,7 +63,7 @@ func (h *Menu) Create(c *gin.Context) { } func (h *Menu) Update(c *gin.Context) { - var req service.MenuRequest + var req dto.MenuRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -95,7 +96,7 @@ func (h *Menu) Update(c *gin.Context) { } func (h *Menu) Delete(c *gin.Context) { - var req service.DeleteMenuRequest + var req dto.DeleteMenuRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -112,7 +113,7 @@ func (h *Menu) Delete(c *gin.Context) { } func (h *Menu) Find(c *gin.Context) { - var req service.GetMenuRequest + var req dto.GetMenuRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -130,7 +131,7 @@ func (h *Menu) Find(c *gin.Context) { } func (h *Menu) SetAuthorityMenus(c *gin.Context) { - var req service.SetAuthorityMenusRequest + var req dto.SetAuthorityMenusRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -147,7 +148,7 @@ func (h *Menu) SetAuthorityMenus(c *gin.Context) { } func (h *Menu) AuthorityMenus(c *gin.Context) { - var req service.GetAuthorityMenusRequest + var req dto.GetAuthorityMenusRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -165,7 +166,7 @@ func (h *Menu) AuthorityMenus(c *gin.Context) { } func (h *Menu) RoleIDs(c *gin.Context) { - var req service.SetMenuRolesRequest + var req dto.SetMenuRolesRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -194,7 +195,7 @@ func (h *Menu) RoleIDs(c *gin.Context) { } func (h *Menu) SetRoles(c *gin.Context) { - var req service.SetMenuRolesRequest + var req dto.SetMenuRolesRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/organization.go b/internal/server/handler/organization.go index 187df43..4ae923c 100644 --- a/internal/server/handler/organization.go +++ b/internal/server/handler/organization.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -16,7 +17,7 @@ func NewOrganization(departments *service.DepartmentService, positions *service. } func (h *Organization) ListDepartments(c *gin.Context) { - var req service.DepartmentListRequest + var req dto.DepartmentListRequest _ = c.ShouldBindJSON(&req) items, err := h.departments.Departments(c.Request.Context(), req.Name) if err != nil { @@ -26,7 +27,7 @@ func (h *Organization) ListDepartments(c *gin.Context) { Write(c, CodeSuccess, items, "获取成功") } func (h *Organization) CreateDepartment(c *gin.Context) { - var req service.DepartmentRequest + var req dto.DepartmentRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -42,7 +43,7 @@ func (h *Organization) CreateDepartment(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "创建成功") } func (h *Organization) UpdateDepartment(c *gin.Context) { - var req service.DepartmentRequest + var req dto.DepartmentRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -58,7 +59,7 @@ func (h *Organization) UpdateDepartment(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *Organization) DeleteDepartment(c *gin.Context) { - var req service.DeleteDepartmentRequest + var req dto.DeleteDepartmentRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -70,7 +71,7 @@ func (h *Organization) DeleteDepartment(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Organization) FindDepartment(c *gin.Context) { - var req service.DeleteDepartmentRequest + var req dto.DeleteDepartmentRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -83,7 +84,7 @@ func (h *Organization) FindDepartment(c *gin.Context) { Write(c, CodeSuccess, item, "获取成功") } func (h *Organization) DepartmentUsers(c *gin.Context) { - var req service.SetDepartmentUsersRequest + var req dto.SetDepartmentUsersRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -99,7 +100,7 @@ func (h *Organization) DepartmentUsers(c *gin.Context) { Write(c, CodeSuccess, ids, "获取成功") } func (h *Organization) SetDepartmentUsers(c *gin.Context) { - var req service.SetDepartmentUsersRequest + var req dto.SetDepartmentUsersRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -115,7 +116,7 @@ func (h *Organization) SetDepartmentUsers(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "设置成功") } func (h *Organization) SetUserDepartments(c *gin.Context) { - var req service.SetUserDepartmentsRequest + var req dto.SetUserDepartmentsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -132,7 +133,7 @@ func (h *Organization) SetUserDepartments(c *gin.Context) { } func (h *Organization) ListPositions(c *gin.Context) { - var req service.PositionListRequest + var req dto.PositionListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -145,7 +146,7 @@ func (h *Organization) ListPositions(c *gin.Context) { Write(c, CodeSuccess, PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功") } func (h *Organization) CreatePosition(c *gin.Context) { - var req service.PositionRequest + var req dto.PositionRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -161,7 +162,7 @@ func (h *Organization) CreatePosition(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "创建成功") } func (h *Organization) UpdatePosition(c *gin.Context) { - var req service.PositionRequest + var req dto.PositionRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -177,7 +178,7 @@ func (h *Organization) UpdatePosition(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "更新成功") } func (h *Organization) DeletePosition(c *gin.Context) { - var req service.DeletePositionRequest + var req dto.DeletePositionRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -189,7 +190,7 @@ func (h *Organization) DeletePosition(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "删除成功") } func (h *Organization) FindPosition(c *gin.Context) { - var req service.DeletePositionRequest + var req dto.DeletePositionRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -202,7 +203,7 @@ func (h *Organization) FindPosition(c *gin.Context) { Write(c, CodeSuccess, item, "获取成功") } func (h *Organization) PositionUsers(c *gin.Context) { - var req service.SetPositionUsersRequest + var req dto.SetPositionUsersRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -218,7 +219,7 @@ func (h *Organization) PositionUsers(c *gin.Context) { Write(c, CodeSuccess, ids, "获取成功") } func (h *Organization) SetPositionUsers(c *gin.Context) { - var req service.SetPositionUsersRequest + var req dto.SetPositionUsersRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -234,7 +235,7 @@ func (h *Organization) SetPositionUsers(c *gin.Context) { Write(c, CodeSuccess, gin.H{}, "设置成功") } func (h *Organization) SetUserPositions(c *gin.Context) { - var req service.SetUserPositionsRequest + var req dto.SetUserPositionsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/parameter.go b/internal/server/handler/parameter.go index 34da9af..d92793e 100644 --- a/internal/server/handler/parameter.go +++ b/internal/server/handler/parameter.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -15,7 +16,7 @@ func NewParameter(service *service.ParameterService) *Parameter { } func (h *Parameter) Create(c *gin.Context) { - var req service.SystemParameterRequest + var req dto.SystemParameterRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -28,7 +29,7 @@ func (h *Parameter) Create(c *gin.Context) { } func (h *Parameter) Update(c *gin.Context) { - var req service.SystemParameterRequest + var req dto.SystemParameterRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -76,7 +77,7 @@ func (h *Parameter) Get(c *gin.Context) { } func (h *Parameter) List(c *gin.Context) { - var req service.SystemParameterSearchRequest + var req dto.SystemParameterSearchRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/payment.go b/internal/server/handler/payment.go index b780441..9dade84 100644 --- a/internal/server/handler/payment.go +++ b/internal/server/handler/payment.go @@ -3,6 +3,7 @@ package handler import ( "io" "kra/internal/service" + "kra/internal/service/dto" "net/http" "github.com/gin-gonic/gin" @@ -12,7 +13,7 @@ type Payment struct{ service *service.PaymentService } func NewPayment(service *service.PaymentService) *Payment { return &Payment{service: service} } func (h *Payment) Order(c *gin.Context) { - var req service.PaymentQueryRequest + var req dto.PaymentQueryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -42,7 +43,7 @@ func (h *Payment) RefundByPath(c *gin.Context) { Fail(c, err.Error()) return } - result, err := h.service.Refund(c.Request.Context(), &service.PaymentRefundRequest{ + result, err := h.service.Refund(c.Request.Context(), &dto.PaymentRefundRequest{ Provider: c.Param("provider"), TradeNo: c.Param("tradeNo"), Amount: req.Amount, }) if err != nil { @@ -53,7 +54,7 @@ func (h *Payment) RefundByPath(c *gin.Context) { } func (h *Payment) FulfillByPath(c *gin.Context) { - result, err := h.service.Fulfill(c.Request.Context(), &service.PaymentFulfillRequest{ + result, err := h.service.Fulfill(c.Request.Context(), &dto.PaymentFulfillRequest{ Provider: c.Param("provider"), TradeNo: c.Param("tradeNo"), }) if err != nil { @@ -64,7 +65,7 @@ func (h *Payment) FulfillByPath(c *gin.Context) { } func (h *Payment) Orders(c *gin.Context) { - var req service.PaymentOrderListRequest + var req dto.PaymentOrderListRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -90,7 +91,7 @@ func (h *Payment) TestProvider(c *gin.Context) { OKWithData(c, result) } func (h *Payment) Create(c *gin.Context) { - var req service.PaymentRequest + var req dto.PaymentRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -104,7 +105,7 @@ func (h *Payment) Create(c *gin.Context) { OKWithData(c, result) } func (h *Payment) Query(c *gin.Context) { - var req service.PaymentQueryRequest + var req dto.PaymentQueryRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -117,7 +118,7 @@ func (h *Payment) Query(c *gin.Context) { OKWithData(c, result) } func (h *Payment) Refund(c *gin.Context) { - var req service.PaymentRefundRequest + var req dto.PaymentRefundRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -131,7 +132,7 @@ func (h *Payment) Refund(c *gin.Context) { } func (h *Payment) Fulfill(c *gin.Context) { - var req service.PaymentFulfillRequest + var req dto.PaymentFulfillRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -162,12 +163,12 @@ func (h *Payment) Callback(c *gin.Context) { query[k] = v[0] } } - ack, err := h.service.Callback(c.Request.Context(), &service.PaymentCallbackRequest{Provider: c.Param("provider"), Headers: headers, Body: raw, Query: query}) + ack, err := h.service.Callback(c.Request.Context(), &dto.PaymentCallbackRequest{Provider: c.Param("provider"), Headers: headers, Body: raw, Query: query}) writePaymentCallbackAck(c, ack) _ = err } -func writePaymentCallbackAck(c *gin.Context, ack service.PaymentCallbackAck) { +func writePaymentCallbackAck(c *gin.Context, ack dto.PaymentCallbackAck) { if ack.StatusCode == 0 { ack.StatusCode = http.StatusInternalServerError } diff --git a/internal/server/handler/payment_test.go b/internal/server/handler/payment_test.go index 2f47ae9..88a3312 100644 --- a/internal/server/handler/payment_test.go +++ b/internal/server/handler/payment_test.go @@ -1,18 +1,18 @@ package handler import ( + "kra/internal/service/dto" "net/http/httptest" "testing" "github.com/gin-gonic/gin" - "kra/internal/service" ) func TestWritePaymentCallbackAckDoesNotExposeError(t *testing.T) { gin.SetMode(gin.TestMode) recorder := httptest.NewRecorder() context, _ := gin.CreateTestContext(recorder) - writePaymentCallbackAck(context, service.PaymentCallbackAck{ + writePaymentCallbackAck(context, dto.PaymentCallbackAck{ StatusCode: 500, ContentType: "text/plain; charset=utf-8", Body: []byte("failure"), diff --git a/internal/server/handler/permission.go b/internal/server/handler/permission.go index 57e8eb7..d4b9745 100644 --- a/internal/server/handler/permission.go +++ b/internal/server/handler/permission.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -13,7 +14,7 @@ func NewPermission(service *service.PermissionService) *Permission { } func (h *Permission) Buttons(c *gin.Context) { - var req service.GetAuthorityButtonsRequest + var req dto.GetAuthorityButtonsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -27,7 +28,7 @@ func (h *Permission) Buttons(c *gin.Context) { } func (h *Permission) SetButtons(c *gin.Context) { - var req service.SetAuthorityButtonsRequest + var req dto.SetAuthorityButtonsRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/public.go b/internal/server/handler/public.go index b763329..9720326 100644 --- a/internal/server/handler/public.go +++ b/internal/server/handler/public.go @@ -9,6 +9,7 @@ import ( "kra/internal/biz" "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" @@ -58,7 +59,7 @@ func (h *Public) Captcha(c *gin.Context) { } func (h *Public) Login(c *gin.Context) { - var req service.LoginRequest + var req dto.LoginRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -126,15 +127,15 @@ func (h *Public) InitializeDatabase(engine *gin.Engine) gin.HandlerFunc { Fail(c, "已存在数据库配置") return } - var input service.DatabaseInitRequest + var input dto.DatabaseInitRequest if c.ShouldBindJSON(&input) != nil { Fail(c, "参数校验不通过") return } routes := engine.Routes() - values := make([]service.Route, 0, len(routes)) + values := make([]dto.Route, 0, len(routes)) for _, route := range routes { - values = append(values, service.Route{Path: route.Path, Method: route.Method}) + values = append(values, dto.Route{Path: route.Path, Method: route.Method}) } if err := h.system.InitializeRoutes(c.Request.Context(), &input, values); err != nil { Fail(c, "自动创建数据库失败,请查看后台日志,检查后在进行初始化") diff --git a/internal/server/handler/system_config.go b/internal/server/handler/system_config.go index 221ad27..1dcac3c 100644 --- a/internal/server/handler/system_config.go +++ b/internal/server/handler/system_config.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -25,7 +26,7 @@ func (h *SystemConfig) GetSecurity(c *gin.Context) { } func (h *SystemConfig) SetSecurity(c *gin.Context) { - var req service.SecurityConfigRequest + var req dto.SecurityConfigRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -48,7 +49,7 @@ func (h *SystemConfig) Get(c *gin.Context) { } func (h *SystemConfig) Set(c *gin.Context) { - var req service.SetSystemConfigRequest + var req dto.SetSystemConfigRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/task.go b/internal/server/handler/task.go index 29d2664..77ca735 100644 --- a/internal/server/handler/task.go +++ b/internal/server/handler/task.go @@ -3,6 +3,7 @@ package handler import ( "fmt" "kra/internal/service" + "kra/internal/service/dto" "net/http" "time" @@ -18,7 +19,7 @@ func NewTask(service *service.TaskService) *Task { } func (h *Task) Create(c *gin.Context) { - var req service.TaskRequest + var req dto.TaskRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -32,7 +33,7 @@ func (h *Task) Create(c *gin.Context) { } func (h *Task) Update(c *gin.Context) { - var req service.TaskRequest + var req dto.TaskRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -45,7 +46,7 @@ func (h *Task) Update(c *gin.Context) { } func (h *Task) Delete(c *gin.Context) { - var req service.DeleteTaskRequest + var req dto.DeleteTaskRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -58,7 +59,7 @@ func (h *Task) Delete(c *gin.Context) { } func (h *Task) Toggle(c *gin.Context) { - var req service.ToggleTaskRequest + var req dto.ToggleTaskRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -71,7 +72,7 @@ func (h *Task) Toggle(c *gin.Context) { } func (h *Task) Trigger(c *gin.Context) { - var req service.DeleteTaskRequest + var req dto.DeleteTaskRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -84,7 +85,7 @@ func (h *Task) Trigger(c *gin.Context) { } func (h *Task) List(c *gin.Context) { - var req service.TaskListRequest + var req dto.TaskListRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -98,7 +99,7 @@ func (h *Task) List(c *gin.Context) { } func (h *Task) Logs(c *gin.Context) { - var req service.TaskLogListRequest + var req dto.TaskLogListRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return diff --git a/internal/server/handler/user.go b/internal/server/handler/user.go index 13d0b22..a9aa855 100644 --- a/internal/server/handler/user.go +++ b/internal/server/handler/user.go @@ -2,6 +2,7 @@ package handler import ( "kra/internal/service" + "kra/internal/service/dto" "strconv" "time" @@ -18,7 +19,7 @@ func NewUser(user *service.UserService, auth *service.AuthService) *User { } func (h *User) List(c *gin.Context) { - var req service.UserListRequest + var req dto.UserListRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -40,7 +41,7 @@ func (h *User) List(c *gin.Context) { } func (h *User) Create(c *gin.Context) { - var req service.UserRequest + var req dto.UserRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -68,7 +69,7 @@ func (h *User) Create(c *gin.Context) { return } if result == nil { - result = &service.UserResponse{} + result = &dto.UserResponse{} } Write(c, CodeError, gin.H{"user": result}, "注册失败") return @@ -77,7 +78,7 @@ func (h *User) Create(c *gin.Context) { } func (h *User) Update(c *gin.Context) { - var req service.UserRequest + var req dto.UserRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -99,7 +100,7 @@ func (h *User) UpdateSelf(c *gin.Context) { NoAuth(c, "未登录或非法访问") return } - var req service.SelfUserRequest + var req dto.SelfUserRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -112,7 +113,7 @@ func (h *User) UpdateSelf(c *gin.Context) { } func (h *User) Delete(c *gin.Context) { - var req service.IDRequest + var req dto.IDRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -134,7 +135,7 @@ func (h *User) Delete(c *gin.Context) { } func (h *User) ResetPassword(c *gin.Context) { - var req service.ResetPasswordRequest + var req dto.ResetPasswordRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -152,7 +153,7 @@ func (h *User) ResetPassword(c *gin.Context) { func (h *User) ChangePassword(c *gin.Context) { claims := Claims(c) - var req service.ChangePasswordRequest + var req dto.ChangePasswordRequest if claims == nil { NoAuth(c, "未登录或非法访问") return @@ -199,7 +200,7 @@ func (h *User) SetSelfSetting(c *gin.Context) { } func (h *User) SetAuthorities(c *gin.Context) { - var req service.UserAuthoritiesRequest + var req dto.UserAuthoritiesRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -213,7 +214,7 @@ func (h *User) SetAuthorities(c *gin.Context) { func (h *User) SwitchAuthority(c *gin.Context) { claims := Claims(c) - var req service.SwitchAuthorityRequest + var req dto.SwitchAuthorityRequest if claims == nil { NoAuth(c, "未登录或非法访问") return diff --git a/internal/server/handler/version.go b/internal/server/handler/version.go index 944af99..8729d05 100644 --- a/internal/server/handler/version.go +++ b/internal/server/handler/version.go @@ -9,6 +9,7 @@ import ( "kra/internal/biz" "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -56,7 +57,7 @@ func (h *Version) Find(c *gin.Context) { OKWithData(c, item) } func (h *Version) List(c *gin.Context) { - var req service.VersionSearchRequest + var req dto.VersionSearchRequest if err := c.ShouldBindQuery(&req); err != nil { Fail(c, err.Error()) return @@ -81,7 +82,7 @@ func (h *Version) List(c *gin.Context) { } func (h *Version) Export(c *gin.Context) { - var req service.ExportVersionRequest + var req dto.ExportVersionRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, err.Error()) return @@ -124,7 +125,7 @@ func (h *Version) Download(c *gin.Context) { c.Data(http.StatusOK, "application/json", []byte(raw)) } func (h *Version) Import(c *gin.Context) { - var req service.ImportVersionRequest + var req dto.ImportVersionRequest if err := c.ShouldBindJSON(&req); err != nil { Fail(c, "解析JSON数据失败:"+err.Error()) return diff --git a/internal/server/middleware/audit.go b/internal/server/middleware/audit.go index ed13a6e..e482bf6 100644 --- a/internal/server/middleware/audit.go +++ b/internal/server/middleware/audit.go @@ -14,6 +14,7 @@ import ( "kra/internal/conf" "kra/internal/service" + "kra/internal/service/dto" "github.com/gin-gonic/gin" ) @@ -80,7 +81,7 @@ func OperationAudit(runtime *conf.Runtime, recorder *service.AuditRecorder) gin. responseBody = "[超出记录长度]" } errorMessage := c.Errors.ByType(gin.ErrorTypePrivate).String() - if err := recorder.RecordOperationRequest(c.Request.Context(), &service.OperationRecordRequest{IP: c.ClientIP(), Method: c.Request.Method, Path: path, Status: status, LatencyMS: time.Since(started).Milliseconds(), Agent: c.Request.UserAgent(), ErrorMessage: errorMessage, Body: operationRequestBody(requestBody, c.GetHeader("Content-Type"), maxBytes), Response: responseBody, UserID: userID, RequestID: stringValue(requestID), TraceID: stringValueFromContext(c, "trace_id"), DeviceID: c.GetHeader("X-Device-Id")}); err != nil { + if err := recorder.RecordOperationRequest(c.Request.Context(), &dto.OperationRecordRequest{IP: c.ClientIP(), Method: c.Request.Method, Path: path, Status: status, LatencyMS: time.Since(started).Milliseconds(), Agent: c.Request.UserAgent(), ErrorMessage: errorMessage, Body: operationRequestBody(requestBody, c.GetHeader("Content-Type"), maxBytes), Response: responseBody, UserID: userID, RequestID: stringValue(requestID), TraceID: stringValueFromContext(c, "trace_id"), DeviceID: c.GetHeader("X-Device-Id")}); err != nil { // Preserve the business response, but expose audit persistence failures // to the global access/error logging pipeline. c.Set(ctxOperationAuditPersistFailedKey, true) diff --git a/internal/service/announcement.go b/internal/service/announcement.go index 51f8607..b85a727 100644 --- a/internal/service/announcement.go +++ b/internal/service/announcement.go @@ -6,6 +6,7 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) type AnnouncementInput struct { @@ -22,8 +23,8 @@ func NewAnnouncementService(uc *biz.AnnouncementUsecase) *AnnouncementService { return &AnnouncementService{uc: uc} } -func announcementDTO(item *biz.Announcement) *AnnouncementResponse { - return &AnnouncementResponse{ID: item.ID, CreatedAt: item.CreatedAt, UpdatedAt: item.UpdatedAt, DeletedAt: nil, Title: item.Title, Content: item.Content, UserID: item.UserID, Attachments: json.RawMessage(item.Attachments)} +func announcementDTO(item *biz.Announcement) *dto.AnnouncementResponse { + return &dto.AnnouncementResponse{ID: item.ID, CreatedAt: item.CreatedAt, UpdatedAt: item.UpdatedAt, DeletedAt: nil, Title: item.Title, Content: item.Content, UserID: item.UserID, Attachments: json.RawMessage(item.Attachments)} } func announcementDO(in AnnouncementInput) *biz.Announcement { @@ -46,7 +47,7 @@ func (s *AnnouncementService) DeleteByIDs(ctx context.Context, ids []string) err return s.uc.DeleteByIDs(ctx, ids) } -func (s *AnnouncementService) Find(ctx context.Context, id string) (*AnnouncementResponse, error) { +func (s *AnnouncementService) Find(ctx context.Context, id string) (*dto.AnnouncementResponse, error) { item, err := s.uc.Find(ctx, id) if err != nil { return nil, err @@ -54,26 +55,26 @@ func (s *AnnouncementService) Find(ctx context.Context, id string) (*Announcemen return announcementDTO(item), nil } -func (s *AnnouncementService) List(ctx context.Context, page, pageSize int, start, end *time.Time) ([]*AnnouncementResponse, int64, error) { +func (s *AnnouncementService) List(ctx context.Context, page, pageSize int, start, end *time.Time) ([]*dto.AnnouncementResponse, int64, error) { items, total, err := s.uc.List(ctx, biz.AnnouncementFilter{Page: page, PageSize: pageSize, StartCreatedAt: start, EndCreatedAt: end}) if err != nil { return nil, 0, err } - result := make([]*AnnouncementResponse, 0, len(items)) + result := make([]*dto.AnnouncementResponse, 0, len(items)) for _, item := range items { result = append(result, announcementDTO(item)) } return result, total, nil } -func (s *AnnouncementService) UserOptions(ctx context.Context) ([]*SelectOptionResponse, error) { +func (s *AnnouncementService) UserOptions(ctx context.Context) ([]*dto.SelectOptionResponse, error) { items, err := s.uc.UserOptions(ctx) if err != nil { return nil, err } - result := make([]*SelectOptionResponse, 0, len(items)) + result := make([]*dto.SelectOptionResponse, 0, len(items)) for _, item := range items { - result = append(result, &SelectOptionResponse{Label: item.Label, Value: item.Value}) + result = append(result, &dto.SelectOptionResponse{Label: item.Label, Value: item.Value}) } return result, nil } diff --git a/internal/service/api.go b/internal/service/api.go index 1a93b0c..820be99 100644 --- a/internal/service/api.go +++ b/internal/service/api.go @@ -5,6 +5,7 @@ import ( "strings" "kra/internal/biz" + "kra/internal/service/dto" ) type APIService struct { @@ -23,23 +24,23 @@ func (s *APIService) NormalizeRoutePath(path string) string { return NormalizeRoutePath(path, s.settings.RouterPrefix()) } -func (s *APIService) apiDomain(value *APIRequest) *biz.API { +func (s *APIService) apiDomain(value *dto.APIRequest) *biz.API { return &biz.API{ID: value.ID, Path: s.NormalizeRoutePath(value.Path), Description: value.Description, APIGroup: value.APIGroup, Method: value.Method} } -func apiResponse(value *biz.API) *APIResponse { - return &APIResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Path: value.Path, Description: value.Description, APIGroup: value.APIGroup, Method: value.Method} +func apiResponse(value *biz.API) *dto.APIResponse { + return &dto.APIResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Path: value.Path, Description: value.Description, APIGroup: value.APIGroup, Method: value.Method} } -func apiResponses(items []*biz.API) []*APIResponse { - out := make([]*APIResponse, 0, len(items)) +func apiResponses(items []*biz.API) []*dto.APIResponse { + out := make([]*dto.APIResponse, 0, len(items)) for _, item := range items { out = append(out, apiResponse(item)) } return out } -func (s *APIService) ListAPI(ctx context.Context, req *APIListRequest) ([]*APIResponse, int64, error) { +func (s *APIService) ListAPI(ctx context.Context, req *dto.APIListRequest) ([]*dto.APIResponse, int64, error) { items, total, err := s.uc.ListAPIs(ctx, req.Page, req.PageSize, &biz.API{Path: req.Path, Description: req.Description, APIGroup: req.APIGroup, Method: req.Method, OrderKey: req.OrderKey, Desc: req.Desc}) if err != nil { return nil, 0, err @@ -47,7 +48,7 @@ func (s *APIService) ListAPI(ctx context.Context, req *APIListRequest) ([]*APIRe return apiResponses(items), total, nil } -func (s *APIService) AllAPI(ctx context.Context, strict bool) ([]*APIResponse, error) { +func (s *APIService) AllAPI(ctx context.Context, strict bool) ([]*dto.APIResponse, error) { items, _, err := s.uc.ListAPIs(ctx, 0, 0, &biz.API{StrictAll: strict}) if err != nil { return nil, err @@ -79,24 +80,24 @@ func (s *APIService) Groups(ctx context.Context) ([]string, map[string]string, e return groups, groupAPIMap, nil } -func (s *APIService) CreateAPIRequest(ctx context.Context, req *APIRequest) (*APIResponse, error) { +func (s *APIService) CreateAPIRequest(ctx context.Context, req *dto.APIRequest) (*dto.APIResponse, error) { value := s.apiDomain(req) if err := s.uc.CreateAPI(ctx, value); err != nil { return nil, err } return apiResponse(value), nil } -func (s *APIService) UpdateAPIRequest(ctx context.Context, req *APIRequest) error { +func (s *APIService) UpdateAPIRequest(ctx context.Context, req *dto.APIRequest) error { return s.uc.UpdateAPI(ctx, s.apiDomain(req)) } -func (s *APIService) FindAPIResponse(ctx context.Context, id uint) (*APIResponse, error) { +func (s *APIService) FindAPIResponse(ctx context.Context, id uint) (*dto.APIResponse, error) { value, err := s.uc.FindAPI(ctx, id) if err != nil { return nil, err } return apiResponse(value), nil } -func (s *APIService) ApplyAPISyncRequest(ctx context.Context, req *ApplyAPISyncRequest) error { +func (s *APIService) ApplyAPISyncRequest(ctx context.Context, req *dto.ApplyAPISyncRequest) error { added := make([]*biz.API, 0, len(req.NewAPIs)) deleted := make([]*biz.API, 0, len(req.DeleteAPIs)) for i := range req.NewAPIs { @@ -107,28 +108,28 @@ func (s *APIService) ApplyAPISyncRequest(ctx context.Context, req *ApplyAPISyncR } return s.uc.ApplyAPISync(ctx, added, deleted) } -func (s *APIService) SetPolicyPathsRequest(ctx context.Context, req *SetPolicyPathsRequest) error { +func (s *APIService) SetPolicyPathsRequest(ctx context.Context, req *dto.SetPolicyPathsRequest) error { paths := make([]*biz.API, 0, len(req.Infos)) for _, value := range req.Infos { paths = append(paths, &biz.API{Path: value.Path, Method: value.Method}) } return s.uc.SetPolicyPaths(ctx, req.AuthorityID, paths) } -func (s *APIService) PolicyPathResponses(ctx context.Context, authorityID uint) ([]PolicyPathRequest, error) { +func (s *APIService) PolicyPathResponses(ctx context.Context, authorityID uint) ([]dto.PolicyPathRequest, error) { items, err := s.uc.PolicyPaths(ctx, authorityID) if err != nil { return nil, err } - var out []PolicyPathRequest + var out []dto.PolicyPathRequest if len(items) > 0 { - out = make([]PolicyPathRequest, 0, len(items)) + out = make([]dto.PolicyPathRequest, 0, len(items)) } for _, item := range items { - out = append(out, PolicyPathRequest{Path: item.Path, Method: item.Method}) + out = append(out, dto.PolicyPathRequest{Path: item.Path, Method: item.Method}) } return out, nil } -func (s *APIService) SyncAPIResponses(ctx context.Context, routes []APIRequest) (*APISyncResponse, error) { +func (s *APIService) SyncAPIResponses(ctx context.Context, routes []dto.APIRequest) (*dto.APISyncResponse, error) { items := make([]*biz.API, 0, len(routes)) for i := range routes { routes[i].Path = s.NormalizeRoutePath(routes[i].Path) @@ -155,12 +156,12 @@ func (s *APIService) SetAPIRoles(ctx context.Context, path, method string, ids [ func (s *APIService) FreshCasbin(ctx context.Context) error { return s.uc.FreshCasbin(ctx) } -func (s *APIService) SyncAPIs(ctx context.Context, routes []*biz.API) (*APISyncResponse, error) { +func (s *APIService) SyncAPIs(ctx context.Context, routes []*biz.API) (*dto.APISyncResponse, error) { diff, err := s.uc.SyncAPIs(ctx, routes) if err != nil { return nil, err } - return &APISyncResponse{NewAPIs: apiResponses(diff.Added), DeleteAPIs: apiResponses(diff.Deleted), IgnoreAPIs: apiResponses(diff.Ignored)}, nil + return &dto.APISyncResponse{NewAPIs: apiResponses(diff.Added), DeleteAPIs: apiResponses(diff.Deleted), IgnoreAPIs: apiResponses(diff.Ignored)}, nil } func (s *APIService) SetAPIIgnored(ctx context.Context, path, method string, ignored bool) error { return s.uc.SetAPIIgnored(ctx, s.NormalizeRoutePath(path), method, ignored) diff --git a/internal/service/api_token.go b/internal/service/api_token.go index 0627119..79d8b7d 100644 --- a/internal/service/api_token.go +++ b/internal/service/api_token.go @@ -5,6 +5,7 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) type TokenService struct { @@ -16,12 +17,12 @@ func NewTokenService(uc *biz.TokenUsecase, issuer biz.TokenIssuer) *TokenService return &TokenService{uc: uc, issuer: issuer} } -func tokenDTO(v *biz.APIToken) *APITokenResponse { - var user *UserResponse +func tokenDTO(v *biz.APIToken) *dto.APITokenResponse { + var user *dto.UserResponse if v.User != nil { user = convertUser(v.User) } - return &APITokenResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, UserID: v.UserID, AuthorityID: v.AuthorityID, Token: v.Token, Status: v.Status, ExpiresAt: v.ExpiresAt, Remark: v.Remark, User: user} + return &dto.APITokenResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, UserID: v.UserID, AuthorityID: v.AuthorityID, Token: v.Token, Status: v.Status, ExpiresAt: v.ExpiresAt, Remark: v.Remark, User: user} } func (s *TokenService) CreateAPIToken(ctx context.Context, userID, authorityID uint, days int, remark string) (string, error) { @@ -39,12 +40,12 @@ func (s *TokenService) CreateAPIToken(ctx context.Context, userID, authorityID u } return issued.Value, nil } -func (s *TokenService) APITokens(ctx context.Context, page, size int, userID uint, status *bool) ([]*APITokenResponse, int64, error) { +func (s *TokenService) APITokens(ctx context.Context, page, size int, userID uint, status *bool) ([]*dto.APITokenResponse, int64, error) { items, total, err := s.uc.ListAPITokens(ctx, page, size, userID, status) if err != nil { return nil, 0, err } - out := make([]*APITokenResponse, 0, len(items)) + out := make([]*dto.APITokenResponse, 0, len(items)) for _, v := range items { out = append(out, tokenDTO(v)) } diff --git a/internal/service/audit.go b/internal/service/audit.go index 58e8980..01fa45b 100644 --- a/internal/service/audit.go +++ b/internal/service/audit.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type AuditService struct{ uc *biz.AuditUsecase } @@ -17,31 +18,31 @@ func NewAuditRecorder(uc *biz.AuditRecorderUsecase) *AuditRecorder { return &Aud func (s *AuditRecorder) RecordOperation(ctx context.Context, v *biz.OperationRecord) error { return s.uc.RecordOperation(ctx, v) } -func (s *AuditRecorder) RecordOperationRequest(ctx context.Context, value *OperationRecordRequest) error { +func (s *AuditRecorder) RecordOperationRequest(ctx context.Context, value *dto.OperationRecordRequest) error { return s.RecordOperation(ctx, &biz.OperationRecord{IP: value.IP, Method: value.Method, Path: value.Path, Status: value.Status, LatencyMS: value.LatencyMS, Agent: value.Agent, ErrorMessage: value.ErrorMessage, Body: value.Body, Response: value.Response, UserID: value.UserID, RequestID: value.RequestID, TraceID: value.TraceID, DeviceID: value.DeviceID}) } -func (s *AuditService) OperationsFilter(ctx context.Context, page, size int, path, method string, status int) ([]*OperationRecordResponse, int64, error) { +func (s *AuditService) OperationsFilter(ctx context.Context, page, size int, path, method string, status int) ([]*dto.OperationRecordResponse, int64, error) { return s.Operations(ctx, page, size, &biz.OperationRecord{Path: path, Method: method, Status: status}) } -func opDTO(v *biz.OperationRecord) *OperationRecordResponse { +func opDTO(v *biz.OperationRecord) *dto.OperationRecordResponse { var user any = map[string]any{} if v.User != nil { user = convertUser(v.User) } - return &OperationRecordResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, IP: v.IP, Method: v.Method, Path: v.Path, Status: v.Status, LatencyMS: v.LatencyMS, Agent: v.Agent, ErrorMessage: v.ErrorMessage, Body: v.Body, Response: v.Response, UserID: v.UserID, RequestID: v.RequestID, TraceID: v.TraceID, DeviceID: v.DeviceID, User: user} + return &dto.OperationRecordResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, IP: v.IP, Method: v.Method, Path: v.Path, Status: v.Status, LatencyMS: v.LatencyMS, Agent: v.Agent, ErrorMessage: v.ErrorMessage, Body: v.Body, Response: v.Response, UserID: v.UserID, RequestID: v.RequestID, TraceID: v.TraceID, DeviceID: v.DeviceID, User: user} } -func (s *AuditService) Operations(ctx context.Context, page, size int, q *biz.OperationRecord) ([]*OperationRecordResponse, int64, error) { +func (s *AuditService) Operations(ctx context.Context, page, size int, q *biz.OperationRecord) ([]*dto.OperationRecordResponse, int64, error) { items, total, err := s.uc.ListOperations(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*OperationRecordResponse, 0, len(items)) + out := make([]*dto.OperationRecordResponse, 0, len(items)) for _, v := range items { out = append(out, opDTO(v)) } return out, total, nil } -func (s *AuditService) Operation(ctx context.Context, id uint) (*OperationRecordResponse, error) { +func (s *AuditService) Operation(ctx context.Context, id uint) (*dto.OperationRecordResponse, error) { v, err := s.uc.FindOperation(ctx, id) if err != nil { return nil, err @@ -55,31 +56,31 @@ func (s *AuditService) DeleteOperations(ctx context.Context, ids []int) error { func (s *AuditRecorder) RecordLogin(ctx context.Context, v *biz.LoginLog) error { return s.uc.RecordLogin(ctx, v) } -func (s *AuditRecorder) RecordLoginRequest(ctx context.Context, value *LoginLogRequest) error { +func (s *AuditRecorder) RecordLoginRequest(ctx context.Context, value *dto.LoginLogRequest) error { return s.RecordLogin(ctx, &biz.LoginLog{Username: value.Username, IP: value.IP, Status: value.Status, ErrorMessage: value.ErrorMessage, Agent: value.Agent, UserID: value.UserID}) } -func (s *AuditService) LoginsFilter(ctx context.Context, page, size int, username string, status bool) ([]*LoginLogResponse, int64, error) { +func (s *AuditService) LoginsFilter(ctx context.Context, page, size int, username string, status bool) ([]*dto.LoginLogResponse, int64, error) { return s.Logins(ctx, page, size, &biz.LoginLog{Username: username, Status: status, FilterByStatus: status}) } -func loginDTO(v *biz.LoginLog) *LoginLogResponse { +func loginDTO(v *biz.LoginLog) *dto.LoginLogResponse { var user any = map[string]any{} if v.User != nil { user = convertUser(v.User) } - return &LoginLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Username: v.Username, IP: v.IP, Status: v.Status, ErrorMessage: v.ErrorMessage, Agent: v.Agent, UserID: v.UserID, User: user} + return &dto.LoginLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Username: v.Username, IP: v.IP, Status: v.Status, ErrorMessage: v.ErrorMessage, Agent: v.Agent, UserID: v.UserID, User: user} } -func (s *AuditService) Logins(ctx context.Context, page, size int, q *biz.LoginLog) ([]*LoginLogResponse, int64, error) { +func (s *AuditService) Logins(ctx context.Context, page, size int, q *biz.LoginLog) ([]*dto.LoginLogResponse, int64, error) { items, total, err := s.uc.ListLogins(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*LoginLogResponse, 0, len(items)) + out := make([]*dto.LoginLogResponse, 0, len(items)) for _, v := range items { out = append(out, loginDTO(v)) } return out, total, nil } -func (s *AuditService) Login(ctx context.Context, id uint) (*LoginLogResponse, error) { +func (s *AuditService) Login(ctx context.Context, id uint) (*dto.LoginLogResponse, error) { v, err := s.uc.FindLogin(ctx, id) if err != nil { return nil, err @@ -93,21 +94,21 @@ func (s *AuditService) DeleteLogins(ctx context.Context, ids []int) error { func (s *AuditRecorder) RecordDataAccess(ctx context.Context, v *biz.DataAccessLog) error { return s.uc.RecordDataAccess(ctx, v) } -func (s *AuditRecorder) RecordDataAccessRequest(ctx context.Context, value *DataAccessRecordRequest) error { +func (s *AuditRecorder) RecordDataAccessRequest(ctx context.Context, value *dto.DataAccessRecordRequest) error { return s.RecordDataAccess(ctx, &biz.DataAccessLog{EventType: value.EventType, Operation: value.Operation, UserID: value.UserID, AuthorityID: value.AuthorityID, RequestID: value.RequestID, Method: value.Method, Path: value.Path, Detail: value.Detail}) } -func (s *AuditService) DataAccessRequest(ctx context.Context, req *DataAccessListRequest) ([]*DataAccessLogResponse, int64, error) { +func (s *AuditService) DataAccessRequest(ctx context.Context, req *dto.DataAccessListRequest) ([]*dto.DataAccessLogResponse, int64, error) { return s.DataAccess(ctx, req.Page, req.PageSize, &biz.DataAccessLog{EventType: req.EventType, TargetTable: req.TargetTable}) } -func dataAccessDTO(v *biz.DataAccessLog) *DataAccessLogResponse { - return &DataAccessLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, EventType: v.EventType, TargetTable: v.TargetTable, Operation: v.Operation, UserID: v.UserID, AuthorityID: v.AuthorityID, Scope: v.Scope, RequestID: v.RequestID, Method: v.Method, Path: v.Path, Detail: v.Detail} +func dataAccessDTO(v *biz.DataAccessLog) *dto.DataAccessLogResponse { + return &dto.DataAccessLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, EventType: v.EventType, TargetTable: v.TargetTable, Operation: v.Operation, UserID: v.UserID, AuthorityID: v.AuthorityID, Scope: v.Scope, RequestID: v.RequestID, Method: v.Method, Path: v.Path, Detail: v.Detail} } -func (s *AuditService) DataAccess(ctx context.Context, page, size int, q *biz.DataAccessLog) ([]*DataAccessLogResponse, int64, error) { +func (s *AuditService) DataAccess(ctx context.Context, page, size int, q *biz.DataAccessLog) ([]*dto.DataAccessLogResponse, int64, error) { items, total, err := s.uc.ListDataAccess(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*DataAccessLogResponse, 0, len(items)) + out := make([]*dto.DataAccessLogResponse, 0, len(items)) for _, v := range items { out = append(out, dataAccessDTO(v)) } diff --git a/internal/service/audit_error.go b/internal/service/audit_error.go index 7643bf6..01a86a4 100644 --- a/internal/service/audit_error.go +++ b/internal/service/audit_error.go @@ -5,15 +5,16 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) -func errorDTO(v *biz.ErrorRecord) *ErrorRecordResponse { - return &ErrorRecordResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Form: v.Form, Info: v.Info, Level: v.Level, RequestID: v.RequestID, TraceID: v.TraceID, Solution: v.Solution, Status: v.Status} +func errorDTO(v *biz.ErrorRecord) *dto.ErrorRecordResponse { + return &dto.ErrorRecordResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Form: v.Form, Info: v.Info, Level: v.Level, RequestID: v.RequestID, TraceID: v.TraceID, Solution: v.Solution, Status: v.Status} } func (s *AuditRecorder) CreateError(ctx context.Context, v *biz.ErrorRecord) error { return s.uc.CreateError(ctx, v) } -func recordedErrorDomain(value *ErrorRecordRequest) *biz.ErrorRecord { +func recordedErrorDomain(value *dto.ErrorRecordRequest) *biz.ErrorRecord { form, info := value.Form, value.Info result := &biz.ErrorRecord{Form: &form, Info: &info, Level: value.Level, RequestID: value.RequestID, TraceID: value.TraceID, Status: value.Status} if value.Solution != "" { @@ -22,19 +23,19 @@ func recordedErrorDomain(value *ErrorRecordRequest) *biz.ErrorRecord { } return result } -func mutatedErrorDomain(value *ErrorRecordMutationRequest) *biz.ErrorRecord { +func mutatedErrorDomain(value *dto.ErrorRecordMutationRequest) *biz.ErrorRecord { return &biz.ErrorRecord{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, Form: value.Form, Info: value.Info, Level: value.Level, RequestID: value.RequestID, TraceID: value.TraceID, Solution: value.Solution, Status: value.Status} } -func (s *AuditRecorder) CreateErrorRequest(ctx context.Context, req *ErrorRecordRequest) error { +func (s *AuditRecorder) CreateErrorRequest(ctx context.Context, req *dto.ErrorRecordRequest) error { return s.CreateError(ctx, recordedErrorDomain(req)) } -func (s *AuditRecorder) CreateErrorMutationRequest(ctx context.Context, req *ErrorRecordMutationRequest) error { +func (s *AuditRecorder) CreateErrorMutationRequest(ctx context.Context, req *dto.ErrorRecordMutationRequest) error { return s.CreateError(ctx, mutatedErrorDomain(req)) } -func (s *AuditService) UpdateErrorRequest(ctx context.Context, req *ErrorRecordMutationRequest) error { +func (s *AuditService) UpdateErrorRequest(ctx context.Context, req *dto.ErrorRecordMutationRequest) error { return s.UpdateError(ctx, mutatedErrorDomain(req)) } -func (s *AuditService) ErrorsFilter(ctx context.Context, page, size int, form, info string, createdAtRange []time.Time) ([]*ErrorRecordResponse, int64, error) { +func (s *AuditService) ErrorsFilter(ctx context.Context, page, size int, form, info string, createdAtRange []time.Time) ([]*dto.ErrorRecordResponse, int64, error) { query := &biz.ErrorRecord{CreatedAtRange: createdAtRange} if form != "" { query.Form = &form @@ -50,19 +51,19 @@ func (s *AuditService) UpdateError(ctx context.Context, v *biz.ErrorRecord) erro func (s *AuditService) DeleteErrors(ctx context.Context, ids []uint) error { return s.uc.DeleteErrors(ctx, ids) } -func (s *AuditService) Error(ctx context.Context, id uint) (*ErrorRecordResponse, error) { +func (s *AuditService) Error(ctx context.Context, id uint) (*dto.ErrorRecordResponse, error) { v, err := s.uc.FindError(ctx, id) if err != nil { return nil, err } return errorDTO(v), nil } -func (s *AuditService) Errors(ctx context.Context, page, size int, q *biz.ErrorRecord) ([]*ErrorRecordResponse, int64, error) { +func (s *AuditService) Errors(ctx context.Context, page, size int, q *biz.ErrorRecord) ([]*dto.ErrorRecordResponse, int64, error) { items, total, err := s.uc.ListErrors(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*ErrorRecordResponse, 0, len(items)) + out := make([]*dto.ErrorRecordResponse, 0, len(items)) for _, v := range items { out = append(out, errorDTO(v)) } diff --git a/internal/service/audit_log_file.go b/internal/service/audit_log_file.go index 16fda6e..be58959 100644 --- a/internal/service/audit_log_file.go +++ b/internal/service/audit_log_file.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type LogViewerService struct{ uc *biz.LogViewerUsecase } @@ -12,32 +13,32 @@ func NewLogViewerService(uc *biz.LogViewerUsecase) *LogViewerService { return &LogViewerService{uc: uc} } -func (s *LogViewerService) LogDates(ctx context.Context, month string) (*LogDatesResponse, error) { +func (s *LogViewerService) LogDates(ctx context.Context, month string) (*dto.LogDatesResponse, error) { items, err := s.uc.LogDates(ctx, month) if err != nil { return nil, err } - out := make([]*LogDateResponse, 0, len(items)) + out := make([]*dto.LogDateResponse, 0, len(items)) for _, v := range items { - out = append(out, &LogDateResponse{Date: v.Date, FileCount: v.FileCount}) + out = append(out, &dto.LogDateResponse{Date: v.Date, FileCount: v.FileCount}) } - return &LogDatesResponse{Month: month, Dates: out}, nil + return &dto.LogDatesResponse{Month: month, Dates: out}, nil } -func (s *LogViewerService) LogFiles(ctx context.Context, date string) (*LogFilesResponse, error) { +func (s *LogViewerService) LogFiles(ctx context.Context, date string) (*dto.LogFilesResponse, error) { items, err := s.uc.LogFiles(ctx, date) if err != nil { return nil, err } - out := make([]*LogFileResponse, 0, len(items)) + out := make([]*dto.LogFileResponse, 0, len(items)) for _, v := range items { - out = append(out, &LogFileResponse{Path: v.Path, Name: v.Name, Size: v.Size, ModifiedAt: v.ModifiedAt}) + out = append(out, &dto.LogFileResponse{Path: v.Path, Name: v.Name, Size: v.Size, ModifiedAt: v.ModifiedAt}) } - return &LogFilesResponse{Date: date, Files: out}, nil + return &dto.LogFilesResponse{Date: date, Files: out}, nil } -func (s *LogViewerService) LogContent(ctx context.Context, date, path string, cursor *int64) (*LogContentResponse, error) { +func (s *LogViewerService) LogContent(ctx context.Context, date, path string, cursor *int64) (*dto.LogContentResponse, error) { v, err := s.uc.LogContent(ctx, date, path, cursor) if err != nil { return nil, err } - return &LogContentResponse{Date: v.Date, Path: v.Path, Content: v.Content, LineCount: v.LineCount, NextCursor: v.NextCursor, HasMore: v.HasMore, LimitedByBytes: v.LimitedByBytes, Size: v.Size, ModifiedAt: v.ModifiedAt}, nil + return &dto.LogContentResponse{Date: v.Date, Path: v.Path, Content: v.Content, LineCount: v.LineCount, NextCursor: v.NextCursor, HasMore: v.HasMore, LimitedByBytes: v.LimitedByBytes, Size: v.Size, ModifiedAt: v.ModifiedAt}, nil } diff --git a/internal/service/authentication.go b/internal/service/authentication.go index e0485b3..0e2e28a 100644 --- a/internal/service/authentication.go +++ b/internal/service/authentication.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type AuthService struct { @@ -14,11 +15,11 @@ func NewAuthService(uc *biz.AuthenticationUsecase) *AuthService { return &AuthService{uc: uc} } -func loginResult(value *biz.AuthenticationResult) *LoginResponse { - return &LoginResponse{User: convertUser(value.User), Token: value.Token, ExpiresAt: value.ExpiresAt.UnixMilli(), NeedChangePassword: value.NeedChangePassword} +func loginResult(value *biz.AuthenticationResult) *dto.LoginResponse { + return &dto.LoginResponse{User: convertUser(value.User), Token: value.Token, ExpiresAt: value.ExpiresAt.UnixMilli(), NeedChangePassword: value.NeedChangePassword} } -func (s *AuthService) Login(ctx context.Context, req *LoginRequest, ip, agent string) (*LoginResponse, error) { +func (s *AuthService) Login(ctx context.Context, req *dto.LoginRequest, ip, agent string) (*dto.LoginResponse, error) { value, err := s.uc.Login(ctx, &biz.LoginAttempt{Username: req.Username, Password: req.Password, CaptchaID: req.CaptchaID, Captcha: req.Captcha, IP: ip, Agent: agent}) if err != nil { return nil, err @@ -26,7 +27,7 @@ func (s *AuthService) Login(ctx context.Context, req *LoginRequest, ip, agent st return loginResult(value), nil } -func (s *AuthService) SwitchAuthority(ctx context.Context, claims *biz.AuthClaims, authorityID uint) (*LoginResponse, error) { +func (s *AuthService) SwitchAuthority(ctx context.Context, claims *biz.AuthClaims, authorityID uint) (*dto.LoginResponse, error) { value, err := s.uc.SwitchAuthority(ctx, claims, authorityID) if err != nil { return nil, err diff --git a/internal/service/authority.go b/internal/service/authority.go index 9df426b..88b9196 100644 --- a/internal/service/authority.go +++ b/internal/service/authority.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type AuthorityService struct{ uc *biz.AuthorityUsecase } @@ -12,9 +13,9 @@ func NewAuthorityService(uc *biz.AuthorityUsecase) *AuthorityService { return &AuthorityService{uc: uc} } -func authorityDTO(value *biz.Authority) *AuthorityResponse { +func authorityDTO(value *biz.Authority) *dto.AuthorityResponse { out := convertAuthority(*value) - children := make([]*AuthorityResponse, 0, len(value.Children)) + children := make([]*dto.AuthorityResponse, 0, len(value.Children)) for _, child := range value.Children { children = append(children, authorityDTO(child)) } @@ -22,31 +23,31 @@ func authorityDTO(value *biz.Authority) *AuthorityResponse { return out } -func authorityDomain(req *AuthorityRequest) *biz.Authority { +func authorityDomain(req *dto.AuthorityRequest) *biz.Authority { return &biz.Authority{AuthorityID: req.AuthorityID, AuthorityName: req.AuthorityName, ParentID: req.ParentID, DataScope: req.DataScope, DefaultRouter: req.DefaultRouter} } -func authorityResponse(value *biz.Authority) *AuthorityResponse { - var menus []*MenuResponse +func authorityResponse(value *biz.Authority) *dto.AuthorityResponse { + var menus []*dto.MenuResponse if value.Menus != nil { menus = menuResponses(value.Menus) } - return &AuthorityResponse{CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: value.DeletedAt, AuthorityID: value.AuthorityID, AuthorityName: value.AuthorityName, ParentID: value.ParentID, Children: nil, Menus: menus, DataScope: value.DataScope, DefaultRouter: value.DefaultRouter} + return &dto.AuthorityResponse{CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: value.DeletedAt, AuthorityID: value.AuthorityID, AuthorityName: value.AuthorityName, ParentID: value.ParentID, Children: nil, Menus: menus, DataScope: value.DataScope, DefaultRouter: value.DefaultRouter} } -func (s *AuthorityService) Authorities(ctx context.Context) ([]*AuthorityResponse, error) { +func (s *AuthorityService) Authorities(ctx context.Context) ([]*dto.AuthorityResponse, error) { items, err := s.uc.AuthorityTree(ctx) if err != nil { return nil, err } - roots := make([]*AuthorityResponse, 0, len(items)) + roots := make([]*dto.AuthorityResponse, 0, len(items)) for _, value := range items { roots = append(roots, authorityDTO(value)) } return roots, nil } -func (s *AuthorityService) CreateAuthorityRequest(ctx context.Context, req *AuthorityRequest) (*AuthorityResponse, error) { +func (s *AuthorityService) CreateAuthorityRequest(ctx context.Context, req *dto.AuthorityRequest) (*dto.AuthorityResponse, error) { value := authorityDomain(req) if err := s.uc.CreateAuthority(ctx, value); err != nil { return nil, err @@ -54,17 +55,17 @@ func (s *AuthorityService) CreateAuthorityRequest(ctx context.Context, req *Auth return authorityResponse(value), nil } -func (s *AuthorityService) CopyAuthorityRequest(ctx context.Context, req *CopyAuthorityRequest) (*AuthorityResponse, error) { +func (s *AuthorityService) CopyAuthorityRequest(ctx context.Context, req *dto.CopyAuthorityRequest) (*dto.AuthorityResponse, error) { value := authorityDomain(&req.Authority) if err := s.uc.CopyAuthority(ctx, req.OldAuthorityID, value); err != nil { return nil, err } result := authorityResponse(value) - result.Children = []*AuthorityResponse{} + result.Children = []*dto.AuthorityResponse{} return result, nil } -func (s *AuthorityService) UpdateAuthorityRequest(ctx context.Context, req *AuthorityRequest) (*AuthorityResponse, error) { +func (s *AuthorityService) UpdateAuthorityRequest(ctx context.Context, req *dto.AuthorityRequest) (*dto.AuthorityResponse, error) { value := authorityDomain(req) if err := s.uc.UpdateAuthority(ctx, value); err != nil { return nil, err diff --git a/internal/service/department.go b/internal/service/department.go index 86adbf5..f5d9402 100644 --- a/internal/service/department.go +++ b/internal/service/department.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type DepartmentService struct{ uc *biz.DepartmentUsecase } @@ -12,10 +13,10 @@ func NewDepartmentService(uc *biz.DepartmentUsecase) *DepartmentService { return &DepartmentService{uc: uc} } -func departmentResponse(value *biz.Department) *DepartmentResponse { - var children []*DepartmentResponse +func departmentResponse(value *biz.Department) *dto.DepartmentResponse { + var children []*dto.DepartmentResponse if value.Children != nil { - children = make([]*DepartmentResponse, 0, len(value.Children)) + children = make([]*dto.DepartmentResponse, 0, len(value.Children)) for _, child := range value.Children { children = append(children, departmentResponse(child)) } @@ -24,30 +25,30 @@ func departmentResponse(value *biz.Department) *DepartmentResponse { if value.Leader != nil { leader = convertUser(value.Leader) } - return &DepartmentResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Name: value.Name, ParentID: value.ParentID, Ancestors: value.Ancestors, Sort: value.Sort, LeaderID: value.LeaderID, Leader: leader, Status: value.Status, Children: children, NamePath: value.NamePath} + return &dto.DepartmentResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Name: value.Name, ParentID: value.ParentID, Ancestors: value.Ancestors, Sort: value.Sort, LeaderID: value.LeaderID, Leader: leader, Status: value.Status, Children: children, NamePath: value.NamePath} } -func departmentDomain(value *DepartmentRequest) *biz.Department { +func departmentDomain(value *dto.DepartmentRequest) *biz.Department { return &biz.Department{ID: value.ID, Name: value.Name, ParentID: value.ParentID, Sort: value.Sort, LeaderID: value.LeaderID, Status: value.Status} } -func (s *DepartmentService) Departments(ctx context.Context, name string) ([]*DepartmentResponse, error) { +func (s *DepartmentService) Departments(ctx context.Context, name string) ([]*dto.DepartmentResponse, error) { items, err := s.uc.Departments(ctx, name) if err != nil { return nil, err } - out := make([]*DepartmentResponse, 0, len(items)) + out := make([]*dto.DepartmentResponse, 0, len(items)) for _, item := range items { out = append(out, departmentResponse(item)) } return out, nil } -func (s *DepartmentService) Create(ctx context.Context, req *DepartmentRequest) error { +func (s *DepartmentService) Create(ctx context.Context, req *dto.DepartmentRequest) error { return s.uc.CreateDepartment(ctx, departmentDomain(req)) } -func (s *DepartmentService) Update(ctx context.Context, req *DepartmentRequest) error { +func (s *DepartmentService) Update(ctx context.Context, req *dto.DepartmentRequest) error { return s.uc.UpdateDepartment(ctx, departmentDomain(req)) } @@ -55,7 +56,7 @@ func (s *DepartmentService) Delete(ctx context.Context, id uint) error { return s.uc.DeleteDepartment(ctx, id) } -func (s *DepartmentService) Department(ctx context.Context, id uint) (*DepartmentResponse, error) { +func (s *DepartmentService) Department(ctx context.Context, id uint) (*dto.DepartmentResponse, error) { value, err := s.uc.Department(ctx, id) if err != nil { return nil, err @@ -67,10 +68,10 @@ func (s *DepartmentService) UserIDs(ctx context.Context, id uint) ([]uint, error return s.uc.DepartmentUserIDs(ctx, id) } -func (s *DepartmentService) SetUsers(ctx context.Context, req *SetDepartmentUsersRequest) error { +func (s *DepartmentService) SetUsers(ctx context.Context, req *dto.SetDepartmentUsersRequest) error { return s.uc.SetDepartmentUsers(ctx, req.DepartmentID, req.UserIDs) } -func (s *DepartmentService) SetUserDepartments(ctx context.Context, req *SetUserDepartmentsRequest) error { +func (s *DepartmentService) SetUserDepartments(ctx context.Context, req *dto.SetUserDepartmentsRequest) error { return s.uc.SetUserDepartments(ctx, req.ID, req.DepartmentIDs, req.Primary) } diff --git a/internal/service/dictionary.go b/internal/service/dictionary.go index 11a7a1e..e4cbdc4 100644 --- a/internal/service/dictionary.go +++ b/internal/service/dictionary.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type DictionaryService struct{ uc *biz.DictionaryUsecase } @@ -12,67 +13,67 @@ func NewDictionaryService(uc *biz.DictionaryUsecase) *DictionaryService { return &DictionaryService{uc: uc} } -func dictionaryDomain(value *DictionaryRequest) *biz.Dictionary { +func dictionaryDomain(value *dto.DictionaryRequest) *biz.Dictionary { return &biz.Dictionary{ID: value.ID, Name: value.Name, Type: value.Type, Status: value.Status, Desc: value.Description, ParentID: value.ParentID} } -func (s *DictionaryService) CreateDictionaryRequest(ctx context.Context, req *DictionaryRequest) (*DictionaryResponse, error) { +func (s *DictionaryService) CreateDictionaryRequest(ctx context.Context, req *dto.DictionaryRequest) (*dto.DictionaryResponse, error) { value := dictionaryDomain(req) if err := s.CreateDictionary(ctx, value); err != nil { return nil, err } return dictionaryDTO(value), nil } -func (s *DictionaryService) UpdateDictionaryRequest(ctx context.Context, req *DictionaryRequest) error { +func (s *DictionaryService) UpdateDictionaryRequest(ctx context.Context, req *dto.DictionaryRequest) error { return s.UpdateDictionary(ctx, dictionaryDomain(req)) } -func dictionaryDTO(v *biz.Dictionary) *DictionaryResponse { - var children []*DictionaryResponse +func dictionaryDTO(v *biz.Dictionary) *dto.DictionaryResponse { + var children []*dto.DictionaryResponse if v.Children != nil { - children = make([]*DictionaryResponse, 0, len(v.Children)) + children = make([]*dto.DictionaryResponse, 0, len(v.Children)) for _, x := range v.Children { children = append(children, dictionaryDTO(x)) } } - var details []*DictionaryDetailResponse + var details []*dto.DictionaryDetailResponse if v.Details != nil { - details = make([]*DictionaryDetailResponse, 0, len(v.Details)) + details = make([]*dto.DictionaryDetailResponse, 0, len(v.Details)) for _, x := range v.Details { details = append(details, detailDTO(x)) } } - return &DictionaryResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Type: v.Type, Status: v.Status, Desc: v.Desc, ParentID: v.ParentID, Children: children, SysDictionaryDetails: details} + return &dto.DictionaryResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Type: v.Type, Status: v.Status, Desc: v.Desc, ParentID: v.ParentID, Children: children, SysDictionaryDetails: details} } -func (s *DictionaryService) Dictionaries(ctx context.Context, page, size int, name, typ string, details bool) ([]*DictionaryResponse, int64, error) { +func (s *DictionaryService) Dictionaries(ctx context.Context, page, size int, name, typ string, details bool) ([]*dto.DictionaryResponse, int64, error) { items, total, err := s.uc.ListDictionaries(ctx, page, size, name, typ, details) if err != nil { return nil, 0, err } - out := make([]*DictionaryResponse, 0, len(items)) + out := make([]*dto.DictionaryResponse, 0, len(items)) for _, v := range items { out = append(out, dictionaryDTO(v)) } return out, total, nil } -func (s *DictionaryService) Dictionary(ctx context.Context, id uint, typ string, status *bool, details bool) (*DictionaryResponse, error) { +func (s *DictionaryService) Dictionary(ctx context.Context, id uint, typ string, status *bool, details bool) (*dto.DictionaryResponse, error) { v, err := s.uc.FindDictionary(ctx, id, typ, status, details) if err != nil { return nil, err } return dictionaryDTO(v), nil } -func (s *DictionaryService) ExportDictionary(ctx context.Context, id uint) (*DictionaryExportResponse, error) { +func (s *DictionaryService) ExportDictionary(ctx context.Context, id uint) (*dto.DictionaryExportResponse, error) { v, err := s.uc.ExportDictionary(ctx, id) if err != nil { return nil, err } - var details []*DictionaryDetailExportResponse + var details []*dto.DictionaryDetailExportResponse for _, detail := range v.Details { - details = append(details, &DictionaryDetailExportResponse{ + details = append(details, &dto.DictionaryDetailExportResponse{ Label: detail.Label, Value: detail.Value, Extend: detail.Extend, Status: detail.Status, Sort: detail.Sort, Level: detail.Level, Path: detail.Path, }) } - return &DictionaryExportResponse{ + return &dto.DictionaryExportResponse{ Name: v.Name, Type: v.Type, Status: v.Status, Desc: v.Desc, SysDictionaryDetails: details, }, nil @@ -87,38 +88,38 @@ func (s *DictionaryService) DeleteDictionary(ctx context.Context, id uint) error return s.uc.DeleteDictionary(ctx, id) } -func detailDomain(value *DictionaryDetailRequest) *biz.DictionaryDetail { +func detailDomain(value *dto.DictionaryDetailRequest) *biz.DictionaryDetail { return &biz.DictionaryDetail{ID: value.ID, Label: value.Label, Value: value.Value, Extend: value.Extend, Status: value.Status, Sort: value.Sort, DictionaryID: value.DictionaryID, ParentID: value.ParentID, Level: value.Level, Path: value.Path} } -func (s *DictionaryService) CreateDictionaryDetailRequest(ctx context.Context, req *DictionaryDetailRequest) error { +func (s *DictionaryService) CreateDictionaryDetailRequest(ctx context.Context, req *dto.DictionaryDetailRequest) error { return s.CreateDictionaryDetail(ctx, detailDomain(req)) } -func (s *DictionaryService) UpdateDictionaryDetailRequest(ctx context.Context, req *DictionaryDetailRequest) error { +func (s *DictionaryService) UpdateDictionaryDetailRequest(ctx context.Context, req *dto.DictionaryDetailRequest) error { return s.UpdateDictionaryDetail(ctx, detailDomain(req)) } -func detailDTO(v *biz.DictionaryDetail) *DictionaryDetailResponse { - var children []*DictionaryDetailResponse +func detailDTO(v *biz.DictionaryDetail) *dto.DictionaryDetailResponse { + var children []*dto.DictionaryDetailResponse if v.Children != nil { - children = make([]*DictionaryDetailResponse, 0, len(v.Children)) + children = make([]*dto.DictionaryDetailResponse, 0, len(v.Children)) for _, x := range v.Children { children = append(children, detailDTO(x)) } } disabled := v.Status != nil && !*v.Status - return &DictionaryDetailResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Label: v.Label, Value: v.Value, Extend: v.Extend, Status: v.Status, Sort: v.Sort, DictionaryID: v.DictionaryID, ParentID: v.ParentID, Level: v.Level, Path: v.Path, Disabled: disabled, Children: children} + return &dto.DictionaryDetailResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Label: v.Label, Value: v.Value, Extend: v.Extend, Status: v.Status, Sort: v.Sort, DictionaryID: v.DictionaryID, ParentID: v.ParentID, Level: v.Level, Path: v.Path, Disabled: disabled, Children: children} } -func (s *DictionaryService) DictionaryDetails(ctx context.Context, page, size int, filter biz.DictionaryDetailFilter) ([]*DictionaryDetailResponse, int64, error) { +func (s *DictionaryService) DictionaryDetails(ctx context.Context, page, size int, filter biz.DictionaryDetailFilter) ([]*dto.DictionaryDetailResponse, int64, error) { items, total, err := s.uc.ListDictionaryDetails(ctx, page, size, filter) if err != nil { return nil, 0, err } - out := make([]*DictionaryDetailResponse, 0, len(items)) + out := make([]*dto.DictionaryDetailResponse, 0, len(items)) for _, v := range items { out = append(out, detailDTO(v)) } return out, total, nil } -func (s *DictionaryService) DictionaryDetailsRequest(ctx context.Context, page, size int, request DictionaryDetailListRequest) ([]*DictionaryDetailResponse, int64, error) { +func (s *DictionaryService) DictionaryDetailsRequest(ctx context.Context, page, size int, request dto.DictionaryDetailListRequest) ([]*dto.DictionaryDetailResponse, int64, error) { return s.DictionaryDetails(ctx, page, size, biz.DictionaryDetailFilter{ DictionaryID: request.DictionaryID, Label: request.Label, @@ -128,21 +129,21 @@ func (s *DictionaryService) DictionaryDetailsRequest(ctx context.Context, page, Level: request.Level, }) } -func (s *DictionaryService) DictionaryDetail(ctx context.Context, id uint) (*DictionaryDetailResponse, error) { +func (s *DictionaryService) DictionaryDetail(ctx context.Context, id uint) (*dto.DictionaryDetailResponse, error) { v, err := s.uc.FindDictionaryDetail(ctx, id) if err != nil { return nil, err } return detailDTO(v), nil } -func (s *DictionaryService) DictionaryPath(ctx context.Context, id uint) ([]*DictionaryDetailResponse, error) { - path := make([]*DictionaryDetailResponse, 0) +func (s *DictionaryService) DictionaryPath(ctx context.Context, id uint) ([]*dto.DictionaryDetailResponse, error) { + path := make([]*dto.DictionaryDetailResponse, 0) for id != 0 { value, err := s.uc.FindDictionaryDetail(ctx, id) if err != nil { return nil, err } - path = append([]*DictionaryDetailResponse{detailDTO(value)}, path...) + path = append([]*dto.DictionaryDetailResponse{detailDTO(value)}, path...) if value.ParentID == nil { break } @@ -150,12 +151,12 @@ func (s *DictionaryService) DictionaryPath(ctx context.Context, id uint) ([]*Dic } return path, nil } -func (s *DictionaryService) DictionaryTree(ctx context.Context, id uint, typ string) ([]*DictionaryDetailResponse, error) { +func (s *DictionaryService) DictionaryTree(ctx context.Context, id uint, typ string) ([]*dto.DictionaryDetailResponse, error) { items, err := s.uc.DictionaryDetailTree(ctx, id, typ) if err != nil { return nil, err } - out := make([]*DictionaryDetailResponse, 0, len(items)) + out := make([]*dto.DictionaryDetailResponse, 0, len(items)) for _, v := range items { out = append(out, detailDTO(v)) } diff --git a/internal/service/dictionary_import.go b/internal/service/dictionary_import.go index 1332c46..57ecb7b 100644 --- a/internal/service/dictionary_import.go +++ b/internal/service/dictionary_import.go @@ -6,15 +6,16 @@ import ( "errors" "kra/internal/biz" + "kra/internal/service/dto" ) func (s *DictionaryService) ImportDictionaryJSON(ctx context.Context, raw string) error { var payload struct { - Name string `json:"name"` - Type string `json:"type"` - Status *bool `json:"status"` - Description string `json:"desc"` - Details []DictionaryDetailRequest `json:"sysDictionaryDetails"` + Name string `json:"name"` + Type string `json:"type"` + Status *bool `json:"status"` + Description string `json:"desc"` + Details []dto.DictionaryDetailRequest `json:"sysDictionaryDetails"` } if err := json.Unmarshal([]byte(raw), &payload); err != nil { return errors.New("JSON 格式错误: " + err.Error()) @@ -25,19 +26,19 @@ func (s *DictionaryService) ImportDictionaryJSON(ctx context.Context, raw string if payload.Type == "" { return errors.New("字典类型不能为空") } - dictionary := dictionaryDomain(&DictionaryRequest{Name: payload.Name, Type: payload.Type, Status: payload.Status, Description: payload.Description}) + dictionary := dictionaryDomain(&dto.DictionaryRequest{Name: payload.Name, Type: payload.Type, Status: payload.Status, Description: payload.Description}) details := make([]*biz.DictionaryDetail, 0, len(payload.Details)) for i := range payload.Details { details = append(details, detailDomain(&payload.Details[i])) } return s.uc.ImportDictionary(ctx, dictionary, details) } -func (s *DictionaryService) DictionaryDetailsByParent(ctx context.Context, dictionaryID uint, parentID *uint, includeChildren bool) ([]*DictionaryDetailResponse, error) { +func (s *DictionaryService) DictionaryDetailsByParent(ctx context.Context, dictionaryID uint, parentID *uint, includeChildren bool) ([]*dto.DictionaryDetailResponse, error) { items, err := s.uc.DictionaryDetailsByParent(ctx, dictionaryID, parentID, includeChildren) if err != nil { return nil, err } - out := make([]*DictionaryDetailResponse, 0, len(items)) + out := make([]*dto.DictionaryDetailResponse, 0, len(items)) for _, item := range items { out = append(out, detailDTO(item)) } diff --git a/internal/service/dto_alias.go b/internal/service/dto_alias.go deleted file mode 100644 index f5ffea4..0000000 --- a/internal/service/dto_alias.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -// DTO aliases keep the service API stable while request/response contracts live in service/dto. -import "kra/internal/service/dto" - -type AnnouncementRequest = dto.AnnouncementRequest -type AnnouncementResponse = dto.AnnouncementResponse -type AnnouncementSearchRequest = dto.AnnouncementSearchRequest -type APIListRequest = dto.APIListRequest -type APIRequest = dto.APIRequest -type APIResponse = dto.APIResponse -type APISyncResponse = dto.APISyncResponse -type APITokenListRequest = dto.APITokenListRequest -type APITokenResponse = dto.APITokenResponse -type ApplyAPISyncRequest = dto.ApplyAPISyncRequest -type AuditIDQuery = dto.AuditIDQuery -type AuditIDsRequest = dto.AuditIDsRequest -type AuthorityMenuResponse = dto.AuthorityMenuResponse -type AuthorityRequest = dto.AuthorityRequest -type AuthorityResponse = dto.AuthorityResponse -type CategoryRequest = dto.CategoryRequest -type ChangePasswordRequest = dto.ChangePasswordRequest -type CompleteUploadRequest = dto.CompleteUploadRequest -type CopyAuthorityRequest = dto.CopyAuthorityRequest -type CreateAPITokenRequest = dto.CreateAPITokenRequest -type DataAccessListRequest = dto.DataAccessListRequest -type DataAccessLogResponse = dto.DataAccessLogResponse -type DataAccessRecordRequest = dto.DataAccessRecordRequest -type DatabaseInitRequest = dto.DatabaseInitRequest -type DeleteAPIRequest = dto.DeleteAPIRequest -type DeleteAPIsRequest = dto.DeleteAPIsRequest -type DeleteAuthorityRequest = dto.DeleteAuthorityRequest -type DeleteDepartmentRequest = dto.DeleteDepartmentRequest -type DeleteMenuRequest = dto.DeleteMenuRequest -type DeletePositionRequest = dto.DeletePositionRequest -type DeleteTaskRequest = dto.DeleteTaskRequest -type DepartmentListRequest = dto.DepartmentListRequest -type DepartmentRequest = dto.DepartmentRequest -type DepartmentResponse = dto.DepartmentResponse -type DictionaryDetailExportResponse = dto.DictionaryDetailExportResponse -type DictionaryDetailListRequest = dto.DictionaryDetailListRequest -type DictionaryDetailRequest = dto.DictionaryDetailRequest -type DictionaryDetailResponse = dto.DictionaryDetailResponse -type DictionaryDetailsByParentRequest = dto.DictionaryDetailsByParentRequest -type DictionaryExportResponse = dto.DictionaryExportResponse -type DictionaryRequest = dto.DictionaryRequest -type DictionaryResponse = dto.DictionaryResponse -type DynamicMenuResponse = dto.DynamicMenuResponse -type ErrorRecordMutationRequest = dto.ErrorRecordMutationRequest -type ErrorRecordRequest = dto.ErrorRecordRequest -type ErrorRecordResponse = dto.ErrorRecordResponse -type ExportConditionRequest = dto.ExportConditionRequest -type ExportConditionResponse = dto.ExportConditionResponse -type ExportJoinRequest = dto.ExportJoinRequest -type ExportJoinResponse = dto.ExportJoinResponse -type ExportTemplateRequest = dto.ExportTemplateRequest -type ExportTemplateResponse = dto.ExportTemplateResponse -type ExportVersionRequest = dto.ExportVersionRequest -type GetAPIRequest = dto.GetAPIRequest -type GetAuthorityButtonsRequest = dto.GetAuthorityButtonsRequest -type GetAuthorityMenusRequest = dto.GetAuthorityMenusRequest -type GetMenuRequest = dto.GetMenuRequest -type GetPolicyPathsRequest = dto.GetPolicyPathsRequest -type IDRequest = dto.IDRequest -type IDsRequest = dto.IDsRequest -type IgnoreAPIRequest = dto.IgnoreAPIRequest -type ImportDictionaryRequest = dto.ImportDictionaryRequest -type ImportMediaRequest = dto.ImportMediaRequest -type ImportVersionRequest = dto.ImportVersionRequest -type InitUploadRequest = dto.InitUploadRequest -type InitUploadResponse = dto.InitUploadResponse -type LogContentResponse = dto.LogContentResponse -type LogDateResponse = dto.LogDateResponse -type LogDatesResponse = dto.LogDatesResponse -type LogFileResponse = dto.LogFileResponse -type LogFilesResponse = dto.LogFilesResponse -type LoginLogRequest = dto.LoginLogRequest -type LoginLogResponse = dto.LoginLogResponse -type LoginLogSearchRequest = dto.LoginLogSearchRequest -type LoginRequest = dto.LoginRequest -type LoginResponse = dto.LoginResponse -type MediaBatchDeleteRequest = dto.MediaBatchDeleteRequest -type MediaCategoryResponse = dto.MediaCategoryResponse -type MediaListRequest = dto.MediaListRequest -type MediaResponse = dto.MediaResponse -type MenuButtonRequest = dto.MenuButtonRequest -type MenuButtonResponse = dto.MenuButtonResponse -type MenuMetaRequest = dto.MenuMetaRequest -type MenuMetaResponse = dto.MenuMetaResponse -type MenuParameterRequest = dto.MenuParameterRequest -type MenuParameterResponse = dto.MenuParameterResponse -type MenuRequest = dto.MenuRequest -type MenuResponse = dto.MenuResponse -type OperationRecordRequest = dto.OperationRecordRequest -type OperationRecordResponse = dto.OperationRecordResponse -type OperationRecordSearchRequest = dto.OperationRecordSearchRequest -type PaymentCallbackAck = dto.PaymentCallbackAck -type PaymentCallbackRequest = dto.PaymentCallbackRequest -type IntegrationConfigRequest = dto.IntegrationConfigRequest -type IntegrationConfigResponse = dto.IntegrationConfigResponse -type PaymentFulfillRequest = dto.PaymentFulfillRequest -type PaymentOrderListRequest = dto.PaymentOrderListRequest -type PaymentOrderResponse = dto.PaymentOrderResponse -type PaymentQueryRequest = dto.PaymentQueryRequest -type PaymentRefundRequest = dto.PaymentRefundRequest -type PaymentRequest = dto.PaymentRequest -type PaymentResultResponse = dto.PaymentResultResponse -type PaymentTestResult = dto.PaymentTestResult -type PaymentTestStage = dto.PaymentTestStage -type PolicyPathRequest = dto.PolicyPathRequest -type PositionListRequest = dto.PositionListRequest -type PositionRequest = dto.PositionRequest -type PositionResponse = dto.PositionResponse -type RenameMediaRequest = dto.RenameMediaRequest -type ResetPasswordRequest = dto.ResetPasswordRequest -type Route = dto.Route -type SecurityConfigRequest = dto.SecurityConfigRequest -type SecurityConfigResponse = dto.SecurityConfigResponse -type SelectOptionResponse = dto.SelectOptionResponse -type SelfUserRequest = dto.SelfUserRequest -type SendEmailRequest = dto.SendEmailRequest -type ServerCPUResponse = dto.ServerCPUResponse -type ServerDiskResponse = dto.ServerDiskResponse -type ServerInfoResponse = dto.ServerInfoResponse -type ServerOSResponse = dto.ServerOSResponse -type ServerRAMResponse = dto.ServerRAMResponse -type SetAPIRolesRequest = dto.SetAPIRolesRequest -type SetAuthorityButtonsRequest = dto.SetAuthorityButtonsRequest -type SetAuthorityMenusRequest = dto.SetAuthorityMenusRequest -type SetDataScopeRequest = dto.SetDataScopeRequest -type SetDepartmentUsersRequest = dto.SetDepartmentUsersRequest -type SetMenuRolesRequest = dto.SetMenuRolesRequest -type SetPolicyPathsRequest = dto.SetPolicyPathsRequest -type SetPositionUsersRequest = dto.SetPositionUsersRequest -type SetRoleUsersRequest = dto.SetRoleUsersRequest -type SetSystemConfigRequest = dto.SetSystemConfigRequest -type SetUserDepartmentsRequest = dto.SetUserDepartmentsRequest -type SetUserPositionsRequest = dto.SetUserPositionsRequest -type StorageListRequest = dto.StorageListRequest -type StorageObjectResponse = dto.StorageObjectResponse -type SwitchAuthorityRequest = dto.SwitchAuthorityRequest -type SystemParameterRequest = dto.SystemParameterRequest -type SystemParameterResponse = dto.SystemParameterResponse -type SystemParameterSearchRequest = dto.SystemParameterSearchRequest -type TaskListRequest = dto.TaskListRequest -type TaskLogListRequest = dto.TaskLogListRequest -type TaskLogResponse = dto.TaskLogResponse -type TaskMethodResponse = dto.TaskMethodResponse -type TaskRequest = dto.TaskRequest -type TaskResponse = dto.TaskResponse -type ToggleTaskRequest = dto.ToggleTaskRequest -type UserAuthoritiesRequest = dto.UserAuthoritiesRequest -type UserListRequest = dto.UserListRequest -type UserRequest = dto.UserRequest -type UserResponse = dto.UserResponse -type VersionAPIRequest = dto.VersionAPIRequest -type VersionDictionaryDetailRequest = dto.VersionDictionaryDetailRequest -type VersionDictionaryRequest = dto.VersionDictionaryRequest -type VersionMenuButtonRequest = dto.VersionMenuButtonRequest -type VersionMenuMetaRequest = dto.VersionMenuMetaRequest -type VersionMenuParameterRequest = dto.VersionMenuParameterRequest -type VersionMenuRequest = dto.VersionMenuRequest -type VersionResponse = dto.VersionResponse -type VersionSearchRequest = dto.VersionSearchRequest diff --git a/internal/service/export.go b/internal/service/export.go index 0cf7ed7..04f2a40 100644 --- a/internal/service/export.go +++ b/internal/service/export.go @@ -8,6 +8,7 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" "github.com/google/uuid" ) @@ -66,7 +67,7 @@ func (s *ExportService) ConsumeToken(ctx context.Context, token string, expectBl _ = s.cache.Delete(ctx, "export:"+token) return &ExportToken{TemplateID: value.TemplateID, Params: value.Params, Blank: value.Blank}, nil } -func exportTemplateDomain(value *ExportTemplateRequest) *biz.ExportTemplate { +func exportTemplateDomain(value *dto.ExportTemplateRequest) *biz.ExportTemplate { out := &biz.ExportTemplate{ID: value.ID, DBName: value.DBName, Name: value.Name, TableName: value.TableName, TemplateID: value.TemplateID, TemplateInfo: value.TemplateInfo, SQL: value.SQL, ImportSQL: value.ImportSQL, Limit: value.Limit, Order: value.Order} for _, item := range value.Conditions { out.Conditions = append(out.Conditions, biz.ExportCondition{ID: item.ID, CreatedAt: item.CreatedAt, UpdatedAt: item.UpdatedAt, TemplateID: item.TemplateID, From: item.From, Column: item.Column, Operator: item.Operator}) @@ -76,31 +77,31 @@ func exportTemplateDomain(value *ExportTemplateRequest) *biz.ExportTemplate { } return out } -func (s *ExportService) CreateRequest(ctx context.Context, req *ExportTemplateRequest) error { +func (s *ExportService) CreateRequest(ctx context.Context, req *dto.ExportTemplateRequest) error { return s.Create(ctx, exportTemplateDomain(req)) } -func (s *ExportService) UpdateRequest(ctx context.Context, req *ExportTemplateRequest) error { +func (s *ExportService) UpdateRequest(ctx context.Context, req *dto.ExportTemplateRequest) error { return s.Update(ctx, exportTemplateDomain(req)) } -func (s *ExportService) TemplatesFilter(ctx context.Context, page, size int, name, tableName, templateID string, start, end *time.Time) ([]*ExportTemplateResponse, int64, error) { +func (s *ExportService) TemplatesFilter(ctx context.Context, page, size int, name, tableName, templateID string, start, end *time.Time) ([]*dto.ExportTemplateResponse, int64, error) { return s.Templates(ctx, page, size, &biz.ExportTemplate{Name: name, TableName: tableName, TemplateID: templateID, StartCreatedAt: start, EndCreatedAt: end}) } -func exportDTO(v *biz.ExportTemplate) *ExportTemplateResponse { - var conditions []ExportConditionResponse +func exportDTO(v *biz.ExportTemplate) *dto.ExportTemplateResponse { + var conditions []dto.ExportConditionResponse if v.Conditions != nil { - conditions = make([]ExportConditionResponse, 0, len(v.Conditions)) + conditions = make([]dto.ExportConditionResponse, 0, len(v.Conditions)) for _, x := range v.Conditions { - conditions = append(conditions, ExportConditionResponse{ID: x.ID, CreatedAt: x.CreatedAt, UpdatedAt: x.UpdatedAt, TemplateID: x.TemplateID, From: x.From, Column: x.Column, Operator: x.Operator}) + conditions = append(conditions, dto.ExportConditionResponse{ID: x.ID, CreatedAt: x.CreatedAt, UpdatedAt: x.UpdatedAt, TemplateID: x.TemplateID, From: x.From, Column: x.Column, Operator: x.Operator}) } } - var joins []ExportJoinResponse + var joins []dto.ExportJoinResponse if v.Joins != nil { - joins = make([]ExportJoinResponse, 0, len(v.Joins)) + joins = make([]dto.ExportJoinResponse, 0, len(v.Joins)) for _, x := range v.Joins { - joins = append(joins, ExportJoinResponse{ID: x.ID, CreatedAt: x.CreatedAt, UpdatedAt: x.UpdatedAt, TemplateID: x.TemplateID, Join: x.Join, Table: x.Table, On: x.On}) + joins = append(joins, dto.ExportJoinResponse{ID: x.ID, CreatedAt: x.CreatedAt, UpdatedAt: x.UpdatedAt, TemplateID: x.TemplateID, Join: x.Join, Table: x.Table, On: x.On}) } } - return &ExportTemplateResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, DBName: v.DBName, Name: v.Name, TableName: v.TableName, TemplateID: v.TemplateID, TemplateInfo: v.TemplateInfo, SQL: v.SQL, ImportSQL: v.ImportSQL, Limit: v.Limit, Order: v.Order, Conditions: conditions, Joins: joins} + return &dto.ExportTemplateResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, DBName: v.DBName, Name: v.Name, TableName: v.TableName, TemplateID: v.TemplateID, TemplateInfo: v.TemplateInfo, SQL: v.SQL, ImportSQL: v.ImportSQL, Limit: v.Limit, Order: v.Order, Conditions: conditions, Joins: joins} } func (s *ExportService) Create(ctx context.Context, v *biz.ExportTemplate) error { return s.uc.CreateExportTemplate(ctx, v) @@ -111,19 +112,19 @@ func (s *ExportService) Update(ctx context.Context, v *biz.ExportTemplate) error func (s *ExportService) Delete(ctx context.Context, ids []uint) error { return s.uc.DeleteExportTemplates(ctx, ids) } -func (s *ExportService) Template(ctx context.Context, id uint, tid string) (*ExportTemplateResponse, error) { +func (s *ExportService) Template(ctx context.Context, id uint, tid string) (*dto.ExportTemplateResponse, error) { v, err := s.uc.FindExportTemplate(ctx, id, tid) if err != nil { return nil, err } return exportDTO(v), nil } -func (s *ExportService) Templates(ctx context.Context, page, size int, q *biz.ExportTemplate) ([]*ExportTemplateResponse, int64, error) { +func (s *ExportService) Templates(ctx context.Context, page, size int, q *biz.ExportTemplate) ([]*dto.ExportTemplateResponse, int64, error) { items, total, err := s.uc.ListExportTemplates(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*ExportTemplateResponse, 0, len(items)) + out := make([]*dto.ExportTemplateResponse, 0, len(items)) for _, v := range items { out = append(out, exportDTO(v)) } diff --git a/internal/service/integration_config.go b/internal/service/integration_config.go index dff4240..a5553a7 100644 --- a/internal/service/integration_config.go +++ b/internal/service/integration_config.go @@ -5,6 +5,7 @@ import ( "encoding/json" "kra/internal/biz" + "kra/internal/service/dto" ) type IntegrationConfigService struct{ uc *biz.IntegrationConfigUsecase } @@ -13,7 +14,7 @@ func NewIntegrationConfigService(uc *biz.IntegrationConfigUsecase) *IntegrationC return &IntegrationConfigService{uc: uc} } -func (s *IntegrationConfigService) List(ctx context.Context, kind string) ([]*IntegrationConfigResponse, error) { +func (s *IntegrationConfigService) List(ctx context.Context, kind string) ([]*dto.IntegrationConfigResponse, error) { configs, err := s.uc.List(ctx, kind) if err != nil { return nil, err @@ -25,7 +26,7 @@ func (s *IntegrationConfigService) List(ctx context.Context, kind string) ([]*In } } definitions := biz.IntegrationDefinitions(kind) - result := make([]*IntegrationConfigResponse, 0, len(definitions)+len(configs)) + result := make([]*dto.IntegrationConfigResponse, 0, len(definitions)+len(configs)) for _, definition := range definitions { config, configured := byProvider[definition.Provider] values := mergeConfigJSON(definition.Defaults, nil) @@ -35,24 +36,24 @@ func (s *IntegrationConfigService) List(ctx context.Context, kind string) ([]*In enabled = config.Enabled delete(byProvider, definition.Provider) } - result = append(result, &IntegrationConfigResponse{Kind: definition.Kind, Provider: definition.Provider, Name: definition.Name, Description: definition.Description, Enabled: enabled, Configured: configured, Config: values, Fields: definition.Fields}) + result = append(result, &dto.IntegrationConfigResponse{Kind: definition.Kind, Provider: definition.Provider, Name: definition.Name, Description: definition.Description, Enabled: enabled, Configured: configured, Config: values, Fields: definition.Fields}) } for _, config := range configs { if _, exists := byProvider[config.Provider]; !exists { continue } - result = append(result, &IntegrationConfigResponse{Kind: config.Kind, Provider: config.Provider, Name: config.Provider, Enabled: config.Enabled, Configured: true, Config: config.Values}) + result = append(result, &dto.IntegrationConfigResponse{Kind: config.Kind, Provider: config.Provider, Name: config.Provider, Enabled: config.Enabled, Configured: true, Config: config.Values}) } return result, nil } -func (s *IntegrationConfigService) Find(ctx context.Context, kind, provider string) (*IntegrationConfigResponse, error) { +func (s *IntegrationConfigService) Find(ctx context.Context, kind, provider string) (*dto.IntegrationConfigResponse, error) { config, err := s.uc.Find(ctx, kind, provider) if err != nil { return nil, err } definition, found := biz.IntegrationDefinition(config.Kind, config.Provider) - response := &IntegrationConfigResponse{Kind: config.Kind, Provider: config.Provider, Name: config.Provider, Enabled: config.Enabled, Configured: true, Config: config.Values} + response := &dto.IntegrationConfigResponse{Kind: config.Kind, Provider: config.Provider, Name: config.Provider, Enabled: config.Enabled, Configured: true, Config: config.Values} if found { response.Name = definition.Name response.Description = definition.Description @@ -62,7 +63,7 @@ func (s *IntegrationConfigService) Find(ctx context.Context, kind, provider stri return response, nil } -func (s *IntegrationConfigService) Save(ctx context.Context, kind, provider string, req *IntegrationConfigRequest) error { +func (s *IntegrationConfigService) Save(ctx context.Context, kind, provider string, req *dto.IntegrationConfigRequest) error { if req == nil { return s.uc.Save(ctx, nil) } diff --git a/internal/service/media.go b/internal/service/media.go index 44a291b..8d576d4 100644 --- a/internal/service/media.go +++ b/internal/service/media.go @@ -5,6 +5,7 @@ import ( "io" "kra/internal/biz" + "kra/internal/service/dto" ) type MediaService struct { @@ -18,45 +19,45 @@ func NewMediaService(uc *biz.MediaUsecase, settings biz.RuntimeSettings) *MediaS func (s *MediaService) MediaConfig() biz.MediaSettings { return s.settings.MediaSettings() } -func mediaDTO(v *biz.MediaFile) *MediaResponse { - return &MediaResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, ClassID: v.CategoryID, URL: v.URL, Tag: v.Tag, Key: v.Key, Size: v.Size, Mime: v.Mime, MD5: v.MD5, UserID: v.UserID} +func mediaDTO(v *biz.MediaFile) *dto.MediaResponse { + return &dto.MediaResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, ClassID: v.CategoryID, URL: v.URL, Tag: v.Tag, Key: v.Key, Size: v.Size, Mime: v.Mime, MD5: v.MD5, UserID: v.UserID} } -func categoryDTO(v *biz.AttachmentCategory) *MediaCategoryResponse { - var children []*MediaCategoryResponse +func categoryDTO(v *biz.AttachmentCategory) *dto.MediaCategoryResponse { + var children []*dto.MediaCategoryResponse if v.Children != nil { - children = make([]*MediaCategoryResponse, 0, len(v.Children)) + children = make([]*dto.MediaCategoryResponse, 0, len(v.Children)) for _, x := range v.Children { children = append(children, categoryDTO(x)) } } - return &MediaCategoryResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, PID: v.ParentID, Children: children} + return &dto.MediaCategoryResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, PID: v.ParentID, Children: children} } -func (s *MediaService) Upload(ctx context.Context, userID uint, name, mime string, categoryID int, reader io.Reader, save bool) (*MediaResponse, error) { +func (s *MediaService) Upload(ctx context.Context, userID uint, name, mime string, categoryID int, reader io.Reader, save bool) (*dto.MediaResponse, error) { v, err := s.uc.Upload(ctx, userID, name, mime, categoryID, reader, save) if err != nil { return nil, err } return mediaDTO(v), nil } -func (s *MediaService) Media(ctx context.Context, id uint) (*MediaResponse, error) { +func (s *MediaService) Media(ctx context.Context, id uint) (*dto.MediaResponse, error) { v, err := s.uc.FindMedia(ctx, id) if err != nil { return nil, err } return mediaDTO(v), nil } -func (s *MediaService) MediaList(ctx context.Context, filter biz.MediaFilter) ([]*MediaResponse, int64, error) { +func (s *MediaService) MediaList(ctx context.Context, filter biz.MediaFilter) ([]*dto.MediaResponse, int64, error) { items, total, err := s.uc.ListMedia(ctx, filter) if err != nil { return nil, 0, err } - out := make([]*MediaResponse, 0, len(items)) + out := make([]*dto.MediaResponse, 0, len(items)) for _, v := range items { out = append(out, mediaDTO(v)) } return out, total, nil } -func (s *MediaService) MediaListRequest(ctx context.Context, request *MediaListRequest) ([]*MediaResponse, int64, error) { +func (s *MediaService) MediaListRequest(ctx context.Context, request *dto.MediaListRequest) ([]*dto.MediaResponse, int64, error) { return s.MediaList(ctx, biz.MediaFilter{ Page: request.Page, PageSize: request.PageSize, Keyword: request.Keyword, CategoryID: request.ClassID, Tag: request.Tag, UserID: request.UserID, @@ -71,30 +72,30 @@ func (s *MediaService) Rename(ctx context.Context, id uint, name string) error { func (s *MediaService) ImportURLs(ctx context.Context, items []*biz.MediaFile) error { return s.uc.CreateMediaBatch(ctx, items) } -func (s *MediaService) ImportURLRequests(ctx context.Context, values []ImportMediaRequest) error { +func (s *MediaService) ImportURLRequests(ctx context.Context, values []dto.ImportMediaRequest) error { items := make([]*biz.MediaFile, 0, len(values)) for _, value := range values { items = append(items, &biz.MediaFile{Name: value.Name, CategoryID: value.ClassID, URL: value.URL, Tag: value.Tag, Key: value.Key, Size: value.Size, Mime: value.Mime, MD5: value.MD5, UserID: value.UserID}) } return s.ImportURLs(ctx, items) } -func (s *MediaService) Storage(ctx context.Context, prefix, cursor string, limit int) ([]*StorageObjectResponse, string, bool, error) { +func (s *MediaService) Storage(ctx context.Context, prefix, cursor string, limit int) ([]*dto.StorageObjectResponse, string, bool, error) { items, next, more, err := s.uc.ListStorage(ctx, prefix, cursor, limit) if err != nil { return nil, "", false, err } - out := make([]*StorageObjectResponse, 0, len(items)) + out := make([]*dto.StorageObjectResponse, 0, len(items)) for _, v := range items { - out = append(out, &StorageObjectResponse{Key: v.Path, Size: v.Size, LastModified: v.LastModified, ContentType: v.ContentType}) + out = append(out, &dto.StorageObjectResponse{Key: v.Path, Size: v.Size, LastModified: v.LastModified, ContentType: v.ContentType}) } return out, next, more, nil } -func (s *MediaService) Categories(ctx context.Context) ([]*MediaCategoryResponse, error) { +func (s *MediaService) Categories(ctx context.Context) ([]*dto.MediaCategoryResponse, error) { items, err := s.uc.ListCategories(ctx) if err != nil { return nil, err } - out := make([]*MediaCategoryResponse, 0, len(items)) + out := make([]*dto.MediaCategoryResponse, 0, len(items)) for _, v := range items { out = append(out, categoryDTO(v)) } @@ -103,7 +104,7 @@ func (s *MediaService) Categories(ctx context.Context) ([]*MediaCategoryResponse func (s *MediaService) SaveCategory(ctx context.Context, v *biz.AttachmentCategory) error { return s.uc.SaveCategory(ctx, v) } -func (s *MediaService) SaveCategoryRequest(ctx context.Context, value *CategoryRequest) error { +func (s *MediaService) SaveCategoryRequest(ctx context.Context, value *dto.CategoryRequest) error { return s.SaveCategory(ctx, &biz.AttachmentCategory{ID: value.ID, Name: value.Name, ParentID: value.PID}) } func (s *MediaService) DeleteCategory(ctx context.Context, id uint) error { diff --git a/internal/service/media_upload.go b/internal/service/media_upload.go index 41eb870..edae30d 100644 --- a/internal/service/media_upload.go +++ b/internal/service/media_upload.go @@ -3,9 +3,11 @@ package service import ( "context" "io" + + "kra/internal/service/dto" ) -func (s *MediaService) InitUpload(ctx context.Context, userID uint, name, hash string, size, chunkSize int64, total int) (*InitUploadResponse, error) { +func (s *MediaService) InitUpload(ctx context.Context, userID uint, name, hash string, size, chunkSize int64, total int) (*dto.InitUploadResponse, error) { session, media, chunks, err := s.uc.InitUpload(ctx, userID, name, hash, size, chunkSize, total) if err != nil { return nil, err @@ -13,14 +15,14 @@ func (s *MediaService) InitUpload(ctx context.Context, userID uint, name, hash s if media != nil { // The compatible response leaves UploadedChunks nil on an instant-upload hit, producing // JSON null while still returning uploadId: 0. - return &InitUploadResponse{Instant: true, Media: mediaDTO(media)}, nil + return &dto.InitUploadResponse{Instant: true, Media: mediaDTO(media)}, nil } - return &InitUploadResponse{Instant: false, UploadID: session.ID, UploadedChunks: chunks, Media: nil}, nil + return &dto.InitUploadResponse{Instant: false, UploadID: session.ID, UploadedChunks: chunks, Media: nil}, nil } func (s *MediaService) SaveChunk(ctx context.Context, userID, uploadID uint, index int, hash string, reader io.Reader) error { return s.uc.SaveChunk(ctx, userID, uploadID, index, hash, reader) } -func (s *MediaService) CompleteUpload(ctx context.Context, userID, uploadID uint) (*MediaResponse, error) { +func (s *MediaService) CompleteUpload(ctx context.Context, userID, uploadID uint) (*dto.MediaResponse, error) { v, err := s.uc.CompleteUpload(ctx, userID, uploadID, "") if err != nil { return nil, err diff --git a/internal/service/menu.go b/internal/service/menu.go index a9abcaa..7e55c58 100644 --- a/internal/service/menu.go +++ b/internal/service/menu.go @@ -4,13 +4,14 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type MenuService struct{ uc *biz.MenuUsecase } func NewMenuService(uc *biz.MenuUsecase) *MenuService { return &MenuService{uc: uc} } -func (s *MenuService) List(ctx context.Context) ([]*MenuResponse, error) { +func (s *MenuService) List(ctx context.Context) ([]*dto.MenuResponse, error) { items, err := s.uc.List(ctx) if err != nil { return nil, err @@ -18,7 +19,7 @@ func (s *MenuService) List(ctx context.Context) ([]*MenuResponse, error) { return menuResponses(items), nil } -func (s *MenuService) Tree(ctx context.Context) ([]*MenuResponse, error) { +func (s *MenuService) Tree(ctx context.Context) ([]*dto.MenuResponse, error) { items, err := s.uc.Tree(ctx) if err != nil { return nil, err @@ -26,15 +27,15 @@ func (s *MenuService) Tree(ctx context.Context) ([]*MenuResponse, error) { return menuResponses(items), nil } -func (s *MenuService) Create(ctx context.Context, req *MenuRequest) error { +func (s *MenuService) Create(ctx context.Context, req *dto.MenuRequest) error { return s.uc.Create(ctx, menuDomain(req)) } -func (s *MenuService) Update(ctx context.Context, req *MenuRequest) error { +func (s *MenuService) Update(ctx context.Context, req *dto.MenuRequest) error { return s.uc.Update(ctx, menuDomain(req)) } func (s *MenuService) Delete(ctx context.Context, id uint) error { return s.uc.Delete(ctx, id) } -func (s *MenuService) Find(ctx context.Context, id uint) (*MenuResponse, error) { +func (s *MenuService) Find(ctx context.Context, id uint) (*dto.MenuResponse, error) { item, err := s.uc.Find(ctx, id) if err != nil { return nil, err @@ -42,7 +43,7 @@ func (s *MenuService) Find(ctx context.Context, id uint) (*MenuResponse, error) return menuResponse(item), nil } -func (s *MenuService) SetAuthorityMenus(ctx context.Context, req *SetAuthorityMenusRequest) error { +func (s *MenuService) SetAuthorityMenus(ctx context.Context, req *dto.SetAuthorityMenusRequest) error { ids := make([]uint, 0, len(req.Menus)) for _, menu := range req.Menus { ids = append(ids, menu.ID) @@ -50,15 +51,15 @@ func (s *MenuService) SetAuthorityMenus(ctx context.Context, req *SetAuthorityMe return s.uc.SetAuthorityMenus(ctx, req.AuthorityID, ids) } -func (s *MenuService) AuthorityMenus(ctx context.Context, authorityID uint) ([]*AuthorityMenuResponse, error) { +func (s *MenuService) AuthorityMenus(ctx context.Context, authorityID uint) ([]*dto.AuthorityMenuResponse, error) { items, err := s.uc.AuthorityMenus(ctx, authorityID) if err != nil { return nil, err } - var out []*AuthorityMenuResponse + var out []*dto.AuthorityMenuResponse for _, item := range items { item.MenuID = item.ID - out = append(out, &AuthorityMenuResponse{DynamicMenuResponse: dynamicMenuResponse(item), AuthorityID: authorityID}) + out = append(out, &dto.AuthorityMenuResponse{DynamicMenuResponse: dynamicMenuResponse(item), AuthorityID: authorityID}) } return out, nil } @@ -69,11 +70,11 @@ func (s *MenuService) RoleIDs(ctx context.Context, menuID uint) ([]uint, error) func (s *MenuService) DefaultRouterRoleIDs(ctx context.Context, menuID uint) ([]uint, error) { return s.uc.DefaultRouterRoleIDs(ctx, menuID) } -func (s *MenuService) SetRoles(ctx context.Context, req *SetMenuRolesRequest) error { +func (s *MenuService) SetRoles(ctx context.Context, req *dto.SetMenuRolesRequest) error { return s.uc.SetRoles(ctx, req.MenuID, req.AuthorityIDs) } -func menuDomain(v *MenuRequest) *biz.Menu { +func menuDomain(v *dto.MenuRequest) *biz.Menu { menu := &biz.Menu{CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, ID: v.ID, ParentID: v.ParentID, Path: v.Path, Name: v.Name, Hidden: v.Hidden, Component: v.Component, Sort: v.Sort, ActiveName: v.Meta.ActiveName, KeepAlive: v.Meta.KeepAlive, DefaultMenu: v.Meta.DefaultMenu, Title: v.Meta.Title, Icon: v.Meta.Icon, CloseTab: v.Meta.CloseTab, TransitionType: v.Meta.TransitionType} menu.Buttons = make([]*biz.MenuButton, 0, len(v.MenuButtons)) for _, button := range v.MenuButtons { @@ -86,44 +87,44 @@ func menuDomain(v *MenuRequest) *biz.Menu { return menu } -func menuResponse(menu *biz.Menu) *MenuResponse { - var children []*MenuResponse +func menuResponse(menu *biz.Menu) *dto.MenuResponse { + var children []*dto.MenuResponse if menu.Children != nil { - children = make([]*MenuResponse, 0, len(menu.Children)) + children = make([]*dto.MenuResponse, 0, len(menu.Children)) for _, child := range menu.Children { children = append(children, menuResponse(child)) } } - var buttons []MenuButtonResponse + var buttons []dto.MenuButtonResponse if menu.Buttons != nil { - buttons = make([]MenuButtonResponse, 0, len(menu.Buttons)) + buttons = make([]dto.MenuButtonResponse, 0, len(menu.Buttons)) for _, button := range menu.Buttons { - buttons = append(buttons, MenuButtonResponse{CreatedAt: button.CreatedAt, UpdatedAt: button.UpdatedAt, ID: button.ID, Name: button.Name, Description: button.Description, SysBaseMenuID: button.MenuID}) + buttons = append(buttons, dto.MenuButtonResponse{CreatedAt: button.CreatedAt, UpdatedAt: button.UpdatedAt, ID: button.ID, Name: button.Name, Description: button.Description, SysBaseMenuID: button.MenuID}) } } - var parameters []MenuParameterResponse + var parameters []dto.MenuParameterResponse if menu.Parameters != nil { - parameters = make([]MenuParameterResponse, 0, len(menu.Parameters)) + parameters = make([]dto.MenuParameterResponse, 0, len(menu.Parameters)) for _, parameter := range menu.Parameters { - parameters = append(parameters, MenuParameterResponse{CreatedAt: parameter.CreatedAt, UpdatedAt: parameter.UpdatedAt, ID: parameter.ID, SysBaseMenuID: parameter.MenuID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}) + parameters = append(parameters, dto.MenuParameterResponse{CreatedAt: parameter.CreatedAt, UpdatedAt: parameter.UpdatedAt, ID: parameter.ID, SysBaseMenuID: parameter.MenuID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}) } } - return &MenuResponse{CreatedAt: menu.CreatedAt, UpdatedAt: menu.UpdatedAt, ID: menu.ID, MenuID: menu.MenuID, ParentID: menu.ParentID, Path: menu.Path, Name: menu.Name, Hidden: menu.Hidden, Component: menu.Component, Sort: menu.Sort, Meta: MenuMetaResponse{ActiveName: menu.ActiveName, KeepAlive: menu.KeepAlive, DefaultMenu: menu.DefaultMenu, Title: menu.Title, Icon: menu.Icon, CloseTab: menu.CloseTab, TransitionType: menu.TransitionType}, Children: children, Parameters: parameters, MenuButtons: buttons} + return &dto.MenuResponse{CreatedAt: menu.CreatedAt, UpdatedAt: menu.UpdatedAt, ID: menu.ID, MenuID: menu.MenuID, ParentID: menu.ParentID, Path: menu.Path, Name: menu.Name, Hidden: menu.Hidden, Component: menu.Component, Sort: menu.Sort, Meta: dto.MenuMetaResponse{ActiveName: menu.ActiveName, KeepAlive: menu.KeepAlive, DefaultMenu: menu.DefaultMenu, Title: menu.Title, Icon: menu.Icon, CloseTab: menu.CloseTab, TransitionType: menu.TransitionType}, Children: children, Parameters: parameters, MenuButtons: buttons} } -func dynamicMenuResponse(menu *biz.Menu) *DynamicMenuResponse { - var children []*DynamicMenuResponse +func dynamicMenuResponse(menu *biz.Menu) *dto.DynamicMenuResponse { + var children []*dto.DynamicMenuResponse if menu.Children != nil { - children = make([]*DynamicMenuResponse, 0, len(menu.Children)) + children = make([]*dto.DynamicMenuResponse, 0, len(menu.Children)) for _, child := range menu.Children { children = append(children, dynamicMenuResponse(child)) } } - var parameters []MenuParameterResponse + var parameters []dto.MenuParameterResponse if menu.Parameters != nil { - parameters = make([]MenuParameterResponse, 0, len(menu.Parameters)) + parameters = make([]dto.MenuParameterResponse, 0, len(menu.Parameters)) for _, parameter := range menu.Parameters { - parameters = append(parameters, MenuParameterResponse{CreatedAt: parameter.CreatedAt, UpdatedAt: parameter.UpdatedAt, ID: parameter.ID, SysBaseMenuID: parameter.MenuID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}) + parameters = append(parameters, dto.MenuParameterResponse{CreatedAt: parameter.CreatedAt, UpdatedAt: parameter.UpdatedAt, ID: parameter.ID, SysBaseMenuID: parameter.MenuID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}) } } var buttonAuthorities map[string]uint @@ -136,22 +137,22 @@ func dynamicMenuResponse(menu *biz.Menu) *DynamicMenuResponse { } buttonAuthorities[button.Name] = button.AuthorityID } - return &DynamicMenuResponse{CreatedAt: menu.CreatedAt, UpdatedAt: menu.UpdatedAt, ID: menu.ID, MenuID: menu.MenuID, ParentID: menu.ParentID, Path: menu.Path, Name: menu.Name, Hidden: menu.Hidden, Component: menu.Component, Sort: menu.Sort, Meta: MenuMetaResponse{ActiveName: menu.ActiveName, KeepAlive: menu.KeepAlive, DefaultMenu: menu.DefaultMenu, Title: menu.Title, Icon: menu.Icon, CloseTab: menu.CloseTab, TransitionType: menu.TransitionType}, Children: children, Parameters: parameters, MenuButtons: nil, Buttons: buttonAuthorities} + return &dto.DynamicMenuResponse{CreatedAt: menu.CreatedAt, UpdatedAt: menu.UpdatedAt, ID: menu.ID, MenuID: menu.MenuID, ParentID: menu.ParentID, Path: menu.Path, Name: menu.Name, Hidden: menu.Hidden, Component: menu.Component, Sort: menu.Sort, Meta: dto.MenuMetaResponse{ActiveName: menu.ActiveName, KeepAlive: menu.KeepAlive, DefaultMenu: menu.DefaultMenu, Title: menu.Title, Icon: menu.Icon, CloseTab: menu.CloseTab, TransitionType: menu.TransitionType}, Children: children, Parameters: parameters, MenuButtons: nil, Buttons: buttonAuthorities} } -func menuResponses(items []*biz.Menu) []*MenuResponse { +func menuResponses(items []*biz.Menu) []*dto.MenuResponse { if items == nil { return nil } - out := make([]*MenuResponse, 0, len(items)) + out := make([]*dto.MenuResponse, 0, len(items)) for _, item := range items { out = append(out, menuResponse(item)) } return out } -func dynamicMenuResponses(items []*biz.Menu) []*DynamicMenuResponse { - out := make([]*DynamicMenuResponse, 0, len(items)) +func dynamicMenuResponses(items []*biz.Menu) []*dto.DynamicMenuResponse { + out := make([]*dto.DynamicMenuResponse, 0, len(items)) for _, item := range items { out = append(out, dynamicMenuResponse(item)) } diff --git a/internal/service/menu_test.go b/internal/service/menu_test.go index 7140bfb..3931d78 100644 --- a/internal/service/menu_test.go +++ b/internal/service/menu_test.go @@ -6,19 +6,20 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) func TestMenuDomainPreservesRelationIdentity(t *testing.T) { createdAt := time.Date(2025, time.March, 4, 5, 6, 7, 0, time.UTC) updatedAt := time.Date(2025, time.April, 5, 6, 7, 8, 0, time.UTC) - menu := menuDomain(&MenuRequest{ + menu := menuDomain(&dto.MenuRequest{ CreatedAt: createdAt, UpdatedAt: updatedAt, ID: 10, - MenuButtons: []MenuButtonRequest{{ + MenuButtons: []dto.MenuButtonRequest{{ CreatedAt: createdAt, UpdatedAt: updatedAt, ID: 31, Name: "edit", Description: "编辑", }}, - Parameters: []MenuParameterRequest{{ + Parameters: []dto.MenuParameterRequest{{ CreatedAt: createdAt, UpdatedAt: updatedAt, ID: 21, Type: "query", Key: "id", Value: "1", }}, }) diff --git a/internal/service/parameter.go b/internal/service/parameter.go index 7f6518d..9c0633a 100644 --- a/internal/service/parameter.go +++ b/internal/service/parameter.go @@ -5,6 +5,7 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) type ParameterService struct{ uc *biz.ParameterUsecase } @@ -13,40 +14,40 @@ func NewParameterService(uc *biz.ParameterUsecase) *ParameterService { return &ParameterService{uc: uc} } -func parameterDomain(value *SystemParameterRequest) *biz.SystemParameter { +func parameterDomain(value *dto.SystemParameterRequest) *biz.SystemParameter { return &biz.SystemParameter{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, Name: value.Name, Key: value.Key, Value: value.Value, Desc: value.Description} } -func (s *ParameterService) CreateParameterRequest(ctx context.Context, req *SystemParameterRequest) error { +func (s *ParameterService) CreateParameterRequest(ctx context.Context, req *dto.SystemParameterRequest) error { return s.CreateParameter(ctx, parameterDomain(req)) } -func (s *ParameterService) UpdateParameterRequest(ctx context.Context, req *SystemParameterRequest) error { +func (s *ParameterService) UpdateParameterRequest(ctx context.Context, req *dto.SystemParameterRequest) error { return s.UpdateParameter(ctx, parameterDomain(req)) } -func (s *ParameterService) ParametersFilter(ctx context.Context, page, size int, name, key string, start, end *time.Time) ([]*SystemParameterResponse, int64, error) { +func (s *ParameterService) ParametersFilter(ctx context.Context, page, size int, name, key string, start, end *time.Time) ([]*dto.SystemParameterResponse, int64, error) { return s.Parameters(ctx, page, size, &biz.SystemParameter{Name: name, Key: key, StartCreatedAt: start, EndCreatedAt: end}) } -func parameterDTO(v *biz.SystemParameter) *SystemParameterResponse { - return &SystemParameterResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Key: v.Key, Value: v.Value, Desc: v.Desc} +func parameterDTO(v *biz.SystemParameter) *dto.SystemParameterResponse { + return &dto.SystemParameterResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Key: v.Key, Value: v.Value, Desc: v.Desc} } -func (s *ParameterService) Parameters(ctx context.Context, page, size int, q *biz.SystemParameter) ([]*SystemParameterResponse, int64, error) { +func (s *ParameterService) Parameters(ctx context.Context, page, size int, q *biz.SystemParameter) ([]*dto.SystemParameterResponse, int64, error) { items, total, err := s.uc.ListParameters(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*SystemParameterResponse, 0, len(items)) + out := make([]*dto.SystemParameterResponse, 0, len(items)) for _, v := range items { out = append(out, parameterDTO(v)) } return out, total, nil } -func (s *ParameterService) ParameterByID(ctx context.Context, id string) (*SystemParameterResponse, error) { +func (s *ParameterService) ParameterByID(ctx context.Context, id string) (*dto.SystemParameterResponse, error) { v, err := s.uc.FindParameterByID(ctx, id) if err != nil { return nil, err } return parameterDTO(v), nil } -func (s *ParameterService) ParameterByKey(ctx context.Context, key string) (*SystemParameterResponse, error) { +func (s *ParameterService) ParameterByKey(ctx context.Context, key string) (*dto.SystemParameterResponse, error) { v, err := s.uc.FindParameterByKey(ctx, key) if err != nil { return nil, err diff --git a/internal/service/payment.go b/internal/service/payment.go index f21c40c..5363153 100644 --- a/internal/service/payment.go +++ b/internal/service/payment.go @@ -5,17 +5,18 @@ import ( "errors" "kra/internal/biz" + "kra/internal/service/dto" ) type PaymentService struct{ uc *biz.PaymentUsecase } func NewPaymentService(uc *biz.PaymentUsecase) *PaymentService { return &PaymentService{uc: uc} } -func (s *PaymentService) Order(ctx context.Context, provider, tradeNo string) (*PaymentOrderResponse, error) { +func (s *PaymentService) Order(ctx context.Context, provider, tradeNo string) (*dto.PaymentOrderResponse, error) { order, err := s.uc.Order(ctx, provider, tradeNo) if err != nil { return nil, err } - return &PaymentOrderResponse{ + return &dto.PaymentOrderResponse{ ID: order.ID, Provider: order.Provider, TradeNo: order.TradeNo, ProviderTradeNo: order.ProviderTradeNo, BusinessType: order.BusinessType, BusinessID: order.BusinessID, Subject: order.Subject, @@ -32,7 +33,7 @@ func (s *PaymentService) Order(ctx context.Context, provider, tradeNo string) (* }, nil } -func (s *PaymentService) Orders(ctx context.Context, req *PaymentOrderListRequest) ([]*PaymentOrderResponse, int64, int, int, error) { +func (s *PaymentService) Orders(ctx context.Context, req *dto.PaymentOrderListRequest) ([]*dto.PaymentOrderResponse, int64, int, int, error) { if req == nil { return nil, 0, 1, 10, errors.New("支付订单列表请求为空") } @@ -50,7 +51,7 @@ func (s *PaymentService) Orders(ctx context.Context, req *PaymentOrderListReques if err != nil { return nil, 0, page, pageSize, err } - result := make([]*PaymentOrderResponse, 0, len(items)) + result := make([]*dto.PaymentOrderResponse, 0, len(items)) for _, item := range items { converted, convertErr := paymentOrderResponse(item) if convertErr != nil { @@ -61,11 +62,11 @@ func (s *PaymentService) Orders(ctx context.Context, req *PaymentOrderListReques return result, total, page, pageSize, nil } -func paymentOrderResponse(order *biz.PaymentOrder) (*PaymentOrderResponse, error) { +func paymentOrderResponse(order *biz.PaymentOrder) (*dto.PaymentOrderResponse, error) { if order == nil { return nil, errors.New("支付订单为空") } - return &PaymentOrderResponse{ + return &dto.PaymentOrderResponse{ ID: order.ID, Provider: order.Provider, TradeNo: order.TradeNo, ProviderTradeNo: order.ProviderTradeNo, BusinessType: order.BusinessType, BusinessID: order.BusinessID, Subject: order.Subject, PaymentMode: order.PaymentMode, OriginalAmount: order.OriginalAmount, Amount: order.Amount, PaidAmount: order.PaidAmount, @@ -79,7 +80,7 @@ func paymentOrderResponse(order *biz.PaymentOrder) (*PaymentOrderResponse, error PaidAt: order.PaidAt, FulfilledAt: order.FulfilledAt, RefundedAt: order.RefundedAt, }, nil } -func (s *PaymentService) Create(ctx context.Context, req *PaymentRequest) (*PaymentResultResponse, error) { +func (s *PaymentService) Create(ctx context.Context, req *dto.PaymentRequest) (*dto.PaymentResultResponse, error) { if req == nil { return nil, errors.New("支付请求为空") } @@ -92,14 +93,14 @@ func (s *PaymentService) Create(ctx context.Context, req *PaymentRequest) (*Paym }) return paymentResultResponse(result), err } -func (s *PaymentService) Query(ctx context.Context, req *PaymentQueryRequest) (*PaymentResultResponse, error) { +func (s *PaymentService) Query(ctx context.Context, req *dto.PaymentQueryRequest) (*dto.PaymentResultResponse, error) { if req == nil { return nil, errors.New("支付查询请求为空") } result, err := s.uc.Query(ctx, req.Provider, req.TradeNo) return paymentResultResponse(result), err } -func (s *PaymentService) Refund(ctx context.Context, req *PaymentRefundRequest) (*PaymentResultResponse, error) { +func (s *PaymentService) Refund(ctx context.Context, req *dto.PaymentRefundRequest) (*dto.PaymentResultResponse, error) { if req == nil { return nil, errors.New("支付退款请求为空") } @@ -107,27 +108,27 @@ func (s *PaymentService) Refund(ctx context.Context, req *PaymentRefundRequest) return paymentResultResponse(result), err } -func (s *PaymentService) TestProvider(ctx context.Context, provider string) (*PaymentTestResult, error) { +func (s *PaymentService) TestProvider(ctx context.Context, provider string) (*dto.PaymentTestResult, error) { result, err := s.uc.TestProvider(ctx, provider) if result == nil { return nil, err } - response := &PaymentTestResult{Provider: result.Provider, TradeNo: result.TradeNo, Passed: result.Passed, FullFlow: result.FullFlow, Mode: result.Mode, Stages: make([]*PaymentTestStage, 0, len(result.Stages))} + response := &dto.PaymentTestResult{Provider: result.Provider, TradeNo: result.TradeNo, Passed: result.Passed, FullFlow: result.FullFlow, Mode: result.Mode, Stages: make([]*dto.PaymentTestStage, 0, len(result.Stages))} for _, stage := range result.Stages { - response.Stages = append(response.Stages, &PaymentTestStage{Name: stage.Name, Status: stage.Status, Message: stage.Message, TradeNo: stage.TradeNo, Duration: stage.Duration}) + response.Stages = append(response.Stages, &dto.PaymentTestStage{Name: stage.Name, Status: stage.Status, Message: stage.Message, TradeNo: stage.TradeNo, Duration: stage.Duration}) } response.Result = paymentResultResponse(result.Result) return response, err } -func (s *PaymentService) Fulfill(ctx context.Context, req *PaymentFulfillRequest) (*PaymentResultResponse, error) { +func (s *PaymentService) Fulfill(ctx context.Context, req *dto.PaymentFulfillRequest) (*dto.PaymentResultResponse, error) { if req == nil { return nil, errors.New("支付发货请求为空") } result, err := s.uc.Fulfill(ctx, req.Provider, req.TradeNo) return paymentResultResponse(result), err } -func (s *PaymentService) Callback(ctx context.Context, req *PaymentCallbackRequest) (PaymentCallbackAck, error) { +func (s *PaymentService) Callback(ctx context.Context, req *dto.PaymentCallbackRequest) (dto.PaymentCallbackAck, error) { if req == nil { return paymentCallbackAckResponse(biz.DefaultPaymentCallbackAck("", false)), errors.New("支付回调请求为空") } @@ -142,15 +143,15 @@ func (s *PaymentService) Callback(ctx context.Context, req *PaymentCallbackReque return paymentCallbackAckResponse(ack), nil } -func DefaultPaymentCallbackAck(provider string, success bool) PaymentCallbackAck { +func DefaultPaymentCallbackAck(provider string, success bool) dto.PaymentCallbackAck { return paymentCallbackAckResponse(biz.DefaultPaymentCallbackAck(provider, success)) } -func paymentResultResponse(result *biz.PaymentResult) *PaymentResultResponse { +func paymentResultResponse(result *biz.PaymentResult) *dto.PaymentResultResponse { if result == nil { return nil } - return &PaymentResultResponse{ + return &dto.PaymentResultResponse{ Provider: result.Provider, Status: result.Status, TradeNo: result.TradeNo, ProviderTradeNo: result.ProviderTradeNo, Amount: result.Amount, PayerPaidAmount: result.PayerPaidAmount, CashPaidAmount: result.CashPaidAmount, @@ -164,6 +165,6 @@ func paymentResultResponse(result *biz.PaymentResult) *PaymentResultResponse { } } -func paymentCallbackAckResponse(ack biz.PaymentCallbackAck) PaymentCallbackAck { - return PaymentCallbackAck{StatusCode: ack.StatusCode, ContentType: ack.ContentType, Body: ack.Body} +func paymentCallbackAckResponse(ack biz.PaymentCallbackAck) dto.PaymentCallbackAck { + return dto.PaymentCallbackAck{StatusCode: ack.StatusCode, ContentType: ack.ContentType, Body: ack.Body} } diff --git a/internal/service/position.go b/internal/service/position.go index ba78584..35c1ee1 100644 --- a/internal/service/position.go +++ b/internal/service/position.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type PositionService struct{ uc *biz.PositionUsecase } @@ -12,31 +13,31 @@ func NewPositionService(uc *biz.PositionUsecase) *PositionService { return &PositionService{uc: uc} } -func positionDomain(value *PositionRequest) *biz.Position { +func positionDomain(value *dto.PositionRequest) *biz.Position { return &biz.Position{ID: value.ID, Name: value.Name, Code: value.Code, Sort: value.Sort, Status: value.Status, Remark: value.Remark} } -func positionResponse(value *biz.Position) *PositionResponse { - return &PositionResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Name: value.Name, Code: value.Code, Sort: value.Sort, Status: value.Status, Remark: value.Remark} +func positionResponse(value *biz.Position) *dto.PositionResponse { + return &dto.PositionResponse{ID: value.ID, CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: nil, Name: value.Name, Code: value.Code, Sort: value.Sort, Status: value.Status, Remark: value.Remark} } -func (s *PositionService) Positions(ctx context.Context, req *PositionListRequest) ([]*PositionResponse, int64, error) { +func (s *PositionService) Positions(ctx context.Context, req *dto.PositionListRequest) ([]*dto.PositionResponse, int64, error) { items, total, err := s.uc.Positions(ctx, req.Page, req.PageSize, &biz.PositionListFilter{Name: req.Name, Code: req.Code, Status: req.Status}) if err != nil { return nil, 0, err } - out := make([]*PositionResponse, 0, len(items)) + out := make([]*dto.PositionResponse, 0, len(items)) for _, item := range items { out = append(out, positionResponse(item)) } return out, total, nil } -func (s *PositionService) Create(ctx context.Context, req *PositionRequest) error { +func (s *PositionService) Create(ctx context.Context, req *dto.PositionRequest) error { return s.uc.CreatePosition(ctx, positionDomain(req)) } -func (s *PositionService) Update(ctx context.Context, req *PositionRequest) error { +func (s *PositionService) Update(ctx context.Context, req *dto.PositionRequest) error { return s.uc.UpdatePosition(ctx, positionDomain(req)) } @@ -44,7 +45,7 @@ func (s *PositionService) Delete(ctx context.Context, id uint) error { return s.uc.DeletePosition(ctx, id) } -func (s *PositionService) Position(ctx context.Context, id uint) (*PositionResponse, error) { +func (s *PositionService) Position(ctx context.Context, id uint) (*dto.PositionResponse, error) { value, err := s.uc.Position(ctx, id) if err != nil { return nil, err @@ -56,10 +57,10 @@ func (s *PositionService) UserIDs(ctx context.Context, id uint) ([]uint, error) return s.uc.PositionUserIDs(ctx, id) } -func (s *PositionService) SetUsers(ctx context.Context, req *SetPositionUsersRequest) error { +func (s *PositionService) SetUsers(ctx context.Context, req *dto.SetPositionUsersRequest) error { return s.uc.SetPositionUsers(ctx, req.PositionID, req.UserIDs) } -func (s *PositionService) SetUserPositions(ctx context.Context, req *SetUserPositionsRequest) error { +func (s *PositionService) SetUserPositions(ctx context.Context, req *dto.SetUserPositionsRequest) error { return s.uc.SetUserPositions(ctx, req.ID, req.PositionIDs) } diff --git a/internal/service/security.go b/internal/service/security.go index 0ef5c1d..71b5550 100644 --- a/internal/service/security.go +++ b/internal/service/security.go @@ -5,6 +5,7 @@ import ( "errors" "kra/internal/biz" + "kra/internal/service/dto" ) type PasswordPolicyError struct{ Err error } @@ -17,26 +18,26 @@ func IsPasswordPolicyError(err error) bool { return errors.As(err, &policyErr) } -func securityDTO(v *biz.SecurityConfig) *SecurityConfigResponse { - return &SecurityConfigResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, CaptchaOpen: v.CaptchaOpen, CaptchaTimeout: v.CaptchaTimeout, KeyLong: v.KeyLong, ImgWidth: v.ImgWidth, ImgHeight: v.ImgHeight, PwdMinLength: v.PwdMinLength, PwdRequireUpper: v.PwdRequireUpper, PwdRequireLower: v.PwdRequireLower, PwdRequireDigit: v.PwdRequireDigit, PwdRequireSpecial: v.PwdRequireSpecial, LimitEnable: v.LimitEnable, LimitWindow: v.LimitWindow, LimitCount: v.LimitCount, LockEnable: v.LockEnable, LockThreshold: v.LockThreshold, LockDuration: v.LockDuration, PwdExpireEnable: v.PwdExpireEnable, PwdExpireDays: v.PwdExpireDays, ForceNewUserChangePassword: v.ForceNewUserChangePassword} +func securityDTO(v *biz.SecurityConfig) *dto.SecurityConfigResponse { + return &dto.SecurityConfigResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, CaptchaOpen: v.CaptchaOpen, CaptchaTimeout: v.CaptchaTimeout, KeyLong: v.KeyLong, ImgWidth: v.ImgWidth, ImgHeight: v.ImgHeight, PwdMinLength: v.PwdMinLength, PwdRequireUpper: v.PwdRequireUpper, PwdRequireLower: v.PwdRequireLower, PwdRequireDigit: v.PwdRequireDigit, PwdRequireSpecial: v.PwdRequireSpecial, LimitEnable: v.LimitEnable, LimitWindow: v.LimitWindow, LimitCount: v.LimitCount, LockEnable: v.LockEnable, LockThreshold: v.LockThreshold, LockDuration: v.LockDuration, PwdExpireEnable: v.PwdExpireEnable, PwdExpireDays: v.PwdExpireDays, ForceNewUserChangePassword: v.ForceNewUserChangePassword} } func (s *SecurityService) CurrentSecurity(ctx context.Context) (*biz.SecurityConfig, error) { return s.uc.Current(ctx) } -func (s *SecurityService) Security(ctx context.Context) (*SecurityConfigResponse, error) { +func (s *SecurityService) Security(ctx context.Context) (*dto.SecurityConfigResponse, error) { value, err := s.uc.Security(ctx) if err != nil { return nil, err } return securityDTO(value), nil } -func (s *SecurityService) SaveSecurity(ctx context.Context, value *biz.SecurityConfig) (*SecurityConfigResponse, error) { +func (s *SecurityService) SaveSecurity(ctx context.Context, value *biz.SecurityConfig) (*dto.SecurityConfigResponse, error) { if err := s.uc.UpdateSecurity(ctx, value); err != nil { return nil, err } return securityDTO(value), nil } -func (s *SecurityService) SaveSecurityRequest(ctx context.Context, value *SecurityConfigRequest) (*SecurityConfigResponse, error) { +func (s *SecurityService) SaveSecurityRequest(ctx context.Context, value *dto.SecurityConfigRequest) (*dto.SecurityConfigResponse, error) { return s.SaveSecurity(ctx, &biz.SecurityConfig{ ID: value.ID, CaptchaOpen: value.CaptchaOpen, CaptchaTimeout: value.CaptchaTimeout, KeyLong: value.KeyLong, ImgWidth: value.ImgWidth, ImgHeight: value.ImgHeight, diff --git a/internal/service/system_config.go b/internal/service/system_config.go index 6caebbe..e1806e9 100644 --- a/internal/service/system_config.go +++ b/internal/service/system_config.go @@ -3,6 +3,8 @@ package service import ( "context" "encoding/json" + + "kra/internal/service/dto" ) func (s *SystemConfigService) PersistConfig(ctx context.Context) error { @@ -19,6 +21,6 @@ func (s *SystemConfigService) SystemConfig() (json.RawMessage, error) { return s.uc.ConfigurationJSON() } -func (s *SystemConfigService) SaveSystemConfig(ctx context.Context, req *SetSystemConfigRequest) error { +func (s *SystemConfigService) SaveSystemConfig(ctx context.Context, req *dto.SetSystemConfigRequest) error { return s.uc.SaveConfigurationJSON(ctx, req.Config) } diff --git a/internal/service/system_info.go b/internal/service/system_info.go index 36556bf..8cc810e 100644 --- a/internal/service/system_info.go +++ b/internal/service/system_info.go @@ -4,12 +4,14 @@ import ( "runtime" "time" + "kra/internal/service/dto" + "github.com/shirou/gopsutil/v4/cpu" "github.com/shirou/gopsutil/v4/disk" "github.com/shirou/gopsutil/v4/mem" ) -func (s *SystemConfigService) ServerInfo() (*ServerInfoResponse, error) { +func (s *SystemConfigService) ServerInfo() (*dto.ServerInfoResponse, error) { physicalCores, err := cpu.Counts(false) if err != nil { return nil, err @@ -22,19 +24,19 @@ func (s *SystemConfigService) ServerInfo() (*ServerInfoResponse, error) { if err != nil { return nil, err } - diskInfo := make([]ServerDiskResponse, 0) + diskInfo := make([]dto.ServerDiskResponse, 0) for _, mountPoint := range s.DiskMountPoints() { usage, usageErr := disk.Usage(mountPoint) if usageErr != nil { return nil, usageErr } - diskInfo = append(diskInfo, ServerDiskResponse{MountPoint: mountPoint, UsedMB: usage.Used / 1024 / 1024, UsedGB: usage.Used / 1024 / 1024 / 1024, TotalMB: usage.Total / 1024 / 1024, TotalGB: usage.Total / 1024 / 1024 / 1024, UsedPercent: int(usage.UsedPercent)}) + diskInfo = append(diskInfo, dto.ServerDiskResponse{MountPoint: mountPoint, UsedMB: usage.Used / 1024 / 1024, UsedGB: usage.Used / 1024 / 1024 / 1024, TotalMB: usage.Total / 1024 / 1024, TotalGB: usage.Total / 1024 / 1024 / 1024, UsedPercent: int(usage.UsedPercent)}) } usedMB, totalMB := memory.Used/1024/1024, memory.Total/1024/1024 - return &ServerInfoResponse{ - OS: ServerOSResponse{GOOS: runtime.GOOS, NumCPU: runtime.NumCPU(), Compiler: runtime.Compiler, GoVersion: runtime.Version(), NumGoroutine: runtime.NumGoroutine()}, - CPU: ServerCPUResponse{CPUs: cpuPercent, Cores: physicalCores}, - RAM: ServerRAMResponse{UsedMB: usedMB, TotalMB: totalMB, UsedPercent: int(memory.UsedPercent)}, + return &dto.ServerInfoResponse{ + OS: dto.ServerOSResponse{GOOS: runtime.GOOS, NumCPU: runtime.NumCPU(), Compiler: runtime.Compiler, GoVersion: runtime.Version(), NumGoroutine: runtime.NumGoroutine()}, + CPU: dto.ServerCPUResponse{CPUs: cpuPercent, Cores: physicalCores}, + RAM: dto.ServerRAMResponse{UsedMB: usedMB, TotalMB: totalMB, UsedPercent: int(memory.UsedPercent)}, Disk: diskInfo, }, nil } diff --git a/internal/service/system_init.go b/internal/service/system_init.go index 91289b9..fd2d8b1 100644 --- a/internal/service/system_init.go +++ b/internal/service/system_init.go @@ -4,9 +4,10 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) -func (s *SystemConfigService) Initialize(ctx context.Context, input *DatabaseInitRequest, apis []*biz.API) error { +func (s *SystemConfigService) Initialize(ctx context.Context, input *dto.DatabaseInitRequest, apis []*biz.API) error { driver, config := input.DBType, "" switch driver { case "mysql": @@ -23,7 +24,7 @@ func (s *SystemConfigService) Initialize(ctx context.Context, input *DatabaseIni return s.uc.Initialize(ctx, &biz.DatabaseConfig{Driver: driver, Host: input.Host, Port: input.Port, User: input.UserName, Password: input.Password, Name: input.DBName, Path: input.DBPath, Config: config, Template: input.Template, AdminPassword: input.AdminPassword, APIs: apis}) } -func (s *SystemConfigService) InitializeRoutes(ctx context.Context, input *DatabaseInitRequest, routes []Route) error { +func (s *SystemConfigService) InitializeRoutes(ctx context.Context, input *dto.DatabaseInitRequest, routes []dto.Route) error { apis := make([]*biz.API, 0, len(routes)) for _, route := range routes { path := NormalizeRoutePath(route.Path, s.settings.RouterPrefix()) diff --git a/internal/service/task.go b/internal/service/task.go index 584c3da..fa8562d 100644 --- a/internal/service/task.go +++ b/internal/service/task.go @@ -6,6 +6,7 @@ import ( "time" "kra/internal/biz" + "kra/internal/service/dto" ) type TaskService struct { @@ -15,20 +16,20 @@ type TaskService struct { func NewTaskService(uc *biz.TaskApplicationUsecase) *TaskService { return &TaskService{uc: uc} } -func taskDomain(v *TaskRequest) *biz.TimedTask { +func taskDomain(v *dto.TaskRequest) *biz.TimedTask { return &biz.TimedTask{ID: v.ID, Name: v.Name, Description: v.Description, Spec: v.Spec, WithSeconds: v.WithSeconds, ExecutorType: v.ExecutorType, MethodName: v.MethodName, Params: v.Params, HTTPURL: v.HTTPURL, HTTPMethod: v.HTTPMethod, HTTPHeader: v.HTTPHeader, HTTPBody: v.HTTPBody, HTTPAllowPrivate: v.HTTPAllowPrivate, Enabled: v.Enabled} } -func (s *TaskService) CreateRequest(ctx context.Context, req *TaskRequest) (uint, error) { +func (s *TaskService) CreateRequest(ctx context.Context, req *dto.TaskRequest) (uint, error) { value := taskDomain(req) if err := s.Create(ctx, value); err != nil { return 0, err } return value.ID, nil } -func (s *TaskService) UpdateRequest(ctx context.Context, req *TaskRequest) error { +func (s *TaskService) UpdateRequest(ctx context.Context, req *dto.TaskRequest) error { return s.Update(ctx, taskDomain(req)) } -func (s *TaskService) ListRequest(ctx context.Context, page, size int, name, executorType string, enabled *bool) ([]*TaskResponse, int64, error) { +func (s *TaskService) ListRequest(ctx context.Context, page, size int, name, executorType string, enabled *bool) ([]*dto.TaskResponse, int64, error) { return s.Tasks(ctx, page, size, &biz.TimedTask{Name: name, ExecutorType: executorType, EnabledFilter: enabled}) } func (s *TaskService) Create(ctx context.Context, v *biz.TimedTask) error { @@ -43,15 +44,15 @@ func (s *TaskService) Delete(ctx context.Context, id uint) error { func (s *TaskService) Toggle(ctx context.Context, id uint, enabled bool) error { return s.uc.Toggle(ctx, id, enabled) } -func taskDTO(v *biz.TimedTask, next *time.Time) *TaskResponse { - return &TaskResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Description: v.Description, Spec: v.Spec, WithSeconds: v.WithSeconds, ExecutorType: v.ExecutorType, MethodName: v.MethodName, Params: json.RawMessage(v.Params), HTTPURL: v.HTTPURL, HTTPMethod: v.HTTPMethod, HTTPHeader: json.RawMessage(v.HTTPHeader), HTTPBody: v.HTTPBody, HTTPAllowPrivate: v.HTTPAllowPrivate, Enabled: v.Enabled, NextRunAt: next} +func taskDTO(v *biz.TimedTask, next *time.Time) *dto.TaskResponse { + return &dto.TaskResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, Name: v.Name, Description: v.Description, Spec: v.Spec, WithSeconds: v.WithSeconds, ExecutorType: v.ExecutorType, MethodName: v.MethodName, Params: json.RawMessage(v.Params), HTTPURL: v.HTTPURL, HTTPMethod: v.HTTPMethod, HTTPHeader: json.RawMessage(v.HTTPHeader), HTTPBody: v.HTTPBody, HTTPAllowPrivate: v.HTTPAllowPrivate, Enabled: v.Enabled, NextRunAt: next} } -func (s *TaskService) Tasks(ctx context.Context, page, size int, q *biz.TimedTask) ([]*TaskResponse, int64, error) { +func (s *TaskService) Tasks(ctx context.Context, page, size int, q *biz.TimedTask) ([]*dto.TaskResponse, int64, error) { items, total, next, err := s.uc.List(ctx, page, size, q) if err != nil { return nil, 0, err } - out := make([]*TaskResponse, 0, len(items)) + out := make([]*dto.TaskResponse, 0, len(items)) for _, v := range items { var ptr *time.Time if value, ok := next[v.ID]; ok { @@ -63,14 +64,14 @@ func (s *TaskService) Tasks(ctx context.Context, page, size int, q *biz.TimedTas return out, total, nil } -func (s *TaskService) Logs(ctx context.Context, page, size int, taskID uint, status string) ([]*TaskLogResponse, int64, error) { +func (s *TaskService) Logs(ctx context.Context, page, size int, taskID uint, status string) ([]*dto.TaskLogResponse, int64, error) { items, total, err := s.uc.Logs(ctx, page, size, taskID, status) if err != nil { return nil, 0, err } - out := make([]*TaskLogResponse, 0, len(items)) + out := make([]*dto.TaskLogResponse, 0, len(items)) for _, v := range items { - out = append(out, &TaskLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, TaskID: v.TaskID, TaskName: v.TaskName, TriggerType: v.TriggerType, StartedAt: v.StartedAt, FinishedAt: v.FinishedAt, DurationMS: v.DurationMS, Status: v.Status, ErrorMsg: v.ErrorMsg, Output: v.Output}) + out = append(out, &dto.TaskLogResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, TaskID: v.TaskID, TaskName: v.TaskName, TriggerType: v.TriggerType, StartedAt: v.StartedAt, FinishedAt: v.FinishedAt, DurationMS: v.DurationMS, Status: v.Status, ErrorMsg: v.ErrorMsg, Output: v.Output}) } return out, total, nil } @@ -80,11 +81,11 @@ func (s *TaskService) Reload(ctx context.Context) error { return s.uc func (s *TaskService) Subscribe(userID uint) chan []byte { return s.uc.Subscribe(userID) } func (s *TaskService) Unsubscribe(userID uint, events chan []byte) { s.uc.Unsubscribe(userID, events) } -func (s *TaskService) RegisteredMethods() []*TaskMethodResponse { +func (s *TaskService) RegisteredMethods() []*dto.TaskMethodResponse { methods := s.uc.RegisteredMethods() - out := make([]*TaskMethodResponse, 0, len(methods)) + out := make([]*dto.TaskMethodResponse, 0, len(methods)) for _, method := range methods { - out = append(out, &TaskMethodResponse{Name: method.Name, Description: method.Description}) + out = append(out, &dto.TaskMethodResponse{Name: method.Name, Description: method.Description}) } return out } diff --git a/internal/service/user.go b/internal/service/user.go index 2eab145..a34cde6 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -4,6 +4,7 @@ import ( "context" "kra/internal/biz" + "kra/internal/service/dto" ) type userInput struct { @@ -23,23 +24,23 @@ func NewUserService(uc *biz.UserUsecase, settings *SecurityService) *UserService return &UserService{uc: uc, settings: settings} } -func userRequestInput(value *UserRequest) userInput { +func userRequestInput(value *dto.UserRequest) userInput { return userInput{ID: value.ID, Username: value.Username, Password: value.Password, NickName: value.NickName, HeaderImg: value.HeaderImg, AuthorityID: value.AuthorityID, AuthorityIDs: value.AuthorityIDs, Enable: value.Enable, Phone: value.Phone, Email: value.Email} } -func (s *UserService) ListUsersRequest(ctx context.Context, value *UserListRequest) ([]*UserResponse, int64, error) { +func (s *UserService) ListUsersRequest(ctx context.Context, value *dto.UserListRequest) ([]*dto.UserResponse, int64, error) { return s.ListUsers(ctx, value.Page, value.PageSize, &biz.UserListFilter{Username: value.Username, NickName: value.NickName, Phone: value.Phone, Email: value.Email, OrderKey: value.OrderKey, Desc: value.Desc}) } -func (s *UserService) CreateUserRequest(ctx context.Context, value *UserRequest) (*UserResponse, error) { +func (s *UserService) CreateUserRequest(ctx context.Context, value *dto.UserRequest) (*dto.UserResponse, error) { return s.createUser(ctx, userRequestInput(value)) } -func (s *UserService) UpdateUserRequest(ctx context.Context, value *UserRequest) error { +func (s *UserService) UpdateUserRequest(ctx context.Context, value *dto.UserRequest) error { return s.updateUser(ctx, userRequestInput(value)) } -func (s *UserService) UpdateSelfUserRequest(ctx context.Context, id uint, value *SelfUserRequest) error { +func (s *UserService) UpdateSelfUserRequest(ctx context.Context, id uint, value *dto.SelfUserRequest) error { return s.updateSelfUser(ctx, userInput{ID: id, NickName: value.NickName, HeaderImg: value.HeaderImg, Phone: value.Phone, Email: value.Email, Enable: value.Enable}) } -func (s *UserService) User(ctx context.Context, id uint) (*UserResponse, error) { +func (s *UserService) User(ctx context.Context, id uint) (*dto.UserResponse, error) { value, err := s.uc.User(ctx, id) if err != nil { return nil, err @@ -47,7 +48,7 @@ func (s *UserService) User(ctx context.Context, id uint) (*UserResponse, error) return convertUser(value), nil } -func (s *UserService) UserByUUID(ctx context.Context, uuid string) (*UserResponse, error) { +func (s *UserService) UserByUUID(ctx context.Context, uuid string) (*dto.UserResponse, error) { value, err := s.uc.UserByUUID(ctx, uuid) if err != nil { return nil, err @@ -55,7 +56,7 @@ func (s *UserService) UserByUUID(ctx context.Context, uuid string) (*UserRespons return convertUser(value), nil } -func (s *UserService) Menus(ctx context.Context, authorityID uint) ([]*DynamicMenuResponse, error) { +func (s *UserService) Menus(ctx context.Context, authorityID uint) ([]*dto.DynamicMenuResponse, error) { menus, err := s.uc.Menus(ctx, authorityID) if err != nil { return nil, err @@ -63,31 +64,31 @@ func (s *UserService) Menus(ctx context.Context, authorityID uint) ([]*DynamicMe return dynamicMenuResponses(menus), nil } -func (s *UserService) ListUsers(ctx context.Context, page, pageSize int, filter *biz.UserListFilter) ([]*UserResponse, int64, error) { +func (s *UserService) ListUsers(ctx context.Context, page, pageSize int, filter *biz.UserListFilter) ([]*dto.UserResponse, int64, error) { users, total, err := s.uc.ListUsers(ctx, page, pageSize, filter) if err != nil { return nil, 0, err } - result := make([]*UserResponse, 0, len(users)) + result := make([]*dto.UserResponse, 0, len(users)) for _, user := range users { result = append(result, convertUser(user)) } return result, total, nil } -func (s *UserService) Authorities(ctx context.Context) ([]*AuthorityResponse, error) { +func (s *UserService) Authorities(ctx context.Context) ([]*dto.AuthorityResponse, error) { values, err := s.uc.Authorities(ctx) if err != nil { return nil, err } - result := make([]*AuthorityResponse, 0, len(values)) + result := make([]*dto.AuthorityResponse, 0, len(values)) for _, value := range values { result = append(result, convertAuthority(*value)) } return result, nil } -func (s *UserService) createUser(ctx context.Context, input userInput) (*UserResponse, error) { +func (s *UserService) createUser(ctx context.Context, input userInput) (*dto.UserResponse, error) { if err := s.settings.ValidatePassword(ctx, input.Password); err != nil { return nil, err } diff --git a/internal/service/user_conversion.go b/internal/service/user_conversion.go index 9644586..c6e3e00 100644 --- a/internal/service/user_conversion.go +++ b/internal/service/user_conversion.go @@ -2,42 +2,43 @@ package service import ( "kra/internal/biz" + "kra/internal/service/dto" ) -func convertAuthority(value biz.Authority) *AuthorityResponse { - var menus []*MenuResponse +func convertAuthority(value biz.Authority) *dto.AuthorityResponse { + var menus []*dto.MenuResponse if value.Menus != nil { menus = menuResponses(value.Menus) } - return &AuthorityResponse{CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: value.DeletedAt, AuthorityID: value.AuthorityID, AuthorityName: value.AuthorityName, ParentID: value.ParentID, Children: nil, Menus: menus, DataScope: value.DataScope, DefaultRouter: value.DefaultRouter} + return &dto.AuthorityResponse{CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt, DeletedAt: value.DeletedAt, AuthorityID: value.AuthorityID, AuthorityName: value.AuthorityName, ParentID: value.ParentID, Children: nil, Menus: menus, DataScope: value.DataScope, DefaultRouter: value.DefaultRouter} } -func convertUser(user *biz.User) *UserResponse { - var authorities []*AuthorityResponse +func convertUser(user *biz.User) *dto.UserResponse { + var authorities []*dto.AuthorityResponse if user.Authorities != nil { - authorities = make([]*AuthorityResponse, 0, len(user.Authorities)) + authorities = make([]*dto.AuthorityResponse, 0, len(user.Authorities)) for _, value := range user.Authorities { authorities = append(authorities, convertAuthority(value)) } } - var departments []*DepartmentResponse + var departments []*dto.DepartmentResponse if user.Departments != nil { - departments = make([]*DepartmentResponse, 0, len(user.Departments)) + departments = make([]*dto.DepartmentResponse, 0, len(user.Departments)) for i := range user.Departments { departments = append(departments, departmentResponse(&user.Departments[i])) } } - var positions []*PositionResponse + var positions []*dto.PositionResponse if user.Positions != nil { - positions = make([]*PositionResponse, 0, len(user.Positions)) + positions = make([]*dto.PositionResponse, 0, len(user.Positions)) for i := range user.Positions { positions = append(positions, positionResponse(&user.Positions[i])) } } // The primary department is represented by a zero-value object when it is // absent, preserving the response shape expected by the administration UI. - var department any = DepartmentResponse{} + var department any = dto.DepartmentResponse{} if user.Department != nil { department = departmentResponse(user.Department) } - return &UserResponse{ID: user.ID, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, DeletedAt: nil, UUID: user.UUID, Username: user.Username, NickName: user.NickName, HeaderImg: user.HeaderImg, AuthorityID: user.AuthorityID, Authority: convertAuthority(user.Authority), Authorities: authorities, DeptID: user.DeptID, Department: department, Departments: departments, Positions: positions, Phone: user.Phone, Email: user.Email, Enable: user.Enable, OriginSetting: user.OriginSetting, PasswordUpdatedAt: user.PasswordUpdatedAt} + return &dto.UserResponse{ID: user.ID, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, DeletedAt: nil, UUID: user.UUID, Username: user.Username, NickName: user.NickName, HeaderImg: user.HeaderImg, AuthorityID: user.AuthorityID, Authority: convertAuthority(user.Authority), Authorities: authorities, DeptID: user.DeptID, Department: department, Departments: departments, Positions: positions, Phone: user.Phone, Email: user.Email, Enable: user.Enable, OriginSetting: user.OriginSetting, PasswordUpdatedAt: user.PasswordUpdatedAt} } diff --git a/internal/service/version.go b/internal/service/version.go index 38ae427..5fcad99 100644 --- a/internal/service/version.go +++ b/internal/service/version.go @@ -3,6 +3,7 @@ package service import ( "context" "encoding/json" + "kra/internal/service/dto" "time" "kra/internal/biz" @@ -48,7 +49,7 @@ type versionExportMenu struct { Hidden bool `json:"hidden"` Component string `json:"component"` Sort int `json:"sort"` - Meta VersionMenuMetaRequest `json:"meta"` + Meta dto.VersionMenuMetaRequest `json:"meta"` Authorities []any `json:"authoritys"` Children []*versionExportMenu `json:"children"` Parameters []versionExportMenuParameter `json:"parameters"` @@ -105,7 +106,7 @@ type versionExportDocument struct { func exportMenu(value *biz.Menu) *versionExportMenu { menu := &versionExportMenu{ Path: value.Path, Name: value.Name, Hidden: value.Hidden, Component: value.Component, Sort: value.Sort, - Meta: VersionMenuMetaRequest{ActiveName: value.ActiveName, KeepAlive: value.KeepAlive, DefaultMenu: value.DefaultMenu, Title: value.Title, Icon: value.Icon, CloseTab: value.CloseTab, TransitionType: value.TransitionType}, + Meta: dto.VersionMenuMetaRequest{ActiveName: value.ActiveName, KeepAlive: value.KeepAlive, DefaultMenu: value.DefaultMenu, Title: value.Title, Icon: value.Icon, CloseTab: value.CloseTab, TransitionType: value.TransitionType}, } if len(value.Parameters) > 0 { menu.Parameters = make([]versionExportMenuParameter, 0, len(value.Parameters)) @@ -128,8 +129,8 @@ func exportMenu(value *biz.Menu) *versionExportMenu { return menu } -func versionDTO(v *biz.Version) *VersionResponse { - return &VersionResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, VersionName: v.Name, VersionCode: v.Code, Description: v.Description, VersionData: v.Data} +func versionDTO(v *biz.Version) *dto.VersionResponse { + return &dto.VersionResponse{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, DeletedAt: nil, VersionName: v.Name, VersionCode: v.Code, Description: v.Description, VersionData: v.Data} } func versionValue(value *string) string { @@ -140,18 +141,18 @@ func versionValue(value *string) string { } func versionPointer(value string) *string { return &value } -func (s *VersionService) Versions(ctx context.Context, page, size int, name, code string, createdAtRange []*time.Time) ([]*VersionResponse, int64, error) { +func (s *VersionService) Versions(ctx context.Context, page, size int, name, code string, createdAtRange []*time.Time) ([]*dto.VersionResponse, int64, error) { items, total, err := s.uc.ListVersions(ctx, page, size, name, code, createdAtRange) if err != nil { return nil, 0, err } - out := make([]*VersionResponse, 0, len(items)) + out := make([]*dto.VersionResponse, 0, len(items)) for _, v := range items { out = append(out, versionDTO(v)) } return out, total, nil } -func (s *VersionService) Version(ctx context.Context, id uint) (*VersionResponse, error) { +func (s *VersionService) Version(ctx context.Context, id uint) (*dto.VersionResponse, error) { v, err := s.uc.FindVersion(ctx, id) if err != nil { return nil, err @@ -222,7 +223,7 @@ func (s *VersionService) Export(ctx context.Context, name, code, description str func (s *VersionService) Import(ctx context.Context, bundle *biz.VersionBundle) error { return s.uc.ImportVersionBundle(ctx, bundle) } -func versionMenuDomain(value VersionMenuRequest) *biz.Menu { +func versionMenuDomain(value dto.VersionMenuRequest) *biz.Menu { menu := &biz.Menu{Path: value.Path, Name: value.Name, Hidden: value.Hidden, Component: value.Component, Sort: value.Sort, ActiveName: value.Meta.ActiveName, KeepAlive: value.Meta.KeepAlive, DefaultMenu: value.Meta.DefaultMenu, Title: value.Meta.Title, Icon: value.Meta.Icon, CloseTab: value.Meta.CloseTab, TransitionType: value.Meta.TransitionType} for _, button := range value.MenuButtons { menu.Buttons = append(menu.Buttons, &biz.MenuButton{Name: button.Name, Description: button.Description}) @@ -235,7 +236,7 @@ func versionMenuDomain(value VersionMenuRequest) *biz.Menu { } return menu } -func (s *VersionService) ImportRequest(ctx context.Context, req *ImportVersionRequest) error { +func (s *VersionService) ImportRequest(ctx context.Context, req *dto.ImportVersionRequest) error { if req.Version.Name == "" || req.Version.Code == "" { return biz.ErrInvalidVersion } diff --git a/web/src/api/payment.js b/web/src/api/payment.js index d8a87b4..6af848b 100644 --- a/web/src/api/payment.js +++ b/web/src/api/payment.js @@ -25,6 +25,14 @@ export const refundPaymentOrder = (data) => service({ }) export const testPaymentProvider = (provider) => service({ + // The payment test route is registered at /payment/... (without the + // frontend /api proxy prefix). When the built UI is opened directly from + // the backend port, bypass axios' default /api baseURL for this request + // only. Vite/Nginx deployments continue to use the normal proxy path. + ...(typeof window !== 'undefined' && + String(window.location.port) === String(import.meta.env.VITE_SERVER_PORT || '8000') + ? { baseURL: `${window.location.origin}/` } + : {}), url: `/payment/providers/${encodeURIComponent(provider)}/test`, method: 'post' }) diff --git a/web/src/assets/styles/vue-cropper.css b/web/src/assets/styles/vue-cropper.css new file mode 100644 index 0000000..0d1a8f9 --- /dev/null +++ b/web/src/assets/styles/vue-cropper.css @@ -0,0 +1 @@ +.vue-cropper[data-v-a742df44]{position:relative;width:100%;height:100%;box-sizing:border-box;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;direction:ltr;touch-action:none;text-align:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-box[data-v-a742df44],.cropper-box-canvas[data-v-a742df44],.cropper-drag-box[data-v-a742df44],.cropper-crop-box[data-v-a742df44],.cropper-face[data-v-a742df44]{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-user-select:none;user-select:none}.cropper-box-canvas img[data-v-a742df44]{position:relative;text-align:left;-webkit-user-select:none;user-select:none;transform:none;max-width:none;max-height:none}.cropper-box[data-v-a742df44]{overflow:hidden}.cropper-move[data-v-a742df44]{cursor:move}.cropper-crop[data-v-a742df44]{cursor:crosshair}.cropper-modal[data-v-a742df44]{background:rgba(0,0,0,.5)}.cropper-view-box[data-v-a742df44]{display:block;overflow:hidden;width:100%;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;-webkit-user-select:none;user-select:none}.cropper-view-box img[data-v-a742df44]{-webkit-user-select:none;user-select:none;text-align:left;max-width:none;max-height:none}.cropper-face[data-v-a742df44]{top:0;left:0;background-color:#fff;opacity:.1}.crop-info[data-v-a742df44]{position:absolute;left:0;min-width:65px;text-align:center;color:#fff;line-height:20px;background-color:#000c;font-size:12px}.crop-line[data-v-a742df44]{position:absolute;display:block;width:100%;height:100%;opacity:.1}.line-w[data-v-a742df44]{top:-3px;left:0;height:5px;cursor:n-resize}.line-a[data-v-a742df44]{top:0;left:-3px;width:5px;cursor:w-resize}.line-s[data-v-a742df44]{bottom:-3px;left:0;height:5px;cursor:s-resize}.line-d[data-v-a742df44]{top:0;right:-3px;width:5px;cursor:e-resize}.crop-point[data-v-a742df44]{position:absolute;width:8px;height:8px;opacity:.75;background-color:#39f;border-radius:100%}.point1[data-v-a742df44]{top:-4px;left:-4px;cursor:nw-resize}.point2[data-v-a742df44]{top:-5px;left:50%;margin-left:-3px;cursor:n-resize}.point3[data-v-a742df44]{top:-4px;right:-4px;cursor:ne-resize}.point4[data-v-a742df44]{top:50%;left:-4px;margin-top:-3px;cursor:w-resize}.point5[data-v-a742df44]{top:50%;right:-4px;margin-top:-3px;cursor:e-resize}.point6[data-v-a742df44]{bottom:-5px;left:-4px;cursor:sw-resize}.point7[data-v-a742df44]{bottom:-5px;left:50%;margin-left:-3px;cursor:s-resize}.point8[data-v-a742df44]{bottom:-5px;right:-4px;cursor:se-resize}@media screen and (max-width: 500px){.crop-point[data-v-a742df44]{position:absolute;width:20px;height:20px;opacity:.45;background-color:#39f;border-radius:100%}.point1[data-v-a742df44]{top:-10px;left:-10px}.point2[data-v-a742df44],.point4[data-v-a742df44],.point5[data-v-a742df44],.point7[data-v-a742df44]{display:none}.point3[data-v-a742df44]{top:-10px;right:-10px}.point4[data-v-a742df44]{top:0;left:0}.point6[data-v-a742df44]{bottom:-10px;left:-10px}.point8[data-v-a742df44]{bottom:-10px;right:-10px}} diff --git a/web/src/assets/styles/wangeditor.css b/web/src/assets/styles/wangeditor.css new file mode 100644 index 0000000..c202fe9 --- /dev/null +++ b/web/src/assets/styles/wangeditor.css @@ -0,0 +1,27 @@ +:root, +:host { + --w-e-textarea-bg-color: #fff; + --w-e-textarea-color: #333; + --w-e-textarea-border-color: #ccc; + --w-e-textarea-slight-border-color: #e8e8e8; + --w-e-textarea-slight-color: #d4d4d4; + --w-e-textarea-slight-bg-color: #f5f2f0; + --w-e-textarea-selected-border-color: #B4D5FF; + --w-e-textarea-handler-bg-color: #4290f7; + --w-e-toolbar-color: #595959; + --w-e-toolbar-bg-color: #fff; + --w-e-toolbar-active-color: #333; + --w-e-toolbar-active-bg-color: #f1f1f1; + --w-e-toolbar-disabled-color: #999; + --w-e-toolbar-border-color: #e8e8e8; + --w-e-modal-button-bg-color: #fafafa; + --w-e-modal-button-border-color: #d9d9d9; +} + +.w-e-text-container *,.w-e-toolbar *{box-sizing:border-box;margin:0;outline:none;padding:0}.w-e-text-container blockquote,.w-e-text-container li,.w-e-text-container p,.w-e-text-container td,.w-e-text-container th,.w-e-toolbar *{line-height:1.5}.w-e-text-container{background-color:var(--w-e-textarea-bg-color);color:var(--w-e-textarea-color);height:100%;position:relative}.w-e-text-container .w-e-scroll{-webkit-overflow-scrolling:touch;height:100%}.w-e-text-container [data-slate-editor]{word-wrap:break-word;border-top:1px solid transparent;min-height:100%;outline:0;padding:0 10px;white-space:pre-wrap}.w-e-text-container [data-slate-editor] p{margin:15px 0}.w-e-text-container [data-slate-editor] h1,.w-e-text-container [data-slate-editor] h2,.w-e-text-container [data-slate-editor] h3,.w-e-text-container [data-slate-editor] h4,.w-e-text-container [data-slate-editor] h5{margin:20px 0}.w-e-text-container [data-slate-editor] img{cursor:default;display:inline!important;max-width:100%;min-height:20px;min-width:20px}.w-e-text-container [data-slate-editor] span{text-indent:0}.w-e-text-container [data-slate-editor] [data-selected=true]{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-placeholder{font-style:italic;left:10px;top:17px;width:90%}.w-e-max-length-info,.w-e-text-placeholder{color:var(--w-e-textarea-slight-color);pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.w-e-max-length-info{bottom:.5em;right:1em}.w-e-bar{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-color);font-size:14px;padding:0 5px}.w-e-bar svg{fill:var(--w-e-toolbar-color);height:14px;width:14px}.w-e-bar-show{display:flex}.w-e-bar-hidden{display:none}.w-e-hover-bar{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 5px #0000001f;position:absolute}.w-e-toolbar{flex-wrap:wrap;position:relative}.w-e-bar-divider{background-color:var(--w-e-toolbar-border-color);display:inline-flex;height:40px;margin:0 5px;width:1px}.w-e-bar-item{display:flex;height:40px;padding:4px;position:relative;text-align:center}.w-e-bar-item,.w-e-bar-item button{align-items:center;justify-content:center}.w-e-bar-item button{background:transparent;border:none;color:var(--w-e-toolbar-color);cursor:pointer;display:inline-flex;height:32px;overflow:hidden;padding:0 8px;white-space:nowrap}.w-e-bar-item button:hover{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item button .title{margin-left:5px}.w-e-bar-item .active{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item .disabled{color:var(--w-e-toolbar-disabled-color);cursor:not-allowed}.w-e-bar-item .disabled svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-menu-tooltip-v5:before{background-color:var(--w-e-toolbar-active-color);border-radius:5px;color:var(--w-e-toolbar-bg-color);content:attr(data-tooltip);font-size:.75em;opacity:0;padding:5px 10px;position:absolute;text-align:center;top:40px;transition:opacity .6s;visibility:hidden;white-space:pre;z-index:1}.w-e-menu-tooltip-v5:after{border:5px solid transparent;border-bottom:5px solid var(--w-e-toolbar-active-color);content:"";opacity:0;position:absolute;top:30px;transition:opacity .6s;visibility:hidden}.w-e-menu-tooltip-v5:hover:after,.w-e-menu-tooltip-v5:hover:before{opacity:1;visibility:visible}.w-e-menu-tooltip-v5.tooltip-right:before{left:100%;top:10px}.w-e-menu-tooltip-v5.tooltip-right:after{border-bottom-color:transparent;border-left-color:transparent;border-right-color:var(--w-e-toolbar-active-color);border-top-color:transparent;left:100%;margin-left:-10px;top:16px}.w-e-bar-item-group .w-e-bar-item-menus-container{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;display:none;left:0;margin-top:40px;position:absolute;top:0;z-index:1}.w-e-bar-item-group:hover .w-e-bar-item-menus-container{display:block}.w-e-select-list{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;left:0;margin-top:40px;max-height:350px;min-width:100px;overflow-y:auto;position:absolute;top:0;z-index:1}.w-e-select-list ul{line-height:1;list-style:none}.w-e-select-list ul .selected{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li{cursor:pointer;padding:7px 0 7px 25px;position:relative;text-align:left;white-space:nowrap}.w-e-select-list ul li:hover{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li svg{left:0;margin-left:5px;margin-top:-7px;position:absolute;top:50%}.w-e-bar-bottom .w-e-select-list{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-drop-panel{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;margin-top:40px;min-width:200px;padding:10px;position:absolute;top:0;z-index:1}.w-e-bar-bottom .w-e-drop-panel{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-modal{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;color:var(--w-e-toolbar-color);font-size:14px;min-height:40px;min-width:100px;padding:20px 15px 0;position:absolute;text-align:left;z-index:1}.w-e-modal .btn-close{cursor:pointer;line-height:1;padding:5px;position:absolute;right:8px;top:7px}.w-e-modal .btn-close svg{fill:var(--w-e-toolbar-color);height:10px;width:10px}.w-e-modal .babel-container{display:block;margin-bottom:15px}.w-e-modal .babel-container span{display:block;margin-bottom:10px}.w-e-modal .button-container{margin-bottom:15px}.w-e-modal button{background-color:var(--w-e-modal-button-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);cursor:pointer;font-weight:400;height:32px;padding:4.5px 15px;text-align:center;touch-action:manipulation;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.w-e-modal input[type=number],.w-e-modal input[type=text],.w-e-modal textarea{font-feature-settings:"tnum";background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);font-variant:tabular-nums;padding:4.5px 11px;transition:all .3s;width:100%}.w-e-modal textarea{min-height:60px}body .w-e-modal,body .w-e-modal *{box-sizing:border-box}.w-e-progress-bar{background-color:var(--w-e-textarea-handler-bg-color);height:1px;position:absolute;transition:width .3s;width:0}.w-e-full-screen-container{bottom:0!important;display:flex!important;flex-direction:column!important;height:100%!important;left:0!important;margin:0!important;padding:0!important;position:fixed;right:0!important;top:0!important;width:100%!important}.w-e-full-screen-container [data-w-e-textarea=true]{flex:1!important} +.w-e-text-container [data-slate-editor] code{background-color:var(--w-e-textarea-slight-bg-color);border-radius:3px;font-family:monospace;padding:3px}.w-e-panel-content-color{list-style:none;text-align:left;width:230px}.w-e-panel-content-color li{border:1px solid var(--w-e-toolbar-bg-color);border-radius:3px 3px;cursor:pointer;display:inline-block;padding:2px}.w-e-panel-content-color li:hover{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color li .color-block{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px 3px;height:17px;width:17px}.w-e-panel-content-color .active{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color .clear{line-height:1.5;margin-bottom:5px;width:100%}.w-e-panel-content-color .clear svg{height:16px;margin-bottom:-4px;width:16px}.w-e-text-container [data-slate-editor] blockquote{background-color:var(--w-e-textarea-slight-bg-color);border-left:8px solid var(--w-e-textarea-selected-border-color);display:block;font-size:100%;line-height:1.5;margin:10px 0;padding:10px}.w-e-panel-content-emotion{font-size:20px;list-style:none;text-align:left;width:300px}.w-e-panel-content-emotion li{border-radius:3px 3px;cursor:pointer;display:inline-block;padding:0 5px}.w-e-panel-content-emotion li:hover{background-color:var(--w-e-textarea-slight-bg-color)}.w-e-textarea-divider{border-radius:3px;margin:20px auto;padding:20px}.w-e-textarea-divider hr{background-color:var(--w-e-textarea-border-color);border:0;display:block;height:1px}.w-e-text-container [data-slate-editor] pre>code{background-color:var(--w-e-textarea-slight-bg-color);border:1px solid var(--w-e-textarea-slight-border-color);border-radius:4px 4px;display:block;font-size:14px;padding:10px;text-indent:0}.w-e-text-container [data-slate-editor] .w-e-image-container{display:inline-block;margin:0 3px}.w-e-text-container [data-slate-editor] .w-e-image-container:hover{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-container [data-slate-editor] .w-e-selected-image-container{overflow:hidden;position:relative}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .w-e-image-dragger{background-color:var(--w-e-textarea-handler-bg-color);height:7px;position:absolute;width:7px}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-top{cursor:nwse-resize;left:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-top{cursor:nesw-resize;right:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-bottom{bottom:0;cursor:nesw-resize;left:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-bottom{bottom:0;cursor:nwse-resize;right:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container:hover{box-shadow:none}.w-e-text-container [contenteditable=false] .w-e-image-container:hover{box-shadow:none} + +.w-e-text-container [data-slate-editor] .table-container{border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin-top:10px;overflow-x:auto;padding:10px;width:100%}.w-e-text-container [data-slate-editor] table{border-collapse:collapse}.w-e-text-container [data-slate-editor] table td,.w-e-text-container [data-slate-editor] table th{border:1px solid var(--w-e-textarea-border-color);line-height:1.5;min-width:30px;padding:3px 5px;text-align:left}.w-e-text-container [data-slate-editor] table th{background-color:var(--w-e-textarea-slight-bg-color);font-weight:700;text-align:center}.w-e-panel-content-table{background-color:var(--w-e-toolbar-bg-color)}.w-e-panel-content-table table{border-collapse:collapse}.w-e-panel-content-table td{border:1px solid var(--w-e-toolbar-border-color);cursor:pointer;height:15px;padding:3px 5px;width:20px}.w-e-panel-content-table td.active{background-color:var(--w-e-toolbar-active-bg-color)} +.w-e-textarea-video-container{background-image:linear-gradient(45deg,#eee 25%,transparent 0,transparent 75%,#eee 0,#eee),linear-gradient(45deg,#eee 25%,#fff 0,#fff 75%,#eee 0,#eee);background-position:0 0,10px 10px;background-size:20px 20px;border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin:10px auto 0;padding:10px 0;text-align:center} + +.w-e-text-container [data-slate-editor] pre>code{word-wrap:normal;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;-webkit-hyphens:none;hyphens:none;line-height:1.5;margin:.5em 0;overflow:auto;padding:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}.w-e-text-container [data-slate-editor] pre>code .token.cdata,.w-e-text-container [data-slate-editor] pre>code .token.comment,.w-e-text-container [data-slate-editor] pre>code .token.doctype,.w-e-text-container [data-slate-editor] pre>code .token.prolog{color:#708090}.w-e-text-container [data-slate-editor] pre>code .token.punctuation{color:#999}.w-e-text-container [data-slate-editor] pre>code .token.namespace{opacity:.7}.w-e-text-container [data-slate-editor] pre>code .token.boolean,.w-e-text-container [data-slate-editor] pre>code .token.constant,.w-e-text-container [data-slate-editor] pre>code .token.deleted,.w-e-text-container [data-slate-editor] pre>code .token.number,.w-e-text-container [data-slate-editor] pre>code .token.property,.w-e-text-container [data-slate-editor] pre>code .token.symbol,.w-e-text-container [data-slate-editor] pre>code .token.tag{color:#905}.w-e-text-container [data-slate-editor] pre>code .token.attr-name,.w-e-text-container [data-slate-editor] pre>code .token.builtin,.w-e-text-container [data-slate-editor] pre>code .token.char,.w-e-text-container [data-slate-editor] pre>code .token.inserted,.w-e-text-container [data-slate-editor] pre>code .token.selector,.w-e-text-container [data-slate-editor] pre>code .token.string{color:#690}.w-e-text-container [data-slate-editor] pre>code .language-css .token.string,.w-e-text-container [data-slate-editor] pre>code .style .token.string,.w-e-text-container [data-slate-editor] pre>code .token.entity,.w-e-text-container [data-slate-editor] pre>code .token.operator,.w-e-text-container [data-slate-editor] pre>code .token.url{color:#9a6e3a}.w-e-text-container [data-slate-editor] pre>code .token.atrule,.w-e-text-container [data-slate-editor] pre>code .token.attr-value,.w-e-text-container [data-slate-editor] pre>code .token.keyword{color:#07a}.w-e-text-container [data-slate-editor] pre>code .token.class-name,.w-e-text-container [data-slate-editor] pre>code .token.function{color:#dd4a68}.w-e-text-container [data-slate-editor] pre>code .token.important,.w-e-text-container [data-slate-editor] pre>code .token.regex,.w-e-text-container [data-slate-editor] pre>code .token.variable{color:#e90}.w-e-text-container [data-slate-editor] pre>code .token.bold,.w-e-text-container [data-slate-editor] pre>code .token.important{font-weight:700}.w-e-text-container [data-slate-editor] pre>code .token.italic{font-style:italic}.w-e-text-container [data-slate-editor] pre>code .token.entity{cursor:help} diff --git a/web/src/components/richtext/rich-edit.vue b/web/src/components/richtext/rich-edit.vue index 64703db..cf55ba7 100644 --- a/web/src/components/richtext/rich-edit.vue +++ b/web/src/components/richtext/rich-edit.vue @@ -18,7 +18,7 @@