From 996ed818eefc79fc27c6a95ed5b8e1dc0ad26ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=B8=85?= <133814250@qq.com> Date: Mon, 24 Jul 2023 09:35:30 +0800 Subject: [PATCH] golangci-lint run --- docs/guide-zh-CN/sys-auth.md | 2 +- docs/guide-zh-CN/sys-code.md | 2 +- docs/guide-zh-CN/sys-middleware.md | 3 +- docs/guide-zh-CN/sys-queue.md | 13 + server/.golangci.yml | 284 +++++++++++++++++- server/addons/hgexample/logic/sys/table.go | 8 - server/addons/hgexample/router/websocket.go | 1 - server/api/admin/common/site.go | 1 - server/api/admin/dept/dept.go | 2 +- server/api/servmsg/cron.go | 4 - server/go.sum | 1 - .../internal/controller/admin/admin/dept.go | 7 +- .../internal/controller/admin/admin/notice.go | 7 +- .../internal/controller/admin/admin/post.go | 7 +- server/internal/controller/admin/sys/cron.go | 7 +- .../controller/admin/sys/cron_group.go | 7 +- .../controller/admin/sys/gen_codes.go | 7 +- server/internal/controller/home/base/site.go | 12 +- server/internal/library/addons/module.go | 6 +- server/internal/library/captcha/captcha.go | 31 +- .../internal/cmd/genenums/genenums_parser.go | 18 +- .../library/hggen/views/column_default.go | 2 - .../hggen/views/curd_generate_logic.go | 2 +- .../hggen/views/curd_generate_web_edit.go | 6 +- .../hggen/views/curd_generate_web_index.go | 6 +- .../hggen/views/curd_generate_web_view.go | 1 - server/internal/library/network/tcp/client.go | 2 +- .../library/network/tcp/client_cron.go | 7 +- server/internal/library/network/tcp/msg.go | 2 - .../library/network/tcp/msg_parser.go | 2 - server/internal/library/network/tcp/server.go | 2 - .../library/network/tcp/server_cron.go | 11 +- .../library/notify/feishu/sharechat.go | 4 +- server/internal/library/payment/payment.go | 1 - server/internal/library/queue/consumer.go | 33 +- server/internal/library/queue/disk/reader.go | 5 +- server/internal/library/queue/kafkamq.go | 11 +- server/internal/library/sms/sms_tencent.go | 16 +- server/internal/logic/admin/order.go | 6 +- server/internal/logic/sys/addons_config.go | 13 - server/internal/logic/sys/config.go | 13 - server/internal/logic/sys/curd_demo.go | 2 +- server/internal/logic/sys/log.go | 22 +- server/internal/logic/sys/login_log.go | 8 +- server/internal/logic/sys/serve_log.go | 2 +- server/internal/logic/tcpclient/auth.go | 2 +- .../internal/logic/tcpclient/auth_handle.go | 2 +- .../logic/tcpclient/cron_interceptor.go | 4 +- .../internal/logic/tcpserver/auth_handle.go | 14 +- .../logic/tcpserver/example_handle.go | 4 +- .../internal/logic/tcpserver/server_handle.go | 28 +- .../logic/tcpserver/server_interceptor.go | 4 +- server/internal/model/gen_codes.go | 2 +- server/internal/model/input/adminin/menu.go | 2 +- .../model/input/sysin/serve_license.go | 4 +- server/internal/websocket/client_manager.go | 23 +- .../addon/router/websocket.go.template | 1 - server/utility/file/file.go | 15 +- server/utility/tree/tree.go | 4 +- server/utility/validate/filter_test.go | 68 +++++ server/utility/validate/validate.go | 12 +- 61 files changed, 527 insertions(+), 271 deletions(-) create mode 100644 server/utility/validate/filter_test.go diff --git a/docs/guide-zh-CN/sys-auth.md b/docs/guide-zh-CN/sys-auth.md index 0aa571f..ca32a34 100644 --- a/docs/guide-zh-CN/sys-auth.md +++ b/docs/guide-zh-CN/sys-auth.md @@ -47,7 +47,7 @@ const { hasPermission } = usePermission(); type MenuRouteMeta struct { // 解释参考:https://naive-ui-admin-docs.vercel.app/guide/router.html#%E5%A4%9A%E7%BA%A7%E8%B7%AF%E7%94%B1 Title string `json:"title"` // 菜单名称 一般必填 - //Disabled bool `json:"disabled,omitempty"` // 禁用菜单 + // Disabled bool `json:"disabled,omitempty"` // 禁用菜单 Icon string `json:"icon,omitempty"` // 菜单图标 KeepAlive bool `json:"keepAlive,omitempty"` // 缓存该路由 Hidden bool `json:"hidden,omitempty"` // 隐藏菜单 diff --git a/docs/guide-zh-CN/sys-code.md b/docs/guide-zh-CN/sys-code.md index c233d2a..9dee11e 100644 --- a/docs/guide-zh-CN/sys-code.md +++ b/docs/guide-zh-CN/sys-code.md @@ -31,7 +31,7 @@ ### 生成模板配置 -- 注意:线上环境务必将allowedIPs参数设为空,考虑到项目安全问题请勿线上生成使用! +- 注意:线上环境务必将`allowedIPs`参数设为空,考虑到项目安全问题请勿线上生成使用! - 默认配置路径:server/manifest/config/config.yaml diff --git a/docs/guide-zh-CN/sys-middleware.md b/docs/guide-zh-CN/sys-middleware.md index 53e49b7..4546cb7 100644 --- a/docs/guide-zh-CN/sys-middleware.md +++ b/docs/guide-zh-CN/sys-middleware.md @@ -114,7 +114,8 @@ func (c *cHello) Hello(ctx context.Context, req *user.HelloReq) (res *user.Hello ``` - 浏览器中访问响应内容如下: - ![./images/sys-middleware-com-response.png](./images/sys-middleware-com-response.png) + +![./images/sys-middleware-com-response.png](./images/sys-middleware-com-response.png) #### 自定义响应 diff --git a/docs/guide-zh-CN/sys-queue.md b/docs/guide-zh-CN/sys-queue.md index f54d5d0..e22d849 100644 --- a/docs/guide-zh-CN/sys-queue.md +++ b/docs/guide-zh-CN/sys-queue.md @@ -3,6 +3,7 @@ 目录 - 配置文件 +- 实现接口 - 一个例子 - 控制台 - 自定义队列驱动 @@ -42,6 +43,18 @@ queue: ``` +### 实现接口 +- 为了提供高度的扩展性,消费队列在设计上采用了接口化的思路。只需要实现以下接口,您就可以在任何地方注册和使用消费队列消费功能,从而实现更大的灵活性和可扩展性。 + +```go +// Consumer 消费者接口,实现该接口即可加入到消费队列中 +type Consumer interface { + GetTopic() string // 获取消费主题 + Handle(ctx context.Context, mqMsg MqMsg) (err error) // 处理消息的方法 +} +``` + + ### 一个例子 每个被发送到队列的消息应该被定义为一个单独的文件结构。 diff --git a/server/.golangci.yml b/server/.golangci.yml index 674f24a..99fa62e 100644 --- a/server/.golangci.yml +++ b/server/.golangci.yml @@ -1,3 +1,283 @@ +## This file contains all available configuration options +## with their default values. + +# See https://github.com/golangci/golangci-lint#config-file +# See https://golangci-lint.run/usage/configuration/ + +# Options for analysis running. run: - skip-dirs: # 设置要忽略的目录 - - internal/library/hggen/internal \ No newline at end of file + # Exit code when at least one issue was found. + # Default: 1 + issues-exit-code: 2 + + # Include test files or not. + # Default: true + tests: false + + # Which dirs to skip: issues from them won't be reported. + # Can use regexp here: `generated.*`, regexp is applied on full path. + # Default value is empty list, + # but default dirs are skipped independently of this option's value (see skip-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work on Windows. + skip-dirs: + - internal/library/hggen/internal + + # Which files to skip: they will be analyzed, but issues from them won't be reported. + # Default value is empty list, + # but there is no need to include all autogenerated files, + # we confidently recognize autogenerated files. + # If it's not please let us know. + # "/" will be replaced by current OS file path separator to properly work on Windows. + skip-files: [] + + +# Main linters configurations. +# See https://golangci-lint.run/usage/linters +linters: + # Disable all default enabled linters. + disable-all: true + # Custom enable linters we want to use. + enable: + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted. + - funlen # Tool for detection of long functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # Provides diagnostics that check for bugs, performance and style issues. +# - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + - gosimple # Linter for Go source code that specializes in simplifying code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - misspell # Finds commonly misspelled English words in comments + - nolintlint # Reports ill-formed or insufficient nolint directives + - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. + - staticcheck # It's a set of rules from staticcheck. It's not the same thing as the staticcheck binary. + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - usestdlibvars # A linter that detect the possibility to use variables/constants from the Go standard library. + - whitespace # Tool for detection of leading and trailing whitespace + + +issues: + exclude-rules: + # helpers in tests often (rightfully) pass a *testing.T as their first argument + - path: _test\.go + text: "context.Context should be the first parameter of a function" + linters: + - revive + # Yes, they are, but it's okay in a test + - path: _test\.go + text: "exported func.*returns unexported type.*which can be annoying to use" + linters: + - revive + # https://github.com/go-critic/go-critic/issues/926 + - linters: + - gocritic + text: "unnecessaryDefer:" + + +# https://golangci-lint.run/usage/linters +linters-settings: + # https://golangci-lint.run/usage/linters/#misspell + misspell: + locale: US + ignore-words: + - cancelled + + # https://golangci-lint.run/usage/linters/#revive + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md + revive: + ignore-generated-header: true + severity: error + rules: + - name: atomic + - name: line-length-limit + severity: error + arguments: [ 1024 ] + - name: unhandled-error + severity: warning + disabled: true + arguments: [] + - name: var-naming + severity: warning + disabled: true + arguments: + # AllowList + - [ "ID","URL","IP","HTTP","JSON","API","UID","Id","Api","Uid","Http","Json","Ip","Url" ] + # DenyList + - [ "VM" ] + - name: string-format + severity: warning + disabled: false + arguments: + - - 'core.WriteError[1].Message' + - '/^([^A-Z]|$)/' + - must not start with a capital letter + - - 'fmt.Errorf[0]' + - '/(^|[^\.!?])$/' + - must not end in punctuation + - - panic + - '/^[^\n]*$/' + - must not contain line breaks + - name: function-result-limit + severity: warning + disabled: false + arguments: [ 4 ] + + # https://golangci-lint.run/usage/linters/#funlen + funlen: + # Checks the number of lines in a function. + # If lower than 0, disable the check. + # Default: 60 + lines: 330 + # Checks the number of statements in a function. + # If lower than 0, disable the check. + # Default: 40 + statements: -1 + + # https://golangci-lint.run/usage/linters/#goconst + goconst: + # Minimal length of string constant. + # Default: 3 + min-len: 4 + # Minimum occurrences of constant string count to trigger issue. + # Default: 3 + # For subsequent optimization, the value is reduced. + min-occurrences: 30 + # Ignore test files. + # Default: false + ignore-tests: true + # Look for existing constants matching the values. + # Default: true + match-constant: false + # Search also for duplicated numbers. + # Default: false + numbers: true + # Minimum value, only works with goconst.numbers + # Default: 3 + min: 5 + # Maximum value, only works with goconst.numbers + # Default: 3 + max: 20 + # Ignore when constant is not used as function argument. + # Default: true + ignore-calls: false + + # https://golangci-lint.run/usage/linters/#gocritic + gocritic: + disabled-checks: + - ifElseChain + - assignOp + - appendAssign + - singleCaseSwitch + - regexpMust + - typeSwitchVar + - elseif + + # https://golangci-lint.run/usage/linters/#gosimple + gosimple: + # Select the Go version to target. + # Default: 1.13 + # Deprecated: use the global `run.go` instead. + go: "1.15" + # Sxxxx checks in https://staticcheck.io/docs/configuration/options/#checks + # Default: ["*"] + checks: [ + "all", "-S1000", "-S1001", "-S1002", "-S1008", "-S1009", "-S1016", "-S1023", "-S1025", "-S1029", "-S1034", "-S1040" + ] + + # https://golangci-lint.run/usage/linters/#govet + govet: + # Report about shadowed variables. + # Default: false + check-shadowing: true + # Settings per analyzer. + settings: + # Analyzer name, run `go tool vet help` to see all analyzers. + printf: + # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`). + # Default: [] + funcs: + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf + # shadow: + # Whether to be strict about shadowing; can be noisy. + # Default: false + # strict: false + unusedresult: + # Comma-separated list of functions whose results must be used + # (in addition to defaults context.WithCancel,context.WithDeadline,context.WithTimeout,context.WithValue, + # errors.New,fmt.Errorf,fmt.Sprint,fmt.Sprintf,sort.Reverse) + # Default [] + funcs: + - pkg.MyFunc + - context.WithCancel + # Comma-separated list of names of methods of type func() string whose results must be used + # (in addition to default Error,String) + # Default [] + stringmethods: + - MyMethod + # Enable all analyzers. + # Default: false + enable-all: true + # Disable analyzers by name. + # Run `go tool vet help` to see all analyzers. + # Default: [] + disable: + - asmdecl + - assign + - atomic + - atomicalign + - bools + - buildtag + - cgocall + - composites + - copylocks + - deepequalerrors + - errorsas + - fieldalignment + - findcall + - framepointer + - httpresponse + - ifaceassert + - loopclosure + - lostcancel + - nilfunc + - nilness + - reflectvaluecompare + - shift + - shadow + - sigchanyzer + - sortslice + - stdmethods + - stringintconv + - structtag + - testinggoroutine + - tests + - unmarshal + - unreachable + - unsafeptr + - unusedwrite + + # https://golangci-lint.run/usage/linters/#staticcheck + staticcheck: + # Select the Go version to target. + # Default: "1.13" + # Deprecated: use the global `run.go` instead. + go: "1.15" + # SAxxxx checks in https://staticcheck.io/docs/configuration/options/#checks + # Default: ["*"] + checks: [ "all","-SA1019","-SA4015","-SA1029","-SA1016","-SA9003","-SA4006","-SA6003" ] + + # https://golangci-lint.run/usage/linters/#gofmt + gofmt: + # Simplify code: gofmt with `-s` option. + # Default: true + simplify: true + # Apply the rewrite rules to the source before reformatting. + # https://pkg.go.dev/cmd/gofmt + # Default: [] + rewrite-rules: [ ] + # - pattern: 'interface{}' + # replacement: 'any' + # - pattern: 'a[b:len(a)]' + # replacement: 'a[b:]' \ No newline at end of file diff --git a/server/addons/hgexample/logic/sys/table.go b/server/addons/hgexample/logic/sys/table.go index 2125a62..cd97ceb 100644 --- a/server/addons/hgexample/logic/sys/table.go +++ b/server/addons/hgexample/logic/sys/table.go @@ -87,14 +87,6 @@ func (s *sSysTable) List(ctx context.Context, in *sysin.TableListInp) (list []*s mod = mod.Where(fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, cols.Hobby, in.Hobby)) } - //// 关联表testCategory - //mod = mod.LeftJoin(hgorm.GenJoinOnRelation( - // dao.AddonHgexampleTable.Table(), cols.CategoryId, // 主表表名,关联条件 - // dao.AddonHgexampleTableCategory.Table(), "testCategory", dao.AddonHgexampleTableCategory.Columns().Id, // 关联表表名,别名,关联条件 - //)...) - // - //mod = mod.Where(`testCategory.`+dao.AddonHgexampleTableCategory.Columns().Name, "微信公众号") - totalCount, err = mod.Clone().Count(1) if err != nil { err = gerror.Wrap(err, "获取表格数据行失败,请稍后重试!") diff --git a/server/addons/hgexample/router/websocket.go b/server/addons/hgexample/router/websocket.go index a5eba36..c740b17 100644 --- a/server/addons/hgexample/router/websocket.go +++ b/server/addons/hgexample/router/websocket.go @@ -36,5 +36,4 @@ func WebSocket(ctx context.Context, group *ghttp.RouterGroup) { ws.RegisterMsg(ws.EventHandlers{ // ... }) - } diff --git a/server/api/admin/common/site.go b/server/api/admin/common/site.go index e897f46..e5d3a48 100644 --- a/server/api/admin/common/site.go +++ b/server/api/admin/common/site.go @@ -67,7 +67,6 @@ type SiteConfigRes struct { Version string `json:"version" dc:"系统版本"` WsAddr string `json:"wsAddr" dc:"客户端websocket地址"` Domain string `json:"domain" dc:"对外域名"` - //InviteUrl string `json:"inviteUrl" dc:"邀请注册地址"` } // SiteLoginConfigReq 获取登录配置 diff --git a/server/api/admin/dept/dept.go b/server/api/admin/dept/dept.go index f33b68e..2467f0b 100644 --- a/server/api/admin/dept/dept.go +++ b/server/api/admin/dept/dept.go @@ -52,7 +52,7 @@ type MaxSortReq struct { } type MaxSortRes struct { - Sort int `json:"sort" dc:"排序"` + *adminin.DeptMaxSortModel } // StatusReq 更新部门状态 diff --git a/server/api/servmsg/cron.go b/server/api/servmsg/cron.go index 88a6380..01ee439 100644 --- a/server/api/servmsg/cron.go +++ b/server/api/servmsg/cron.go @@ -12,7 +12,6 @@ type CronDeleteReq struct { type CronDeleteRes struct { tcp.ServerRes - sysin.CronDeleteModel } // CronEditReq 编辑任务 @@ -22,7 +21,6 @@ type CronEditReq struct { type CronEditRes struct { tcp.ServerRes - *sysin.CronEditModel } // CronStatusReq 修改任务状态 @@ -32,7 +30,6 @@ type CronStatusReq struct { type CronStatusRes struct { tcp.ServerRes - *sysin.CronStatusModel } // CronOnlineExecReq 在线执行 @@ -42,5 +39,4 @@ type CronOnlineExecReq struct { type CronOnlineExecRes struct { tcp.ServerRes - *sysin.OnlineExecModel } diff --git a/server/go.sum b/server/go.sum index 30472f5..c1d25d2 100644 --- a/server/go.sum +++ b/server/go.sum @@ -555,7 +555,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.1.0 h1:r8Oj8ZA2Xy12/b5KZYj3tuv7NG/fBz3TwQVvpJ9l8Rk= golang.org/x/image v0.1.0/go.mod h1:iyPr49SD/G/TBxYVB/9RRtGUT5eNbo2u4NamWeQcD5c= diff --git a/server/internal/controller/admin/admin/dept.go b/server/internal/controller/admin/admin/dept.go index ea30cc8..2b2fc3d 100644 --- a/server/internal/controller/admin/admin/dept.go +++ b/server/internal/controller/admin/admin/dept.go @@ -31,13 +31,8 @@ func (c *cDept) Edit(ctx context.Context, req *dept.EditReq) (res *dept.EditRes, // MaxSort 最大排序 func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (res *dept.MaxSortRes, err error) { - data, err := service.AdminDept().MaxSort(ctx, &req.DeptMaxSortInp) - if err != nil { - return - } - res = new(dept.MaxSortRes) - res.Sort = data.Sort + res.DeptMaxSortModel, err = service.AdminDept().MaxSort(ctx, &req.DeptMaxSortInp) return } diff --git a/server/internal/controller/admin/admin/notice.go b/server/internal/controller/admin/admin/notice.go index f3d7f03..068e71c 100644 --- a/server/internal/controller/admin/admin/notice.go +++ b/server/internal/controller/admin/admin/notice.go @@ -32,13 +32,8 @@ func (c *cNotice) Edit(ctx context.Context, req *notice.EditReq) (res *notice.Ed // MaxSort 最大排序 func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (res *notice.MaxSortRes, err error) { - data, err := service.AdminNotice().MaxSort(ctx, &req.NoticeMaxSortInp) - if err != nil { - return - } - res = new(notice.MaxSortRes) - res.Sort = data.Sort + res.NoticeMaxSortModel, err = service.AdminNotice().MaxSort(ctx, &req.NoticeMaxSortInp) return } diff --git a/server/internal/controller/admin/admin/post.go b/server/internal/controller/admin/admin/post.go index d199b11..2c2faf8 100644 --- a/server/internal/controller/admin/admin/post.go +++ b/server/internal/controller/admin/admin/post.go @@ -30,13 +30,8 @@ func (c *cPost) Edit(ctx context.Context, req *post.EditReq) (res *post.EditRes, // MaxSort 最大排序 func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (res *post.MaxSortRes, err error) { - data, err := service.AdminPost().MaxSort(ctx, &req.PostMaxSortInp) - if err != nil { - return - } - res = new(post.MaxSortRes) - res.Sort = data.Sort + res.PostMaxSortModel, err = service.AdminPost().MaxSort(ctx, &req.PostMaxSortInp) return } diff --git a/server/internal/controller/admin/sys/cron.go b/server/internal/controller/admin/sys/cron.go index 36e938f..9110ff5 100644 --- a/server/internal/controller/admin/sys/cron.go +++ b/server/internal/controller/admin/sys/cron.go @@ -33,13 +33,8 @@ func (c *cCron) Edit(ctx context.Context, req *cron.EditReq) (res *cron.EditRes, // MaxSort 最大排序 func (c *cCron) MaxSort(ctx context.Context, req *cron.MaxSortReq) (res *cron.MaxSortRes, err error) { - data, err := service.SysCron().MaxSort(ctx, &req.CronMaxSortInp) - if err != nil { - return - } - res = new(cron.MaxSortRes) - res.Sort = data.Sort + res.CronMaxSortModel, err = service.SysCron().MaxSort(ctx, &req.CronMaxSortInp) return } diff --git a/server/internal/controller/admin/sys/cron_group.go b/server/internal/controller/admin/sys/cron_group.go index 5941491..8362c95 100644 --- a/server/internal/controller/admin/sys/cron_group.go +++ b/server/internal/controller/admin/sys/cron_group.go @@ -31,13 +31,8 @@ func (c *cCronGroup) Edit(ctx context.Context, req *cron.GroupEditReq) (res *cro // MaxSort 最大排序 func (c *cCronGroup) MaxSort(ctx context.Context, req *cron.GroupMaxSortReq) (res *cron.GroupMaxSortRes, err error) { - data, err := service.SysCronGroup().MaxSort(ctx, &req.CronGroupMaxSortInp) - if err != nil { - return - } - res = new(cron.GroupMaxSortRes) - res.Sort = data.Sort + res.CronGroupMaxSortModel, err = service.SysCronGroup().MaxSort(ctx, &req.CronGroupMaxSortInp) return } diff --git a/server/internal/controller/admin/sys/gen_codes.go b/server/internal/controller/admin/sys/gen_codes.go index d7a4b2b..44a4631 100644 --- a/server/internal/controller/admin/sys/gen_codes.go +++ b/server/internal/controller/admin/sys/gen_codes.go @@ -37,13 +37,8 @@ func (c *cGenCodes) Edit(ctx context.Context, req *gencodes.EditReq) (res *genco // MaxSort 最大排序 func (c *cGenCodes) MaxSort(ctx context.Context, req *gencodes.MaxSortReq) (res *gencodes.MaxSortRes, err error) { - data, err := service.SysGenCodes().MaxSort(ctx, &req.GenCodesMaxSortInp) - if err != nil { - return - } - res = new(gencodes.MaxSortRes) - res.Sort = data.Sort + res.GenCodesMaxSortModel, err = service.SysGenCodes().MaxSort(ctx, &req.GenCodesMaxSortInp) return } diff --git a/server/internal/controller/home/base/site.go b/server/internal/controller/home/base/site.go index ebb7b11..b65ad40 100644 --- a/server/internal/controller/home/base/site.go +++ b/server/internal/controller/home/base/site.go @@ -26,13 +26,13 @@ func (a *cSite) Index(ctx context.Context, _ *base.SiteIndexReq) (res *base.Site "version": consts.VersionApp, }}) - //err = gerror.New("这是一个测试错误") - //return + // err = gerror.New("这是一个测试错误") + // return - //err = gerror.NewCode(gcode.New(10000, "这是一个测试自定义错误码错误", nil)) - //return + // err = gerror.NewCode(gcode.New(10000, "这是一个测试自定义错误码错误", nil)) + // return - //service.View().Error(ctx, gerror.New("这是一个允许被自定义格式的错误,默认和通用错误格式一致,你可以修改它")) - //return + // service.View().Error(ctx, gerror.New("这是一个允许被自定义格式的错误,默认和通用错误格式一致,你可以修改它")) + // return return } diff --git a/server/internal/library/addons/module.go b/server/internal/library/addons/module.go index 2dc0f81..cfc0e8d 100644 --- a/server/internal/library/addons/module.go +++ b/server/internal/library/addons/module.go @@ -137,9 +137,9 @@ func NewView(ctx context.Context, name string) *gview.View { } view.SetDelimiters(delimiters[0], delimiters[1]) - //// 更多配置 - //view.SetI18n() - //// ... + // 更多配置 + // view.SetI18n() + // ... return view } diff --git a/server/internal/library/captcha/captcha.go b/server/internal/library/captcha/captcha.go index 5eb0f08..9e24e46 100644 --- a/server/internal/library/captcha/captcha.go +++ b/server/internal/library/captcha/captcha.go @@ -3,7 +3,6 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// package captcha import ( @@ -17,21 +16,21 @@ import ( // Generate 生成验证码 func Generate(ctx context.Context) (id string, base64 string) { // 字符 - //driver := &base64Captcha.DriverString{ - // Height: 42, - // Width: 100, - // //NoiseCount: 50, - // //ShowLineOptions: 20, - // Length: 4, - // BgColor: &color.RGBA{ - // R: 255, - // G: 250, - // B: 250, - // A: 250, - // }, - // Source: "0123456789", // abcdefghjkmnpqrstuvwxyz23456789 - // Fonts: []string{"chromohv.ttf"}, - //} + // driver := &base64Captcha.DriverString{ + // Height: 42, + // Width: 100, + // //NoiseCount: 50, + // //ShowLineOptions: 20, + // Length: 4, + // BgColor: &color.RGBA{ + // R: 255, + // G: 250, + // B: 250, + // A: 250, + // }, + // Source: "0123456789", // abcdefghjkmnpqrstuvwxyz23456789 + // Fonts: []string{"chromohv.ttf"}, + // } // 算数 driver := &base64Captcha.DriverMath{ diff --git a/server/internal/library/hggen/internal/cmd/genenums/genenums_parser.go b/server/internal/library/hggen/internal/cmd/genenums/genenums_parser.go index 5e38492..e8b5b56 100644 --- a/server/internal/library/hggen/internal/cmd/genenums/genenums_parser.go +++ b/server/internal/library/hggen/internal/cmd/genenums/genenums_parser.go @@ -33,15 +33,15 @@ type EnumItem struct { var standardPackages = make(map[string]struct{}) -func init() { - stdPackages, err := packages.Load(nil, "std") - if err != nil { - panic(err) - } - for _, p := range stdPackages { - standardPackages[p.ID] = struct{}{} - } -} +//func init() { +// stdPackages, err := packages.Load(nil, "std") +// if err != nil { +// panic(err) +// } +// for _, p := range stdPackages { +// standardPackages[p.ID] = struct{}{} +// } +//} func NewEnumsParser(prefixes []string) *EnumsParser { return &EnumsParser{ diff --git a/server/internal/library/hggen/views/column_default.go b/server/internal/library/hggen/views/column_default.go index c155ed6..e00299a 100644 --- a/server/internal/library/hggen/views/column_default.go +++ b/server/internal/library/hggen/views/column_default.go @@ -97,7 +97,6 @@ var defaultWhereModeMap = map[string]string{ // setDefault 设置默认属性 func setDefault(field *sysin.GenCodesColumnListModel) { - setDefaultEdit(field) setDefaultFormMode(field) @@ -192,7 +191,6 @@ func setDefaultFormMode(field *sysin.GenCodesColumnListModel) { field.FormMode = FormModeInputEditor return } - } // setDefaultFormRole 设置默认表单验证 diff --git a/server/internal/library/hggen/views/curd_generate_logic.go b/server/internal/library/hggen/views/curd_generate_logic.go index 2ba3b23..fd889d9 100644 --- a/server/internal/library/hggen/views/curd_generate_logic.go +++ b/server/internal/library/hggen/views/curd_generate_logic.go @@ -19,7 +19,7 @@ const ( LogicWhereComments = "\n\t// 查询%s\n" LogicWhereNoSupport = "\t// TODO 暂不支持生成[ %s ]查询方式,请自行补充此处代码!" LogicListSimpleSelect = "\tfields, err := hgorm.GenSelect(ctx, sysin.%sListModel{}, dao.%s)\n\tif err != nil {\n\t\treturn\n\t}" - LogicListJoinSelect = "\t//关联表select\n\tfields, err := hgorm.GenJoinSelect(ctx, %sin.%sListModel{}, &dao.%s, []*hgorm.Join{\n%v\t})\n\n\tif err != nil {\n\t\terr = gerror.Wrap(err, \"获取%s关联字段失败,请稍后重试!\")\n\t\treturn\n\t}" + LogicListJoinSelect = "\t// 关联表select\n\tfields, err := hgorm.GenJoinSelect(ctx, %sin.%sListModel{}, &dao.%s, []*hgorm.Join{\n%v\t})\n\n\tif err != nil {\n\t\terr = gerror.Wrap(err, \"获取%s关联字段失败,请稍后重试!\")\n\t\treturn\n\t}" LogicListJoinOnRelation = "\t// 关联表%s\n\tmod = mod.%s(hgorm.GenJoinOnRelation(\n\t\tdao.%s.Table(), dao.%s.Columns().%s, // 主表表名,关联字段\n\t\tdao.%s.Table(), \"%s\", dao.%s.Columns().%s, // 关联表表名,别名,关联字段\n\t)...)\n\n" LogicEditUpdate = "\tif _, err = s.Model(ctx%s).\n\t\t\tFields(%sin.%sUpdateFields{}).\n\t\t\tWherePri(in.%s).Data(in).Update(); err != nil {\n\t\t\terr = gerror.Wrap(err, \"修改%s失败,请稍后重试!\")\n\t\t}\n\t\treturn" LogicEditInsert = "\tif _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).\n\t\tFields(%sin.%sInsertFields{}).\n\t\tData(in).Insert(); err != nil {\n\t\terr = gerror.Wrap(err, \"新增%s失败,请稍后重试!\")\n\t}" diff --git a/server/internal/library/hggen/views/curd_generate_web_edit.go b/server/internal/library/hggen/views/curd_generate_web_edit.go index be25616..6a5fa5a 100644 --- a/server/internal/library/hggen/views/curd_generate_web_edit.go +++ b/server/internal/library/hggen/views/curd_generate_web_edit.go @@ -56,12 +56,12 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu case FormModeDate: component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) - //case FormModeDateRange: // 必须要有两个字段,后面优化下 + // case FormModeDateRange: // 必须要有两个字段,后面优化下 case FormModeTime: component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) - //case FormModeTimeRange: // 必须要有两个字段,后面优化下 + // case FormModeTimeRange: // 必须要有两个字段,后面优化下 case FormModeRadio: component = fmt.Sprintf("\n \n \n \n ", field.Dc, field.TsName, field.TsName, field.TsName, field.TsName, in.options.dictMap[field.TsName], field.TsName, field.TsName, field.TsName) @@ -109,7 +109,6 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu } else { buffer.WriteString(" " + component + "\n\n") } - } return buffer.String() } @@ -167,7 +166,6 @@ func (l *gCurd) generateWebEditScript(ctx context.Context, in *CurdPreviewInput) importBuffer.WriteString(" import CitySelector from '@/components/CitySelector/citySelector.vue';\n") } } - } data["import"] = importBuffer.String() diff --git a/server/internal/library/hggen/views/curd_generate_web_index.go b/server/internal/library/hggen/views/curd_generate_web_index.go index aed7024..4b6c262 100644 --- a/server/internal/library/hggen/views/curd_generate_web_index.go +++ b/server/internal/library/hggen/views/curd_generate_web_index.go @@ -31,9 +31,9 @@ func (l *gCurd) webIndexTplData(ctx context.Context, in *CurdPreviewInput) (g.Ma iconsImport = append(iconsImport, " PlusOutlined") } - //// 编辑 - //if in.options.Step.HasEdit { - //} + // 编辑 + // if in.options.Step.HasEdit { + // } // 导出 if in.options.Step.HasExport { diff --git a/server/internal/library/hggen/views/curd_generate_web_view.go b/server/internal/library/hggen/views/curd_generate_web_view.go index 0ecf552..1d9166a 100644 --- a/server/internal/library/hggen/views/curd_generate_web_view.go +++ b/server/internal/library/hggen/views/curd_generate_web_view.go @@ -31,7 +31,6 @@ func (l *gCurd) generateWebViewItem(ctx context.Context, in *CurdPreviewInput) s ) switch field.FormMode { - case FormModeInputTextarea, FormModeInputEditor: component = fmt.Sprintf("\n \n ", field.Dc, field.TsName) diff --git a/server/internal/library/network/tcp/client.go b/server/internal/library/network/tcp/client.go index d457648..ad0a1f9 100644 --- a/server/internal/library/network/tcp/client.go +++ b/server/internal/library/network/tcp/client.go @@ -206,7 +206,7 @@ func (client *Client) read() { client.Close() client.logger.Debugf(client.ctx, "client are about to be reconnected..") time.Sleep(client.config.ConnectInterval) - client.Start() + _ = client.Start() }() if err := client.conn.Run(); err != nil { diff --git a/server/internal/library/network/tcp/client_cron.go b/server/internal/library/network/tcp/client_cron.go index cf54e77..87115a7 100644 --- a/server/internal/library/network/tcp/client_cron.go +++ b/server/internal/library/network/tcp/client_cron.go @@ -14,14 +14,13 @@ import ( // getCronKey 生成客户端定时任务名称 func (client *Client) getCronKey(s string) string { - return fmt.Sprintf("tcp.client_%s:%s", s, client.conn.LocalAddr().String()) + return fmt.Sprintf("tcp.client_%s:%d", s, client.conn.CID) } // stopCron 停止定时任务 func (client *Client) stopCron() { - for _, v := range gcron.Entries() { - gcron.Remove(v.Name) - } + gcron.Remove(client.getCronKey(CronHeartbeatVerify)) + gcron.Remove(client.getCronKey(CronHeartbeat)) } // startCron 启动定时任务 diff --git a/server/internal/library/network/tcp/msg.go b/server/internal/library/network/tcp/msg.go index 5a108ea..f645ce1 100644 --- a/server/internal/library/network/tcp/msg.go +++ b/server/internal/library/network/tcp/msg.go @@ -34,7 +34,6 @@ func (i *ServerRes) SetMessage(msg ...string) { message := "操作成功" if len(msg) > 0 { message = msg[0] - return } i.Message = message } @@ -45,7 +44,6 @@ func (i *ServerRes) SetError(err error) { i.Code = gerror.Code(err).Code() i.Message = err.Error() } - return } // GetError 获取响应中的错误 diff --git a/server/internal/library/network/tcp/msg_parser.go b/server/internal/library/network/tcp/msg_parser.go index fc930ca..3df173f 100644 --- a/server/internal/library/network/tcp/msg_parser.go +++ b/server/internal/library/network/tcp/msg_parser.go @@ -90,7 +90,6 @@ func (m *MsgParser) RegisterRPCRouter(routers ...interface{}) (err error) { // RegisterInterceptor 注册拦截器 func (m *MsgParser) RegisterInterceptor(interceptors ...Interceptor) { m.interceptors = append(interceptors, interceptors...) - return } // Encoding 消息编码 @@ -166,7 +165,6 @@ func (m *MsgParser) doHandleRouterMsg(ctx context.Context, handler *RouteHandler responseMsg, deErr := m.doDecoding(ctx, results[0].Interface(), msg.MsgId) if deErr != nil && responseErr == nil { responseErr = deErr - return } if responseErr != nil { diff --git a/server/internal/library/network/tcp/server.go b/server/internal/library/network/tcp/server.go index 05dff22..56cbc1d 100644 --- a/server/internal/library/network/tcp/server.go +++ b/server/internal/library/network/tcp/server.go @@ -203,7 +203,6 @@ func (server *Server) RegisterRouter(routers ...interface{}) { if err != nil { server.logger.Fatal(server.ctx, err) } - return } // RegisterRPCRouter 注册RPC路由 @@ -212,7 +211,6 @@ func (server *Server) RegisterRPCRouter(routers ...interface{}) { if err != nil { server.logger.Fatal(server.ctx, err) } - return } // RegisterInterceptor 注册拦截器 diff --git a/server/internal/library/network/tcp/server_cron.go b/server/internal/library/network/tcp/server_cron.go index 25ccbfa..bd82c74 100644 --- a/server/internal/library/network/tcp/server_cron.go +++ b/server/internal/library/network/tcp/server_cron.go @@ -19,16 +19,15 @@ func (server *Server) getCronKey(s string) string { // stopCron 停止定时任务 func (server *Server) stopCron() { - for _, v := range gcron.Entries() { - gcron.Remove(v.Name) - } + gcron.Remove(server.getCronKey(CronHeartbeatVerify)) + gcron.Remove(server.getCronKey(CronAuthVerify)) } // startCron 启动定时任务 func (server *Server) startCron() { // 心跳超时检查 if gcron.Search(server.getCronKey(CronHeartbeatVerify)) == nil { - gcron.AddSingleton(server.ctx, "@every 300s", func(ctx context.Context) { + _, _ = gcron.AddSingleton(server.ctx, "@every 300s", func(ctx context.Context) { if server == nil || server.clients == nil { return } @@ -43,7 +42,7 @@ func (server *Server) startCron() { // 认证检查 if gcron.Search(server.getCronKey(CronAuthVerify)) == nil { - gcron.AddSingleton(server.ctx, "@every 300s", func(ctx context.Context) { + _, _ = gcron.AddSingleton(server.ctx, "@every 300s", func(ctx context.Context) { if server == nil || server.clients == nil { return } @@ -52,7 +51,7 @@ func (server *Server) startCron() { continue } if client.Auth.EndAt.Before(gtime.Now()) { - client.Conn.Close() + _ = client.Conn.Close() server.logger.Debugf(server.ctx, "client auth expired, close conn. auth:%+v", client.Auth) } } diff --git a/server/internal/library/notify/feishu/sharechat.go b/server/internal/library/notify/feishu/sharechat.go index 48504ce..55ed165 100644 --- a/server/internal/library/notify/feishu/sharechat.go +++ b/server/internal/library/notify/feishu/sharechat.go @@ -18,7 +18,7 @@ func NewShareChatMessage() *ShareChatMessage { return &ShareChatMessage{} } -func (m *ShareChatMessage) SetShareChatID(ID string) *ShareChatMessage { - m.Content.ShareChatID = ID +func (m *ShareChatMessage) SetShareChatID(id string) *ShareChatMessage { + m.Content.ShareChatID = id return m } diff --git a/server/internal/library/payment/payment.go b/server/internal/library/payment/payment.go index e68c75e..94d85d1 100644 --- a/server/internal/library/payment/payment.go +++ b/server/internal/library/payment/payment.go @@ -114,7 +114,6 @@ func AutoTradeType(payType, userAgent string) (tradeType string) { } return consts.TradeTypeQQWeb default: - } return } diff --git a/server/internal/library/queue/consumer.go b/server/internal/library/queue/consumer.go index 87fdb49..ca6b84f 100644 --- a/server/internal/library/queue/consumer.go +++ b/server/internal/library/queue/consumer.go @@ -5,24 +5,24 @@ import ( "sync" ) -// consumerStrategy 消费者策略,实现该接口即可加入到消费队列中 -type consumerStrategy interface { +// Consumer 消费者接口,实现该接口即可加入到消费队列中 +type Consumer interface { GetTopic() string // 获取消费主题 - Handle(ctx context.Context, mqMsg MqMsg) (err error) // 处理消息 + Handle(ctx context.Context, mqMsg MqMsg) (err error) // 处理消息的方法 } // consumerManager 消费者管理 type consumerManager struct { sync.Mutex - list map[string]consumerStrategy // 维护的消费者列表 + list map[string]Consumer // 维护的消费者列表 } var consumers = &consumerManager{ - list: make(map[string]consumerStrategy), + list: make(map[string]Consumer), } // RegisterConsumer 注册任务到消费者队列 -func RegisterConsumer(cs consumerStrategy) { +func RegisterConsumer(cs Consumer) { consumers.Lock() defer consumers.Unlock() topic := cs.GetTopic() @@ -35,18 +35,18 @@ func RegisterConsumer(cs consumerStrategy) { // StartConsumersListener 启动所有已注册的消费者监听 func StartConsumersListener(ctx context.Context) { - for _, consumer := range consumers.list { - go func(consumer consumerStrategy) { - consumerListen(ctx, consumer) - }(consumer) + for _, c := range consumers.list { + go func(c Consumer) { + consumerListen(ctx, c) + }(c) } } // consumerListen 消费者监听 -func consumerListen(ctx context.Context, job consumerStrategy) { +func consumerListen(ctx context.Context, job Consumer) { var ( - topic = job.GetTopic() - consumer, err = InstanceConsumer() + topic = job.GetTopic() + c, err = InstanceConsumer() ) if err != nil { @@ -54,17 +54,16 @@ func consumerListen(ctx context.Context, job consumerStrategy) { return } - if listenErr := consumer.ListenReceiveMsgDo(topic, func(mqMsg MqMsg) { + if listenErr := c.ListenReceiveMsgDo(topic, func(mqMsg MqMsg) { err = job.Handle(ctx, mqMsg) - //if err != nil { + // if err != nil { // // 遇到错误,重新加入到队列 // //queue.Push(topic, mqMsg.Body) - //} + // } // 记录消费队列日志 ConsumerLog(ctx, topic, mqMsg, err) - }); listenErr != nil { Logger().Fatalf(ctx, "消费队列:%s 监听失败, err:%+v", topic, listenErr) } diff --git a/server/internal/library/queue/disk/reader.go b/server/internal/library/queue/disk/reader.go index 3e087fa..a4c77c3 100644 --- a/server/internal/library/queue/disk/reader.go +++ b/server/internal/library/queue/disk/reader.go @@ -117,8 +117,9 @@ func (r *reader) close() { // sync index and offset func (r *reader) sync() { name := path.Join(r.config.Path, indexFile) - data, _ := json.Marshal(&r.checkpoint) - _ = os.WriteFile(name, data, filePerm) + if data, err := json.Marshal(&r.checkpoint); err == nil { + _ = os.WriteFile(name, data, filePerm) + } } // restore index and offset diff --git a/server/internal/library/queue/kafkamq.go b/server/internal/library/queue/kafkamq.go index 0c0bab9..c780bb1 100644 --- a/server/internal/library/queue/kafkamq.go +++ b/server/internal/library/queue/kafkamq.go @@ -85,7 +85,7 @@ func (r *KafkaMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg)) return gerror.New("queue kafka consumer not register") } - consumer := Consumer{ + consumer := KaConsumer{ ready: make(chan bool), receiveDoFun: receiveDo, } @@ -219,26 +219,25 @@ func validateVersion(version sarama.KafkaVersion) bool { return false } -type Consumer struct { +type KaConsumer struct { ready chan bool receiveDoFun func(mqMsg MqMsg) } // Setup is run at the beginning of a new session, before ConsumeClaim -func (consumer *Consumer) Setup(sarama.ConsumerGroupSession) error { +func (consumer *KaConsumer) Setup(sarama.ConsumerGroupSession) error { // Mark the consumer as ready close(consumer.ready) return nil } // Cleanup is run at the end of a session, once all ConsumeClaim goroutines have exited -func (consumer *Consumer) Cleanup(sarama.ConsumerGroupSession) error { +func (consumer *KaConsumer) Cleanup(sarama.ConsumerGroupSession) error { return nil } // ConsumeClaim must start a consumer loop of ConsumerGroupClaim's Messages(). -func (consumer *Consumer) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { - +func (consumer *KaConsumer) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { // NOTE: // Do not move the code below to a goroutine. // The `ConsumeClaim` itself is called within a goroutine, see: diff --git a/server/internal/library/sms/sms_tencent.go b/server/internal/library/sms/sms_tencent.go index 608b23c..91d359b 100644 --- a/server/internal/library/sms/sms_tencent.go +++ b/server/internal/library/sms/sms_tencent.go @@ -85,14 +85,14 @@ func (d *TencentDrive) SendCode(ctx context.Context, in *sysin.SendCodeInp) (err * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/ request.PhoneNumberSet = common.StringPtrs([]string{fmt.Sprintf("+86%v", in.Mobile)}) - ///* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ - //request.SessionContext = common.StringPtr("") - // - ///* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ - //request.ExtendCode = common.StringPtr("") - // - ///* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ - //request.SenderId = common.StringPtr("") + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + // request.SessionContext = common.StringPtr("") + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + // request.ExtendCode = common.StringPtr("") + + /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ + // request.SenderId = common.StringPtr("") // 通过client对象调用想要访问的接口,需要传入请求对象 response, err := client.SendSms(request) diff --git a/server/internal/logic/admin/order.go b/server/internal/logic/admin/order.go index e6cdf70..f6a2810 100644 --- a/server/internal/logic/admin/order.go +++ b/server/internal/logic/admin/order.go @@ -206,8 +206,8 @@ func (s *sAdminOrder) Create(ctx context.Context, in *adminin.OrderCreateInp) (r // 读取商品信息,读取商品最终支付价格 // ... - //in.Money = 999 - //subject = fmt.Sprintf("购买商品:%v", "测试商品名称") + // in.Money = 999 + // subject = fmt.Sprintf("购买商品:%v", "测试商品名称") default: err = gerror.New("不支持的订单类型") @@ -290,7 +290,7 @@ func (s *sAdminOrder) List(ctx context.Context, in *adminin.OrderListInp) (list return } - //关联表select + // 关联表select fields, err := hgorm.GenJoinSelect(ctx, adminin.OrderListModel{}, &dao.AdminOrder, []*hgorm.Join{ {Dao: &dao.PayLog, Alias: "payLog"}, }) diff --git a/server/internal/logic/sys/addons_config.go b/server/internal/logic/sys/addons_config.go index 1381520..d36de7a 100644 --- a/server/internal/logic/sys/addons_config.go +++ b/server/internal/logic/sys/addons_config.go @@ -112,19 +112,6 @@ func (s *sSysAddonsConfig) UpdateConfigByGroup(ctx context.Context, in *sysin.Up row := s.getConfigByKey(k, models) // 新增 if row == nil { - //row.Id = 0 - //row.Key = k - //row.Value = gconv.String(v) - //row.Group = in.Group - //row.Status = consts.StatusEnabled - //row.CreatedAt = gtime.Now() - //row.UpdatedAt = gtime.Now() - //_, err := dao.SysAddonsConfig.Ctx(ctx).Data(row).Insert() - //if err != nil { - // err = gerror.Wrap(err, consts.ErrorORM) - // return err - //} - //continue return gerror.Newf("暂不支持从前台添加变量,请先在数据库表[%v]中配置变量:%v", dao.SysAddonsConfig.Table(), k) } diff --git a/server/internal/logic/sys/config.go b/server/internal/logic/sys/config.go index 74dc0ec..088da82 100644 --- a/server/internal/logic/sys/config.go +++ b/server/internal/logic/sys/config.go @@ -249,19 +249,6 @@ func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in *sysin.UpdateCo row := s.getConfigByKey(k, models) // 新增 if row == nil { - //row.Id = 0 - //row.Key = k - //row.Value = gconv.String(v) - //row.Group = in.Group - //row.Status = consts.StatusEnabled - //row.CreatedAt = gtime.Now() - //row.UpdatedAt = gtime.Now() - //_, err := dao.SysConfig.Ctx(ctx).Data(row).Insert() - //if err != nil { - // err = gerror.Wrap(err, consts.ErrorORM) - // return err - //} - //continue err = gerror.Newf("暂不支持从前台添加变量,请先在数据库表[%v]中配置变量:%v", dao.SysConfig.Table(), k) return } diff --git a/server/internal/logic/sys/curd_demo.go b/server/internal/logic/sys/curd_demo.go index 337fe33..9bb3caf 100644 --- a/server/internal/logic/sys/curd_demo.go +++ b/server/internal/logic/sys/curd_demo.go @@ -82,7 +82,7 @@ func (s *sSysCurdDemo) List(ctx context.Context, in *sysin.CurdDemoListInp) (lis return } - //关联表select + // 关联表select fields, err := hgorm.GenJoinSelect(ctx, sysin.CurdDemoListModel{}, &dao.SysGenCurdDemo, []*hgorm.Join{ {Dao: &dao.TestCategory, Alias: "testCategory"}, }) diff --git a/server/internal/logic/sys/log.go b/server/internal/logic/sys/log.go index 4b7639e..a30b53d 100644 --- a/server/internal/logic/sys/log.go +++ b/server/internal/logic/sys/log.go @@ -7,7 +7,6 @@ package sys import ( "context" - "encoding/json" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" @@ -168,7 +167,8 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog { } // 请求头 - if reqHeadersBytes, _ := json.Marshal(request.Header); len(gconv.String(reqHeadersBytes)) > 0 { + + if reqHeadersBytes, _ := gjson.New(request.Header).MarshalJSON(); len(reqHeadersBytes) > 0 { headerData = gjson.New(reqHeadersBytes) } @@ -322,26 +322,13 @@ func (s *sSysLog) List(ctx context.Context, in *sysin.LogListInp) (list []*sysin list[i].MemberName = memberName.String() } - //// 接口 - //if list[i].AppId == consts.AppApi { - // //memberName, err = dao.Member.Ctx(ctx).Fields("realname").Where("id", res.List[i].MemberId).Value() - // //if err != nil { - // // err = gerror.Wrap(err, consts.ErrorORM) - // // return nil, err - // //} - //} + // 接口 + // ... if list[i].MemberName == "" { list[i].MemberName = "游客" } - //// 获取省市编码对应的地区名称 - //region, err := dao.SysProvinces.GetRegion(ctx, list[i].ProvinceId, list[i].CityId) - //if err != nil { - // return list, totalCount, err - //} - //list[i].Region = region - // 截取请求url路径 if gstr.Contains(list[i].Url, "?") { list[i].Url = gstr.StrTillEx(list[i].Url, "?") @@ -354,7 +341,6 @@ func (s *sSysLog) List(ctx context.Context, in *sysin.LogListInp) (list []*sysin ] }`) } - } return } diff --git a/server/internal/logic/sys/login_log.go b/server/internal/logic/sys/login_log.go index 70c304c..ffcb49f 100644 --- a/server/internal/logic/sys/login_log.go +++ b/server/internal/logic/sys/login_log.go @@ -83,7 +83,7 @@ func (s *sSysLoginLog) List(ctx context.Context, in *sysin.LoginLogListInp) (lis return } - //关联表select + // 关联表select fields, err := hgorm.GenJoinSelect(ctx, sysin.LoginLogListModel{}, &dao.SysLoginLog, []*hgorm.Join{ {Dao: &dao.SysLog, Alias: "sysLog"}, }) @@ -98,12 +98,6 @@ func (s *sSysLoginLog) List(ctx context.Context, in *sysin.LoginLogListInp) (lis } for _, v := range list { - //// 获取省市编码对应的地区名称 - //region, err := location.ParseRegion(ctx, v.SysLogProvinceId, v.SysLogCityId, 0) - //if err != nil { - // return list, totalCount, err - //} - //v.Region = region v.Os = useragent.GetOs(v.SysLogUserAgent) v.Browser = useragent.GetBrowser(v.SysLogUserAgent) } diff --git a/server/internal/logic/sys/serve_log.go b/server/internal/logic/sys/serve_log.go index c845262..27cb3bb 100644 --- a/server/internal/logic/sys/serve_log.go +++ b/server/internal/logic/sys/serve_log.go @@ -72,7 +72,7 @@ func (s *sSysServeLog) List(ctx context.Context, in *sysin.ServeLogListInp) (lis return } - //关联表select + // 关联表select fields, err := hgorm.GenJoinSelect(ctx, sysin.ServeLogListModel{}, &dao.SysServeLog, []*hgorm.Join{ {Dao: &dao.SysLog, Alias: "sysLog"}, }) diff --git a/server/internal/logic/tcpclient/auth.go b/server/internal/logic/tcpclient/auth.go index a240ef4..c6c58b5 100644 --- a/server/internal/logic/tcpclient/auth.go +++ b/server/internal/logic/tcpclient/auth.go @@ -96,7 +96,7 @@ func (s *sAuthClient) onLoginEvent() { ctx := gctx.New() // 获取授权信息 - s.client.Send(ctx, &servmsg.AuthSummaryReq{}) + _ = s.client.Send(ctx, &servmsg.AuthSummaryReq{}) // 测试例子,实际使用时可以注释掉 s.testExample(ctx) diff --git a/server/internal/logic/tcpclient/auth_handle.go b/server/internal/logic/tcpclient/auth_handle.go index 110ff64..a74b14b 100644 --- a/server/internal/logic/tcpclient/auth_handle.go +++ b/server/internal/logic/tcpclient/auth_handle.go @@ -36,7 +36,7 @@ func (s *sAuthClient) OnResponseExampleHello(ctx context.Context, req *servmsg.E func (s *sAuthClient) testExample(ctx context.Context) { // 发起tcp请求 // 异步执行,服务端返回消息后会转到`OnResponseExampleHello`中 - s.client.Send(ctx, &servmsg.ExampleHelloReq{ + _ = s.client.Send(ctx, &servmsg.ExampleHelloReq{ Name: "Tom", }) diff --git a/server/internal/logic/tcpclient/cron_interceptor.go b/server/internal/logic/tcpclient/cron_interceptor.go index 5637c8f..37cf289 100644 --- a/server/internal/logic/tcpclient/cron_interceptor.go +++ b/server/internal/logic/tcpclient/cron_interceptor.go @@ -12,7 +12,7 @@ import ( // DefaultInterceptor 默认拦截器 func (s *sCronClient) DefaultInterceptor(ctx context.Context, msg *tcp.Message) (err error) { - //conn := tcp.ConnFromCtx(ctx) - //g.Log().Debugf(ctx, "DefaultInterceptor msg:%+v, conn:%+v", msg, gjson.New(conn).String()) + // conn := tcp.ConnFromCtx(ctx) + // g.Log().Debugf(ctx, "DefaultInterceptor msg:%+v, conn:%+v", msg, gjson.New(conn).String()) return } diff --git a/server/internal/logic/tcpserver/auth_handle.go b/server/internal/logic/tcpserver/auth_handle.go index f150e90..45798bc 100644 --- a/server/internal/logic/tcpserver/auth_handle.go +++ b/server/internal/logic/tcpserver/auth_handle.go @@ -34,37 +34,37 @@ func (s *sTCPServer) OnAuthSummary(ctx context.Context, req *servmsg.AuthSummary if conn.Auth == nil { res.SetError(gerror.New("登录信息获取失败,请重新登录")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if err := dao.SysServeLicense.Ctx(ctx).Where("appid = ?", conn.Auth.AppId).Scan(&models); err != nil { res.SetError(err) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models == nil { res.SetError(gerror.New("授权信息不存在")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.Status != consts.StatusEnabled { res.SetError(gerror.New("授权已禁用,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.Group != conn.Auth.Group { res.SetError(gerror.New("你登录的授权分组未得到授权,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.EndAt.Before(gtime.Now()) { res.SetError(gerror.New("授权已过期,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } @@ -76,5 +76,5 @@ func (s *sTCPServer) OnAuthSummary(ctx context.Context, req *servmsg.AuthSummary // ... res.Data = data - conn.Send(ctx, res) + _ = conn.Send(ctx, res) } diff --git a/server/internal/logic/tcpserver/example_handle.go b/server/internal/logic/tcpserver/example_handle.go index 3f22574..6cf74af 100644 --- a/server/internal/logic/tcpserver/example_handle.go +++ b/server/internal/logic/tcpserver/example_handle.go @@ -27,14 +27,14 @@ func (s *sTCPServer) OnExampleHello(ctx context.Context, req *servmsg.ExampleHel if conn.Auth == nil { res.SetError(gerror.New("连接未认证,请确认已登录成功!")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } data.Desc = fmt.Sprintf("Hello %v, 你的APPID:%v,当前HotGo版本:%v,你成功请求了`servmsg.ExampleHelloReq`接口!", req.Name, conn.Auth.AppId, consts.VersionApp) data.Timestamp = gtime.Now() res.Data = data - conn.Send(ctx, res) + _ = conn.Send(ctx, res) } // OnExampleRPCHello 一个rpc请求例子 diff --git a/server/internal/logic/tcpserver/server_handle.go b/server/internal/logic/tcpserver/server_handle.go index bf9be35..1c817b6 100644 --- a/server/internal/logic/tcpserver/server_handle.go +++ b/server/internal/logic/tcpserver/server_handle.go @@ -39,7 +39,7 @@ func (s *sTCPServer) onServerLogin(ctx context.Context, req *tcp.ServerLoginReq) } if models == nil { res.SetError(gerror.New("授权信息不存在")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } @@ -47,39 +47,39 @@ func (s *sTCPServer) onServerLogin(ctx context.Context, req *tcp.ServerLoginReq) sign := encrypt.Md5ToString(fmt.Sprintf("%v%v%v", models.Appid, req.Timestamp, models.SecretKey)) if sign != req.Sign { res.SetError(gerror.New("签名错误,请检查!")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.Status != consts.StatusEnabled { res.SetError(gerror.New("授权已禁用,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.Group != req.Group { res.SetError(gerror.New("你登录的授权分组未得到授权,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } if models.EndAt.Before(gtime.Now()) { res.SetError(gerror.New("授权已过期,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } ip := gstr.StrTillEx(conn.RemoteAddr().String(), ":") if !convert.MatchIpStrategy(models.AllowedIps, ip) { res.SetError(gerror.New("IP(" + ip + ")未授权,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } var routes []string if err := models.Routes.Scan(&routes); err != nil { res.SetError(gerror.New("授权路由解析失败,请联系管理员")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } @@ -92,14 +92,14 @@ func (s *sTCPServer) onServerLogin(ctx context.Context, req *tcp.ServerLoginReq) client.Close() } res.SetError(gerror.New("授权登录端超出上限,请勿多地登录")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } for _, client := range clients { if client.Auth.Name == req.Name { res.SetError(gerror.Newf("应用名称[%v]已存在登录用户,当前连接已被拒绝。", req.Name)) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } } @@ -123,12 +123,12 @@ func (s *sTCPServer) onServerLogin(ctx context.Context, req *tcp.ServerLoginReq) } if _, err := dao.SysServeLicense.Ctx(ctx).Where(cols.Id, models.Id).Data(update).Update(); err != nil { res.SetError(err) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } g.Log().Debugf(ctx, "onServerLogin succeed. appid:%v, group:%v, name:%v", auth.AppId, auth.Group, auth.Name) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) } // onServerHeartbeat 处理客户端心跳 @@ -146,7 +146,7 @@ func (s *sTCPServer) onServerHeartbeat(ctx context.Context, req *tcp.ServerHeart client := s.serv.GetClient(conn.Conn) if client == nil { res.SetError(gerror.New("登录异常,请重新登录")) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } @@ -159,9 +159,9 @@ func (s *sTCPServer) onServerHeartbeat(ctx context.Context, req *tcp.ServerHeart } if _, err := dao.SysServeLicense.Ctx(ctx).Where(dao.SysServeLicense.Columns().Appid, client.Auth.AppId).Data(update).Update(); err != nil { res.SetError(err) - conn.Send(ctx, res) + _ = conn.Send(ctx, res) return } - conn.Send(ctx, res) + _ = conn.Send(ctx, res) } diff --git a/server/internal/logic/tcpserver/server_interceptor.go b/server/internal/logic/tcpserver/server_interceptor.go index 40f9cd6..8b84084 100644 --- a/server/internal/logic/tcpserver/server_interceptor.go +++ b/server/internal/logic/tcpserver/server_interceptor.go @@ -37,7 +37,7 @@ func (s *sTCPServer) isNoVerifyRouter(router string) bool { // DefaultInterceptor 默认拦截器 func (s *sTCPServer) DefaultInterceptor(ctx context.Context, msg *tcp.Message) (err error) { conn := tcp.ConnFromCtx(ctx) - //g.Log().Debugf(ctx, "DefaultInterceptor msg:%+v, conn:%+v", msg, gjson.New(conn).String()) + // g.Log().Debugf(ctx, "DefaultInterceptor msg:%+v, conn:%+v", msg, gjson.New(conn).String()) // 免登录 if s.isNoLoginRouter(msg.Router) { @@ -70,6 +70,6 @@ func (s *sTCPServer) DefaultInterceptor(ctx context.Context, msg *tcp.Message) ( // PreFilterInterceptor 预处理 func (s *sTCPServer) PreFilterInterceptor(ctx context.Context, msg *tcp.Message) (err error) { - //g.Log().Debug(ctx, "PreFilterInterceptor...") + // g.Log().Debug(ctx, "PreFilterInterceptor...") return } diff --git a/server/internal/model/gen_codes.go b/server/internal/model/gen_codes.go index 0143140..7e38c3e 100644 --- a/server/internal/model/gen_codes.go +++ b/server/internal/model/gen_codes.go @@ -14,7 +14,7 @@ type GenCodesColumn struct { Index string `json:"index" dc:"索引"` Extra string `json:"extra" dc:"额外选项"` // 自定义生成属性 - //Alias string `json:"alias" dc:"字段别名"` + // Alias string `json:"alias" dc:"字段别名"` GoName string `json:"goName" dc:"Go属性"` GoType string `json:"goType" dc:"Go类型"` TsName string `json:"tsName" dc:"Ts属性"` diff --git a/server/internal/model/input/adminin/menu.go b/server/internal/model/input/adminin/menu.go index d562ba8..d009060 100644 --- a/server/internal/model/input/adminin/menu.go +++ b/server/internal/model/input/adminin/menu.go @@ -85,7 +85,7 @@ type MenuListModel struct { type MenuRouteMeta struct { // 解释参考:https://naive-ui-admin-docs.vercel.app/guide/router.html#%E5%A4%9A%E7%BA%A7%E8%B7%AF%E7%94%B1 Title string `json:"title"` // 菜单名称 一般必填 - //Disabled bool `json:"disabled,omitempty"` // 禁用菜单 + // Disabled bool `json:"disabled,omitempty"` // 禁用菜单 Icon string `json:"icon,omitempty"` // 菜单图标 KeepAlive bool `json:"keepAlive,omitempty"` // 缓存该路由 Hidden bool `json:"hidden,omitempty"` // 隐藏菜单 diff --git a/server/internal/model/input/sysin/serve_license.go b/server/internal/model/input/sysin/serve_license.go index bba177a..17e51c0 100644 --- a/server/internal/model/input/sysin/serve_license.go +++ b/server/internal/model/input/sysin/serve_license.go @@ -25,7 +25,7 @@ type ServeLicenseUpdateFields struct { Appid string `json:"appid" dc:"应用ID"` SecretKey string `json:"secretKey" dc:"应用秘钥"` OnlineLimit int `json:"onlineLimit" dc:"在线数量限制,默认1"` - //Routes *gjson.Json `json:"routes" dc:"路由表,空使用默认分组路由"` + // Routes *gjson.Json `json:"routes" dc:"路由表,空使用默认分组路由"` AllowedIps string `json:"allowedIps" dc:"白名单,*代表所有,只有允许的IP才能连接到tcp服务"` EndAt *gtime.Time `json:"endAt" dc:"授权结束时间"` Remark string `json:"remark" dc:"备注"` @@ -39,7 +39,7 @@ type ServeLicenseInsertFields struct { Appid string `json:"appid" dc:"应用ID"` SecretKey string `json:"secretKey" dc:"应用秘钥"` OnlineLimit int `json:"onlineLimit" dc:"在线数量限制,默认1"` - //Routes *gjson.Json `json:"routes" dc:"路由表,空使用默认分组路由"` + // Routes *gjson.Json `json:"routes" dc:"路由表,空使用默认分组路由"` AllowedIps string `json:"allowedIps" dc:"白名单,*代表所有,只有允许的IP才能连接到tcp服务"` EndAt *gtime.Time `json:"endAt" dc:"授权结束时间"` Remark string `json:"remark" dc:"备注"` diff --git a/server/internal/websocket/client_manager.go b/server/internal/websocket/client_manager.go index d0b513a..4927bdd 100644 --- a/server/internal/websocket/client_manager.go +++ b/server/internal/websocket/client_manager.go @@ -105,9 +105,9 @@ func (manager *ClientManager) DelClients(client *Client) { } // GetClient 通过socket ID获取客户端的连接 -func (manager *ClientManager) GetClient(ID string) (client *Client) { +func (manager *ClientManager) GetClient(id string) (client *Client) { for c := range manager.Clients { - if c.ID == ID { + if c.ID == id { return c } } @@ -164,8 +164,8 @@ func (manager *ClientManager) EventRegister(client *Client) { UserId: client.User.Id, Client: client, }) - ////发送当前客户端标识 - //SendSuccess(client, "connected", g.Map{"id": client.ID, "userInfo": client.User}) + // 发送当前客户端标识 + // SendSuccess(client, "connected", g.Map{"id": client.ID, "userInfo": client.User}) } // EventLogin 用户登录事件 @@ -196,7 +196,6 @@ func (manager *ClientManager) clearTimeoutConnections() { clients := clientManager.GetClients() for client := range clients { if client.IsHeartbeatTimeout(currentTime) { - //fmt.Println("心跳时间超时 关闭连接", client.Addr, client.UserId, client.LoginTime, client.HeartbeatTime) _ = client.Socket.Close() } } @@ -210,14 +209,16 @@ func (manager *ClientManager) ping() { return } }() - ////定时任务,发送心跳包 - //gcron.Add(ctx, "0 */1 * * * *", func(ctx context.Context) { + + // 定时任务,发送心跳包 + // gcron.Add(ctx, "0 */1 * * * *", func(ctx context.Context) { // res := &WResponse{ // Event: "ping", - // Timestamp: gtime.Now().Unix(), - // } - // SendToAll(res) - //}) + // Timestamp: gtime.Now().Unix(), + // } + // SendToAll(res) + // }) + // 定时任务,清理超时连接 _, _ = gcron.Add(ctxManager, "*/30 * * * * *", func(ctx context.Context) { manager.clearTimeoutConnections() diff --git a/server/resource/generate/default/addon/router/websocket.go.template b/server/resource/generate/default/addon/router/websocket.go.template index bf4abc5..11105b8 100644 --- a/server/resource/generate/default/addon/router/websocket.go.template +++ b/server/resource/generate/default/addon/router/websocket.go.template @@ -36,5 +36,4 @@ func WebSocket(ctx context.Context, group *ghttp.RouterGroup) { ws.RegisterMsg(ws.EventHandlers{ // ... }) - } diff --git a/server/utility/file/file.go b/server/utility/file/file.go index 7fdb48c..bc17979 100644 --- a/server/utility/file/file.go +++ b/server/utility/file/file.go @@ -12,37 +12,38 @@ import ( "path/filepath" ) -type fileInfo struct { //文件信息 +// 文件信息 +type fileInfo struct { name string size int64 } // WalkDir 递归获取目录下文件的名称和大小 func WalkDir(dirname string) (error, []fileInfo) { - op, err := filepath.Abs(dirname) //获取目录的绝对路径 + op, err := filepath.Abs(dirname) // 获取目录的绝对路径 if nil != err { return err, nil } - files, err := os.ReadDir(op) //获取目录下所有文件的信息,包括文件和文件夹 + files, err := os.ReadDir(op) // 获取目录下所有文件的信息,包括文件和文件夹 if nil != err { return err, nil } - var fileInfos []fileInfo //返回值,存储读取的文件信息 + var fileInfos []fileInfo // 返回值,存储读取的文件信息 for _, f := range files { if f.IsDir() { // 如果是目录,那么就递归调用 - err, fs := WalkDir(op + `/` + f.Name()) //路径分隔符,linux 和 windows 不同 + err, fs := WalkDir(op + `/` + f.Name()) // 路径分隔符,linux 和 windows 不同 if nil != err { return err, nil } - fileInfos = append(fileInfos, fs...) //将 slice 添加到 slice + fileInfos = append(fileInfos, fs...) // 将 slice 添加到 slice } else { info, err := f.Info() if nil != err { return err, nil } fi := fileInfo{op + `/` + f.Name(), info.Size()} - fileInfos = append(fileInfos, fi) //slice 中添加成员 + fileInfos = append(fileInfos, fi) // slice 中添加成员 } } return nil, fileInfos diff --git a/server/utility/tree/tree.go b/server/utility/tree/tree.go index 9f26813..78d5938 100644 --- a/server/utility/tree/tree.go +++ b/server/utility/tree/tree.go @@ -32,8 +32,8 @@ func GenLabel(basic string, appendId int64) string { } // GetIdLabel 获取指定Id的树标签 -func GetIdLabel(Id int64) string { - return fmt.Sprintf("%v%v%v", treeBeginCut, Id, treeEndCut) +func GetIdLabel(id int64) string { + return fmt.Sprintf("%v%v%v", treeBeginCut, id, treeEndCut) } // GetIds 获取上级ID集合 diff --git a/server/utility/validate/filter_test.go b/server/utility/validate/filter_test.go new file mode 100644 index 0000000..6adee91 --- /dev/null +++ b/server/utility/validate/filter_test.go @@ -0,0 +1,68 @@ +package validate_test + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/test/gtest" + "hotgo/utility/validate" + "testing" +) + +// MockFilter 是 Filter 接口的模拟实现。 +type MockFilter struct { + Foo string + Bar int +} + +func (f *MockFilter) Filter(ctx context.Context) error { + // 模拟过滤逻辑 + + // 过滤出错的例子 + if f.Foo == "" { + return gerror.New("Foo 字段是必需的") + } + + // 过滤操作的例子 + f.Bar += 10 + + return nil +} + +func TestPreFilter(t *testing.T) { + ctx := context.Background() + input := &MockFilter{ + Foo: "test", + Bar: 5, + } + + err := validate.PreFilter(ctx, input) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(err) + }) + + t.Logf("input:%+v", input) + + // 验证过滤结果 + expectedBar := 15 + gtest.C(t, func(t *gtest.T) { + t.Assert(input.Bar, expectedBar) + }) +} + +func TestPreFilter_Error(t *testing.T) { + ctx := context.Background() + input := &MockFilter{ + Foo: "", + Bar: 5, + } + + err := validate.PreFilter(ctx, input) + gtest.C(t, func(t *gtest.T) { + t.AssertNE(err, nil) + }) + + expectedError := "Foo 字段是必需的" + gtest.C(t, func(t *gtest.T) { + t.Assert(err.Error(), expectedError) + }) +} diff --git a/server/utility/validate/validate.go b/server/utility/validate/validate.go index c05335b..f45313e 100644 --- a/server/utility/validate/validate.go +++ b/server/utility/validate/validate.go @@ -42,15 +42,15 @@ func IsIp(ip string) bool { } // IsPublicIp 是否是公网IP -func IsPublicIp(Ip string) bool { - ip := net.ParseIP(Ip) +func IsPublicIp(ip string) bool { + i := net.ParseIP(ip) - if ip.IsLoopback() || ip.IsPrivate() || ip.IsMulticast() || ip.IsUnspecified() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { + if i.IsLoopback() || i.IsPrivate() || i.IsMulticast() || i.IsUnspecified() || i.IsLinkLocalUnicast() || i.IsLinkLocalMulticast() { return false } - if ip4 := ip.To4(); ip4 != nil { - return !ip.Equal(net.IPv4bcast) + if ip4 := i.To4(); ip4 != nil { + return !i.Equal(net.IPv4bcast) } return true } @@ -89,7 +89,7 @@ func IsMobile(mobile string) bool { // IsEmail 是否为邮箱地址 func IsEmail(email string) bool { - //pattern := `\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*` //匹配电子邮箱 + // pattern := `\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*` //匹配电子邮箱 pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z].){1,4}[a-z]{2,4}$` reg := regexp.MustCompile(pattern) return reg.MatchString(email)