From 2068d05c93920c05c0b8b4b1a5aac079248a78f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=B8=85?= <133814250@qq.com> Date: Wed, 8 Feb 2023 20:29:34 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=A2=84=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 21 + README.md | 34 +- server/Makefile | 1 + server/api/api/member/member.go | 4 +- server/api/backend/attachment/attachment.go | 2 +- server/api/backend/blacklist/blacklist.go | 2 +- server/api/backend/common/ems.go | 7 + server/api/backend/common/sms.go | 7 + server/api/backend/cron/cron.go | 2 +- server/api/backend/cron/cron_group.go | 2 +- server/api/backend/curddemo/curddemo.go | 4 +- server/api/backend/dept/dept.go | 4 +- server/api/backend/emslog/emslog.go | 55 + server/api/backend/gencodes/gencodes.go | 4 +- server/api/backend/member/member.go | 186 +- server/api/backend/menu/menu.go | 2 +- server/api/backend/notice/notice.go | 87 +- server/api/backend/post/post.go | 2 +- server/api/backend/provinces/provinces.go | 16 + server/api/backend/role/role.go | 2 +- server/go.mod | 21 +- server/go.sum | 94 +- server/internal/cmd/cmd.go | 8 +- server/internal/cmd/http.go | 6 +- server/internal/consts/debris.go | 3 +- server/internal/consts/ems.go | 39 + server/internal/consts/gencodes.go | 7 + server/internal/consts/notice.go | 8 + server/internal/consts/sms.go | 2 +- server/internal/consts/version.go | 2 +- .../internal/controller/backend/admin/dept.go | 94 +- .../controller/backend/admin/member.go | 293 +- .../internal/controller/backend/admin/menu.go | 64 +- .../controller/backend/admin/monitor.go | 14 +- .../controller/backend/admin/notice.go | 156 +- .../internal/controller/backend/admin/post.go | 86 +- .../internal/controller/backend/admin/role.go | 74 +- .../internal/controller/backend/admin/test.go | 63 +- .../controller/backend/common/console.go | 1 - .../internal/controller/backend/common/ems.go | 55 +- .../controller/backend/common/site.go | 22 +- .../internal/controller/backend/common/sms.go | 50 +- .../controller/backend/common/upload.go | 20 +- .../controller/backend/sys/attachment.go | 64 +- .../controller/backend/sys/blacklist.go | 64 +- .../internal/controller/backend/sys/config.go | 35 +- .../internal/controller/backend/sys/cron.go | 66 +- .../controller/backend/sys/cron_group.go | 68 +- .../controller/backend/sys/curd_demo.go | 5 +- .../controller/backend/sys/dict_data.go | 58 +- .../controller/backend/sys/dict_type.go | 37 +- .../controller/backend/sys/ems_log.go | 87 + .../controller/backend/sys/gen_codes.go | 137 +- server/internal/controller/backend/sys/log.go | 42 +- .../controller/backend/sys/login_log.go | 36 +- .../controller/backend/sys/provinces.go | 125 +- .../controller/backend/sys/serve_log.go | 36 +- .../controller/backend/sys/sms_log.go | 66 +- server/internal/controller/websocket/send.go | 10 +- server/internal/crons/init.go | 49 +- server/internal/dao/admin_member_post.go | 2 +- server/internal/dao/admin_notice_read.go | 27 + server/internal/dao/internal/admin_member.go | 16 +- server/internal/dao/internal/admin_notice.go | 10 +- .../dao/internal/admin_notice_read.go | 83 + server/internal/dao/internal/sys_ems_log.go | 91 + server/internal/dao/internal/sys_gen_codes.go | 2 + .../dao/internal/sys_gen_curd_demo.go | 2 + server/internal/dao/internal/sys_login_log.go | 2 + server/internal/dao/internal/test.go | 2 + server/internal/dao/sys_ems_log.go | 43 + server/internal/dao/sys_provinces.go | 39 - server/internal/global/init.go | 87 +- server/internal/library/captcha/captcha.go | 2 +- server/internal/library/contexts/context.go | 10 + server/internal/library/debris/debris.go | 4 - server/internal/library/ems/ems.go | 18 - server/internal/library/hggen/hggen.go | 33 +- server/internal/library/hggen/init.go | 5 +- .../library/hggen/internal/cmd/cmd_gen.go | 6 +- .../hggen/internal/cmd/cmd_gen_pbentity.go | 14 +- .../hggen/internal/cmd/gendao/gendao.go | 19 +- .../internal/cmd/genservice/genservice.go | 16 +- .../library/hggen/views/column_default.go | 5 + .../library/hggen/views/column_map.go | 3 + server/internal/library/hggen/views/curd.go | 47 +- .../hggen/views/curd_generate_logic.go | 38 +- .../hggen/views/curd_generate_web_edit.go | 53 +- server/internal/library/hggen/views/utils.go | 43 +- server/internal/library/hgorm/dao.go | 18 +- .../{handler.go => handler/filter_auth.go} | 102 +- .../library/hgorm/handler/force_cache.go | 8 + .../internal/library/hgorm/handler/handler.go | 39 + server/internal/library/hgorm/hook.go | 9 - server/internal/library/hgorm/hook/hook.go | 3 + server/internal/library/hgorm/hook/member.go | 58 + .../internal/library/hgorm/hook/provinces.go | 59 + server/internal/library/jwt/jwt.go | 3 - server/internal/library/location/geocode.go | 4 +- server/internal/library/location/location.go | 4 +- server/internal/library/location/region.go | 104 + server/internal/library/queue/init.go | 61 +- server/internal/library/queue/kafkamq.go | 109 +- server/internal/library/queue/push.go | 4 +- server/internal/library/queue/redismq.go | 31 +- server/internal/library/queue/rocketmq.go | 24 +- server/internal/logic/admin/member.go | 395 +- server/internal/logic/admin/member_post.go | 4 +- server/internal/logic/admin/menu.go | 17 +- server/internal/logic/admin/notice.go | 375 +- server/internal/logic/admin/role.go | 11 +- server/internal/logic/admin/test.go | 111 +- server/internal/logic/common/upload.go | 2 - .../hook/{global_log.go => access_log.go} | 6 +- server/internal/logic/hook/last_active.go | 80 + .../internal/logic/middleware/admin_auth.go | 2 +- server/internal/logic/middleware/init.go | 29 +- .../logic/middleware/limit_develop.go | 36 + server/internal/logic/sys/config.go | 13 + server/internal/logic/sys/cron.go | 107 +- server/internal/logic/sys/curd_demo.go | 109 +- server/internal/logic/sys/ems_log.go | 443 + server/internal/logic/sys/log.go | 5 +- server/internal/logic/sys/login_log.go | 24 +- server/internal/logic/sys/provinces.go | 34 +- server/internal/logic/sys/serve_log.go | 3 +- server/internal/logic/sys/sms_log.go | 2 +- server/internal/model/config.go | 38 +- server/internal/model/context.go | 29 +- server/internal/model/do/admin_member.go | 9 +- server/internal/model/do/admin_notice.go | 8 +- server/internal/model/do/admin_notice_read.go | 21 + server/internal/model/do/sys_ems_log.go | 25 + server/internal/model/do/sys_gen_codes.go | 1 + server/internal/model/do/sys_gen_curd_demo.go | 1 + server/internal/model/do/sys_login_log.go | 1 + server/internal/model/do/test.go | 1 + server/internal/model/entity/admin_member.go | 9 +- server/internal/model/entity/admin_notice.go | 8 +- .../model/entity/admin_notice_read.go | 19 + server/internal/model/entity/sys_ems_log.go | 23 + server/internal/model/entity/sys_gen_codes.go | 1 + .../model/entity/sys_gen_curd_demo.go | 1 + server/internal/model/entity/sys_login_log.go | 1 + server/internal/model/entity/test.go | 1 + server/internal/model/input/adminin/member.go | 157 +- server/internal/model/input/adminin/menu.go | 2 +- server/internal/model/input/adminin/notice.go | 78 +- server/internal/model/input/adminin/role.go | 2 + server/internal/model/input/form/base.go | 11 + .../internal/model/input/sysin/curd_demo.go | 36 +- server/internal/model/input/sysin/ems_log.go | 70 + .../internal/model/input/sysin/gen_codes.go | 30 +- server/internal/model/input/sysin/log.go | 3 +- .../internal/model/input/sysin/login_log.go | 8 +- .../internal/model/input/sysin/provinces.go | 24 + server/internal/router/admin.go | 4 +- server/internal/router/genrouter/curd_demo.go | 4 +- server/internal/service/admin.go | 54 +- server/internal/service/hook.go | 3 +- server/internal/service/middleware.go | 1 + server/internal/service/sys.go | 360 +- server/manifest/config/config.example.yaml | 6 +- server/resource/data/hotgo.sql | 690 +- server/resource/template/email/code.html | 217 + server/resource/template/email/resetPwd.html | 301 + server/resource/template/email/text.html | 12 + .../default/curd/controller.go.template | 71 +- .../generate/default/curd/input.go.template | 31 +- .../generate/default/curd/logic.go.template | 87 +- .../default/curd/web.edit.vue.template | 44 +- server/utility/simple/simple.go | 25 + server/utility/url/url.go | 2 +- server/utility/validate/validate.go | 2 +- web/.env | 8 +- web/.env.development | 12 +- web/.env.production | 16 +- web/.eslintrc.js | 7 + web/package-lock.json | 2599 ++-- web/package.json | 7 +- web/src/api/apply/notice.ts | 63 + web/src/api/apply/provinces.ts | 22 + web/src/api/base/index.ts | 9 + web/src/api/curdDemo/index.ts | 8 +- web/src/api/org/user.ts | 8 + web/src/api/system/user.ts | 54 + .../components/CitySelector/citySelector.vue | 105 + web/src/components/CitySelector/props.ts | 22 + web/src/components/Editor/editor.vue | 138 +- web/src/components/Form/src/BasicForm.vue | 8 +- .../Table/src/components/TableAction.vue | 36 +- .../src/components/settings/ColumnSetting.vue | 1 - .../Table/src/hooks/useDataSource.ts | 6 +- web/src/components/Upload/src/BasicUpload.vue | 154 +- web/src/components/Upload/src/props.ts | 2 +- web/src/components/Upload/uploadFile.vue | 52 +- web/src/components/Upload/uploadImage.vue | 24 +- web/src/enums/apiEnum.ts | 4 +- web/src/enums/optionsiEnum.ts | 2 +- web/src/enums/systemMessageEnum.ts | 238 + web/src/hooks/common/index.ts | 7 + web/src/hooks/common/useBoolean.ts | 26 + web/src/hooks/common/useContext.ts | 20 + web/src/hooks/common/useCountDown.ts | 54 + web/src/hooks/common/useLoading.ts | 11 + web/src/hooks/common/useLoadingEmpty.ts | 14 + web/src/hooks/common/useSendCode.ts | 43 + web/src/hooks/web/usePermission.ts | 8 +- .../layout/components/Header/MessageList.vue | 74 + .../components/Header/PopoverMessage.vue | 65 - .../components/Header/SystemMessage.vue | 129 + web/src/layout/components/Header/index.vue | 165 +- web/src/settings/componentSetting.ts | 3 +- web/src/store/modules/asyncRoute.ts | 16 +- web/src/store/modules/notification.ts | 98 +- web/src/store/modules/user.ts | 68 +- web/src/utils/hotgo.ts | 30 +- web/src/utils/websocket.ts | 9 +- web/src/views/about/index.vue | 2 +- web/src/views/apply/attachment/columns.ts | 37 +- web/src/views/apply/attachment/index.vue | 1 + web/src/views/apply/notice/columns.ts | 107 +- web/src/views/apply/notice/index.vue | 337 +- web/src/views/curdDemo/edit.vue | 154 +- web/src/views/curdDemo/index.vue | 12 +- web/src/views/curdDemo/model.ts | 22 +- web/src/views/curdDemo/view.vue | 5 + .../code/components/EditMasterCell.vue | 42 +- .../views/develop/code/components/model.ts | 1 + web/src/views/develop/code/deploy.vue | 21 +- web/src/views/develop/code/index.vue | 25 + web/src/views/home/account/BasicSetting.vue | 206 + web/src/views/home/account/CashSetting.vue | 121 + web/src/views/home/account/SafetySetting.vue | 317 + .../{setting => home}/account/account.vue | 13 +- web/src/views/home/message/list.vue | 153 + web/src/views/home/message/message.vue | 42 + web/src/views/log/cron-log/columns.ts | 80 - web/src/views/log/cron-log/index.vue | 290 - web/src/views/log/cron-log/view.vue | 136 - web/src/views/log/ems-log/columns.ts | 6 +- web/src/views/log/log/columns.ts | 6 +- web/src/views/log/log/index.vue | 62 +- web/src/views/log/log/view.vue | 31 +- web/src/views/log/login-log/index.vue | 6 +- web/src/views/log/login-log/model.ts | 4 +- web/src/views/log/sms-log/index.vue | 67 +- web/src/views/login/index.vue | 2 +- web/src/views/monitor/online/index.vue | 1 + web/src/views/monitor/serve-log/index.vue | 20 +- web/src/views/org/user/columns.ts | 11 +- web/src/views/org/user/user.vue | 14 +- .../views/permission/menu/CreateDrawer.vue | 10 +- web/src/views/permission/menu/menu.vue | 66 +- web/src/views/permission/role/role.vue | 10 +- .../views/setting/account/BasicSetting.vue | 71 - .../views/setting/account/SafetySetting.vue | 52 - web/src/views/system/account/BasicSetting.vue | 71 - .../views/system/account/SafetySetting.vue | 52 - web/src/views/system/account/account.vue | 76 - web/src/views/system/config/BasicSetting.vue | 5 + web/src/views/system/config/EmailSetting.vue | 66 +- web/src/views/system/config/SmsSetting.vue | 4 +- web/src/views/system/config/UploadSetting.vue | 2 +- web/src/views/system/config/system.vue | 17 +- web/src/views/test/edit.vue | 5 + web/src/views/test/index.vue | 11 +- web/src/views/test/model.ts | 2 + web/yarn.lock | 12565 ++++++++-------- 269 files changed, 16122 insertions(+), 12075 deletions(-) create mode 100644 LICENSE create mode 100644 server/api/backend/emslog/emslog.go create mode 100644 server/internal/consts/ems.go create mode 100644 server/internal/consts/notice.go create mode 100644 server/internal/controller/backend/sys/ems_log.go create mode 100644 server/internal/dao/admin_notice_read.go create mode 100644 server/internal/dao/internal/admin_notice_read.go create mode 100644 server/internal/dao/internal/sys_ems_log.go create mode 100644 server/internal/dao/sys_ems_log.go rename server/internal/library/hgorm/{handler.go => handler/filter_auth.go} (53%) create mode 100644 server/internal/library/hgorm/handler/force_cache.go create mode 100644 server/internal/library/hgorm/handler/handler.go delete mode 100644 server/internal/library/hgorm/hook.go create mode 100644 server/internal/library/hgorm/hook/hook.go create mode 100644 server/internal/library/hgorm/hook/member.go create mode 100644 server/internal/library/hgorm/hook/provinces.go create mode 100644 server/internal/library/location/region.go rename server/internal/logic/hook/{global_log.go => access_log.go} (85%) create mode 100644 server/internal/logic/hook/last_active.go create mode 100644 server/internal/logic/middleware/limit_develop.go create mode 100644 server/internal/logic/sys/ems_log.go create mode 100644 server/internal/model/do/admin_notice_read.go create mode 100644 server/internal/model/do/sys_ems_log.go create mode 100644 server/internal/model/entity/admin_notice_read.go create mode 100644 server/internal/model/entity/sys_ems_log.go create mode 100644 server/internal/model/input/sysin/ems_log.go create mode 100644 server/resource/template/email/code.html create mode 100644 server/resource/template/email/resetPwd.html create mode 100644 server/resource/template/email/text.html create mode 100644 web/src/components/CitySelector/citySelector.vue create mode 100644 web/src/components/CitySelector/props.ts create mode 100644 web/src/enums/systemMessageEnum.ts create mode 100644 web/src/hooks/common/index.ts create mode 100644 web/src/hooks/common/useBoolean.ts create mode 100644 web/src/hooks/common/useContext.ts create mode 100644 web/src/hooks/common/useCountDown.ts create mode 100644 web/src/hooks/common/useLoading.ts create mode 100644 web/src/hooks/common/useLoadingEmpty.ts create mode 100644 web/src/hooks/common/useSendCode.ts create mode 100644 web/src/layout/components/Header/MessageList.vue delete mode 100644 web/src/layout/components/Header/PopoverMessage.vue create mode 100644 web/src/layout/components/Header/SystemMessage.vue create mode 100644 web/src/views/home/account/BasicSetting.vue create mode 100644 web/src/views/home/account/CashSetting.vue create mode 100644 web/src/views/home/account/SafetySetting.vue rename web/src/views/{setting => home}/account/account.vue (82%) create mode 100644 web/src/views/home/message/list.vue create mode 100644 web/src/views/home/message/message.vue delete mode 100644 web/src/views/log/cron-log/columns.ts delete mode 100644 web/src/views/log/cron-log/index.vue delete mode 100644 web/src/views/log/cron-log/view.vue delete mode 100644 web/src/views/setting/account/BasicSetting.vue delete mode 100644 web/src/views/setting/account/SafetySetting.vue delete mode 100644 web/src/views/system/account/BasicSetting.vue delete mode 100644 web/src/views/system/account/SafetySetting.vue delete mode 100644 web/src/views/system/account/account.vue diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..30373a4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present HotGo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 2221d48..f94f4d9 100644 --- a/README.md +++ b/README.md @@ -91,30 +91,6 @@ git clone https://github.com/bufanyun/hotgo.git && cd hotgo - 项目数据库文件 `resource/data/db.sql` 创建数据库并导入 - 修改配置 `manifest/config/config.yaml.bak` 复制改为`manifest/config/config.yaml` -其中hotgo配置 -```yaml -# hotgo配置 -hotgo: - debug: true # debug开关,开启后:接口出现错误时会输出堆栈信息,默认为true - ipMethod: "whois" # IP归属地解析方法,可选:cz88|whois,默认为whois - wsAddr: "ws://127.0.0.1:8000/socket" # 客户端websocket连接地址,如果项目在公网,请填写公网IP:运行端口 - isDemo: false # 是否為演示系統 false | true - ssl: # https - switch: false # 是否开启https访问,需要配置sslCrtPath、sslKeyPath证书夹 - crtPath: "resource/ssl/server.crt" - keyPath: "resource/ssl/server.key" - log: # 全局请求日志 - switch: true # 日志开关,默认为true - queue: true # 是否启用队列,启用时需要配置队列信息,默认为true - module: [ "admin", "api", "default" ] # 需要记录的模块 - skipCode: [ ] # 不记录的状态码,如: ["0", "-1"] - admin: - superIds: [ 1,2,3 ] # 后台超管账号ID,通过ID验证超管 - superRoleKey: "super" # 超管角色唯一标识符,通过角色验证超管 - defaultPage: 10 # 列表分页默认加载数量 - defaultPageSize: 1 # 列表分页默认加载页码 - maxSortIncrement: 10 # 最大排序值增量 -``` 后台前端: - 配置服务端地址,包含在以下文件中: @@ -212,7 +188,7 @@ web端: > -> 感谢你使用HotGo,公司团队精力时间有限,因此我们不再提供免费的技术服务! +> 感谢你使用HotGo,公司团队精力时间有限,因此我们不再提供免费的技术服务! > > 同时您也可以联系我们,雇佣我们团队为您干活,谢谢合作! @@ -225,7 +201,7 @@ web端: * 本项目包含的第三方源码和二进制文件之版权信息另行标注。 -* 版权所有Copyright © 2022-2024 by Ms (https://github.com/bufanyun/hotgo) +* 版权所有Copyright © 2020-2024 by Ms (https://github.com/bufanyun/hotgo) * All rights reserved。 @@ -245,9 +221,9 @@ web端: ## [感谢JetBrains提供的免费GoLand](https://jb.gg/OpenSource) [![avatar](https://camo.githubusercontent.com/323657c6e81419b8e151e9da4c71f409e3fcc65d630535170c59fe4807dbc905/68747470733a2f2f676f6672616d652e6f72672f646f776e6c6f61642f7468756d626e61696c732f313131343131392f6a6574627261696e732e706e67)](https://jb.gg/OpenSource) - - - + +## License +[MIT © HotGo-2021](./LICENSE) diff --git a/server/Makefile b/server/Makefile index baf2f40..e9534d9 100644 --- a/server/Makefile +++ b/server/Makefile @@ -21,6 +21,7 @@ web: killmain: @kill -9 $(ps -ef|grep main|grep -v grep|awk '{print $2}') + # Install/Update to the latest CLI tool. .PHONY: cli cli: diff --git a/server/api/api/member/member.go b/server/api/api/member/member.go index a306781..ea66c39 100644 --- a/server/api/api/member/member.go +++ b/server/api/api/member/member.go @@ -8,9 +8,9 @@ package member import "github.com/gogf/gf/v2/frame/g" -// GetIdByCodeReq 通过邀请码获取会员ID +// GetIdByCodeReq 通过邀请码获取用户ID type GetIdByCodeReq struct { - g.Meta `path:"/member/getIdByCode" method:"post" tags:"会员" summary:"通过邀请码获取会员ID"` + g.Meta `path:"/member/getIdByCode" method:"post" tags:"用户" summary:"通过邀请码获取用户ID"` Code string `json:"code" dc:"邀请码"` } type GetIdByCodeRes struct{} diff --git a/server/api/backend/attachment/attachment.go b/server/api/backend/attachment/attachment.go index 3bbdc17..678dca8 100644 --- a/server/api/backend/attachment/attachment.go +++ b/server/api/backend/attachment/attachment.go @@ -54,7 +54,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { Id int64 `json:"id" dc:"附件ID"` - g.Meta `path:"/attachment/max_sort" method:"get" tags:"附件" summary:"附件最大排序"` + g.Meta `path:"/attachment/maxSort" method:"get" tags:"附件" summary:"附件最大排序"` } type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/blacklist/blacklist.go b/server/api/backend/blacklist/blacklist.go index eb76a7f..28f1278 100644 --- a/server/api/backend/blacklist/blacklist.go +++ b/server/api/backend/blacklist/blacklist.go @@ -54,7 +54,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { Id int64 `json:"id" dc:"黑名单ID"` - g.Meta `path:"/blacklist/max_sort" method:"get" tags:"黑名单" summary:"黑名单最大排序"` + g.Meta `path:"/blacklist/maxSort" method:"get" tags:"黑名单" summary:"黑名单最大排序"` } type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/common/ems.go b/server/api/backend/common/ems.go index 73da708..13fd5c2 100644 --- a/server/api/backend/common/ems.go +++ b/server/api/backend/common/ems.go @@ -17,3 +17,10 @@ type SendTestEmailReq struct { } type SendTestEmailRes struct { } + +// SendBindEmsReq 发送换绑邮件 +type SendBindEmsReq struct { + g.Meta `path:"/ems/sendBind" tags:"邮件" method:"post" summary:"发送换绑邮件"` +} +type SendBindEmsRes struct { +} diff --git a/server/api/backend/common/sms.go b/server/api/backend/common/sms.go index 9f6f9ba..c527c12 100644 --- a/server/api/backend/common/sms.go +++ b/server/api/backend/common/sms.go @@ -17,3 +17,10 @@ type SendTestSmsReq struct { } type SendTestSmsRes struct { } + +// SendBindSmsReq 发送换绑短信 +type SendBindSmsReq struct { + g.Meta `path:"/sms/sendBind" tags:"短信" method:"post" summary:"发送换绑短信"` +} +type SendBindSmsRes struct { +} diff --git a/server/api/backend/cron/cron.go b/server/api/backend/cron/cron.go index 1062e7e..c6c9d4d 100644 --- a/server/api/backend/cron/cron.go +++ b/server/api/backend/cron/cron.go @@ -54,7 +54,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { Id int64 `json:"id" dc:"定时任务ID"` - g.Meta `path:"/cron/max_sort" method:"get" tags:"定时任务" summary:"定时任务最大排序"` + g.Meta `path:"/cron/maxSort" method:"get" tags:"定时任务" summary:"定时任务最大排序"` } type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/cron/cron_group.go b/server/api/backend/cron/cron_group.go index 45d54fe..dedf18c 100644 --- a/server/api/backend/cron/cron_group.go +++ b/server/api/backend/cron/cron_group.go @@ -54,7 +54,7 @@ type GroupDeleteRes struct{} // GroupMaxSortReq 最大排序 type GroupMaxSortReq struct { Id int64 `json:"id" dc:"定时任务分组ID"` - g.Meta `path:"/cronGroup/max_sort" method:"get" tags:"定时任务分组" summary:"定时任务分组最大排序"` + g.Meta `path:"/cronGroup/maxSort" method:"get" tags:"定时任务分组" summary:"定时任务分组最大排序"` } type GroupMaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/curddemo/curddemo.go b/server/api/backend/curddemo/curddemo.go index d73f24e..3017576 100644 --- a/server/api/backend/curddemo/curddemo.go +++ b/server/api/backend/curddemo/curddemo.go @@ -3,8 +3,8 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.1.0 -// @AutoGenerate Date 2023-01-18 15:19:42 +// @AutoGenerate Version 2.1.2 +// @AutoGenerate Date 2023-02-08 17:47:32 // package curddemo diff --git a/server/api/backend/dept/dept.go b/server/api/backend/dept/dept.go index f16a731..f8300ff 100644 --- a/server/api/backend/dept/dept.go +++ b/server/api/backend/dept/dept.go @@ -37,7 +37,7 @@ type ListReq struct { g.Meta `path:"/dept/list" method:"get" tags:"部门" summary:"获取部门列表"` } -type ListRes []*g.Map +type ListRes adminin.DeptListModel // ViewReq 获取指定信息 type ViewReq struct { @@ -65,7 +65,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { Id int64 `json:"id" dc:"部门ID"` - g.Meta `path:"/dept/max_sort" method:"get" tags:"部门" summary:"部门最大排序"` + g.Meta `path:"/dept/maxSort" method:"get" tags:"部门" summary:"部门最大排序"` } type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/emslog/emslog.go b/server/api/backend/emslog/emslog.go new file mode 100644 index 0000000..15050c6 --- /dev/null +++ b/server/api/backend/emslog/emslog.go @@ -0,0 +1,55 @@ +package emslog + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" +) + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/emsLog/list" method:"get" tags:"邮件记录" summary:"获取邮件记录列表"` + sysin.EmsLogListInp +} + +type ListRes struct { + List []*sysin.EmsLogListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/emsLog/view" method:"get" tags:"邮件记录" summary:"获取指定信息"` + sysin.EmsLogViewInp +} +type ViewRes struct { + *sysin.EmsLogViewModel +} + +// EditReq 修改/新增数据 +type EditReq struct { + g.Meta `path:"/emsLog/edit" method:"post" tags:"邮件记录" summary:"修改/新增邮件记录"` + sysin.EmsLogEditInp +} +type EditRes struct{} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/emsLog/delete" method:"post" tags:"邮件记录" summary:"删除邮件记录"` + sysin.EmsLogDeleteInp +} +type DeleteRes struct{} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/emsLog/status" method:"post" tags:"邮件记录" summary:"更新邮件记录状态"` + sysin.EmsLogStatusInp +} +type StatusRes struct{} + +// SendTestReq 更新状态 +type SendTestReq struct { + g.Meta `path:"/emsLog/sendTest" method:"post" tags:"邮件记录" summary:"发送测试邮件"` + sysin.SendEmsInp +} +type SendTestRes struct{} diff --git a/server/api/backend/gencodes/gencodes.go b/server/api/backend/gencodes/gencodes.go index 03872cd..c3e71ab 100644 --- a/server/api/backend/gencodes/gencodes.go +++ b/server/api/backend/gencodes/gencodes.go @@ -15,7 +15,7 @@ import ( // ListReq 查询列表 type ListReq struct { - g.Meta `path:"/genCodes/list" method:"get" tags:"生成代码" summary:"获取生成代码列表"` + g.Meta `path:"/genCodes/list" method:"get" tags:"生成代码" summary:"获取生成代码列表"` sysin.GenCodesListInp } @@ -52,7 +52,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { Id int64 `json:"id" dc:"生成代码ID"` - g.Meta `path:"/genCodes/max_sort" method:"get" tags:"生成代码" summary:"生成代码最大排序"` + g.Meta `path:"/genCodes/maxSort" method:"get" tags:"生成代码" summary:"生成代码最大排序"` } type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` diff --git a/server/api/backend/member/member.go b/server/api/backend/member/member.go index 800677e..34bcd67 100644 --- a/server/api/backend/member/member.go +++ b/server/api/backend/member/member.go @@ -8,94 +8,83 @@ package member import ( "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gtime" - "hotgo/internal/model/entity" "hotgo/internal/model/input/adminin" "hotgo/internal/model/input/form" ) -// UpdateProfileReq 更新会员资料 +// UpdateCashReq 更新提现信息 +type UpdateCashReq struct { + g.Meta `path:"/member/updateCash" method:"post" tags:"用户" summary:"更新提现信息"` + adminin.MemberUpdateCashInp +} +type UpdateCashRes struct{} + +// UpdateEmailReq 换绑邮箱 +type UpdateEmailReq struct { + g.Meta `path:"/member/updateEmail" method:"post" tags:"用户" summary:"换绑邮箱"` + adminin.MemberUpdateEmailInp +} +type UpdateEmailRes struct{} + +// UpdateMobileReq 换绑手机号 +type UpdateMobileReq struct { + g.Meta `path:"/member/updateMobile" method:"post" tags:"用户" summary:"换绑手机号"` + adminin.MemberUpdateMobileInp +} +type UpdateMobileRes struct{} + +// UpdateProfileReq 更新用户资料 type UpdateProfileReq struct { - g.Meta `path:"/member/updateProfile" method:"post" tags:"会员" summary:"更新会员资料"` - Mobile int `json:"mobile" dc:"手机号"` - Email string `json:"email" dc:"邮箱"` - RealName string `json:"realName" dc:"真实姓名"` + g.Meta `path:"/member/updateProfile" method:"post" tags:"用户" summary:"更新用户资料"` + adminin.MemberUpdateProfileInp } type UpdateProfileRes struct{} // UpdatePwdReq 修改登录密码 type UpdatePwdReq struct { - g.Meta `path:"/member/updatePwd" method:"post" tags:"会员" summary:"重置密码"` - OldPassword string `json:"oldPassword" v:"required#原密码不能为空" dc:"原密码"` - NewPassword string `json:"newPassword" v:"required|length:6,16#新密码不能为空#新密码需在6~16之间" dc:"新密码"` + g.Meta `path:"/member/updatePwd" method:"post" tags:"用户" summary:"重置密码"` + adminin.MemberUpdatePwdInp } type UpdatePwdRes struct{} -// ProfileReq 获取登录用户的基本信息 -type ProfileReq struct { - g.Meta `path:"/member/profile" method:"get" tags:"会员" summary:"获取登录用户的基本信息"` -} -type ProfileRes struct { - PostGroup string `json:"postGroup" dc:"岗位名称"` - RoleGroup string `json:"roleGroup" dc:"角色名称"` - User *adminin.MemberViewModel `json:"member" dc:"用户基本信息"` - SysDept *adminin.DeptViewModel `json:"sysDept" dc:"部门信息"` - SysRoles []*adminin.RoleListModel `json:"sysRoles" dc:"角色列表"` - PostIds int64 `json:"postIds" dc:"当前岗位"` - RoleIds int64 `json:"roleIds" dc:"当前角色"` -} - // ResetPwdReq 重置密码 type ResetPwdReq struct { - g.Meta `path:"/member/resetPwd" method:"post" tags:"会员" summary:"重置密码"` - Password string `json:"password" v:"required#密码不能为空" dc:"密码"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/resetPwd" method:"post" tags:"用户" summary:"重置密码"` + adminin.MemberResetPwdInp } type ResetPwdRes struct{} // EmailUniqueReq 邮箱是否唯一 type EmailUniqueReq struct { - g.Meta `path:"/member/emailUnique" method:"get" tags:"会员" summary:"邮箱是否唯一"` - Email string `json:"email" v:"required#邮箱不能为空" dc:"邮箱"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/emailUnique" method:"get" tags:"用户" summary:"邮箱是否唯一"` + adminin.MemberEmailUniqueInp } type EmailUniqueRes struct { - IsUnique bool `json:"is_unique" dc:"是否唯一"` + *adminin.MemberEmailUniqueModel } // MobileUniqueReq 手机号是否唯一 type MobileUniqueReq struct { - g.Meta `path:"/member/mobileUnique" method:"get" tags:"会员" summary:"手机号是否唯一"` - Mobile string `json:"mobile" v:"required#手机号不能为空" dc:"手机号"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/mobileUnique" method:"get" tags:"用户" summary:"手机号是否唯一"` + adminin.MemberMobileUniqueInp } type MobileUniqueRes struct { - IsUnique bool `json:"is_unique" dc:"是否唯一"` + *adminin.MemberMobileUniqueModel } // NameUniqueReq 名称是否唯一 type NameUniqueReq struct { - g.Meta `path:"/member/nameUnique" method:"get" tags:"会员" summary:"会员名称是否唯一"` - Username string `json:"username" v:"required#会员名称不能为空" dc:"会员名称"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/nameUnique" method:"get" tags:"用户" summary:"用户名称是否唯一"` + adminin.MemberNameUniqueInp } type NameUniqueRes struct { - IsUnique bool `json:"is_unique" dc:"是否唯一"` + *adminin.MemberNameUniqueModel } // ListReq 查询列表 type ListReq struct { - g.Meta `path:"/member/list" method:"get" tags:"会员" summary:"获取会员列表"` - form.PageReq - form.RangeDateReq - form.StatusReq - DeptId int `json:"deptId" dc:"部门ID"` - Mobile int `json:"mobile" dc:"手机号"` - Username string `json:"username" dc:"用户名"` - Realname string `json:"realName" dc:"真实姓名"` - Name string `json:"name" dc:"岗位名称"` - Code string `json:"code" dc:"岗位编码"` - CreatedAt []int64 `json:"createdAt" dc:"创建时间"` + g.Meta `path:"/member/list" method:"get" tags:"用户" summary:"获取用户列表"` + adminin.MemberListInp } type ListRes struct { @@ -105,107 +94,54 @@ type ListRes struct { // ViewReq 获取指定信息 type ViewReq struct { - g.Meta `path:"/member/view" method:"get" tags:"会员" summary:"获取指定信息"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/view" method:"get" tags:"用户" summary:"获取指定信息"` + adminin.MemberViewInp } type ViewRes struct { *adminin.MemberViewModel - Posts []*adminin.PostListModel `json:"posts" dc:"可选岗位"` - PostIds []int64 `json:"postIds" dc:"当前岗位"` - Roles []*adminin.RoleListModel `json:"roles" dc:"可选角色"` - RoleIds []int64 `json:"roleIds" dc:"当前角色"` - DeptName string `json:"deptName" dc:"部门名称"` } // EditReq 修改/新增 type EditReq struct { - g.Meta `path:"/member/edit" method:"post" tags:"会员" summary:"修改/新增会员"` + g.Meta `path:"/member/edit" method:"post" tags:"用户" summary:"修改/新增用户"` adminin.MemberEditInp } type EditRes struct{} // DeleteReq 删除 type DeleteReq struct { - g.Meta `path:"/member/delete" method:"post" tags:"会员" summary:"删除会员"` - Id interface{} `json:"id" v:"required#会员ID不能为空" dc:"会员ID"` + g.Meta `path:"/member/delete" method:"post" tags:"用户" summary:"删除用户"` + adminin.MemberDeleteInp } type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { - g.Meta `path:"/member/max_sort" method:"get" tags:"会员" summary:"会员最大排序"` - Id int64 `json:"id" dc:"会员ID"` + g.Meta `path:"/member/maxSort" method:"get" tags:"用户" summary:"用户最大排序"` + adminin.MemberMaxSortInp } type MaxSortRes struct { - Sort int `json:"sort" dc:"排序"` + *adminin.MemberMaxSortModel } -// InfoReq 获取登录用户信息 -type InfoReq struct { - g.Meta `path:"/member/info" method:"get" tags:"会员" summary:"获取登录用户信息" dc:"获取管理后台的登录用户信息"` +// LoginInfoReq 获取登录用户信息 +type LoginInfoReq struct { + g.Meta `path:"/member/info" method:"get" tags:"用户" summary:"获取登录用户信息" dc:"获取管理后台的登录用户信息"` } -type InfoRes struct { - adminin.MemberLoginModel +type LoginInfoRes struct { + *adminin.LoginMemberInfoModel } -type PortalConfigContentOptions struct { - TitleRequired bool `json:"titleRequired" titleRequired:""` - MoreUrl string `json:"moreUrl" dc:"模块地址"` - Refresh int `json:"refresh" dc:"刷新"` -} - -type PortalConfigContent struct { - Id int `json:"id" dc:"内容ID"` - X int `json:"x" dc:""` - Y int `json:"y" dc:""` - W int `json:"w" dc:"宽"` - H int `json:"h" dc:"高"` - I int `json:"i" dc:""` - Key string `json:"key" dc:""` - IsShowTitle string `json:"isShowTitle" dc:""` - IsAllowDrag bool `json:"isAllowDrag" dc:""` - Name string `json:"name" dc:""` - Type string `json:"type" dc:""` - Url string `json:"url" dc:""` - Options []*PortalConfigContentOptions `json:"options" dc:""` - Moved bool `json:"moved" dc:""` -} - -type PortalConfig struct { - CreateByName string `json:"createByName" dc:"创建者名称"` - CreateDeptName string `json:"createDeptName" dc:"创建部门名称"` - ImportErrInfo string `json:"importErrInfo" dc:"导出错误信息"` - Id string `json:"id" dc:"用户ID"` - SearchValue string `json:"searchValue" dc:"搜索内容"` - CreateBy string `json:"createBy" dc:"创建者名称"` - CreateDept string `json:"createDept" dc:"创建部门名称"` - CreateTime *gtime.Time `json:"createTime" dc:"创建时间"` - UpdateBy string `json:"updateBy" dc:"更新者名称"` - UpdateTime *gtime.Time `json:"updateTime" dc:"更新时间"` - UpdateIp string `json:"updateIp" dc:"更新iP"` - Remark string `json:"remark" dc:"备注"` - Version string `json:"version" dc:"版本号"` - DelFlag string `json:"delFlag" dc:"删除标签"` - HandleType string `json:"handleType" dc:""` - Params string `json:"params" dc:""` - Name string `json:"name" dc:"配置名称"` - Code string `json:"code" dc:"配置代码"` - ApplicationRange string `json:"applicationRange" dc:""` - IsDefault string `json:"isDefault" dc:"是否默认"` - ResourceId string `json:"resourceId" dc:""` - ResourceName string `json:"resourceName" dc:""` - SystemDefinedId string `json:"systemDefinedId" dc:""` - Sort string `json:"sort" dc:"排序"` - SaveType string `json:"saveType" dc:""` - Status string `json:"status" dc:"状态"` - RecordLog string `json:"recordLog" dc:""` - PortalConfigContent string `json:"content" dc:"配置内容"` -} - -// StatusReq 更新岗位状态 +// StatusReq 更新用户状态 type StatusReq struct { - entity.AdminPost - g.Meta `path:"/member/status" method:"post" tags:"会员" summary:"更新会员状态"` + g.Meta `path:"/member/status" method:"post" tags:"用户" summary:"更新用户状态"` + adminin.MemberStatusInp } type StatusRes struct{} + +// SelectReq 获取可选的后台用户选项 +type SelectReq struct { + g.Meta `path:"/member/option" method:"get" summary:"用户" tags:"获取可选的后台用户选项"` +} +type SelectRes []*adminin.MemberSelectModel diff --git a/server/api/backend/menu/menu.go b/server/api/backend/menu/menu.go index 53456de..135a468 100644 --- a/server/api/backend/menu/menu.go +++ b/server/api/backend/menu/menu.go @@ -15,7 +15,7 @@ import ( // MaxSortReq 菜单最大排序 type MaxSortReq struct { - g.Meta `path:"/menu/max_sort" method:"get" tags:"菜单" summary:"菜单最大排序"` + g.Meta `path:"/menu/maxSort" method:"get" tags:"菜单" summary:"菜单最大排序"` Id int64 `json:"id" dc:"菜单ID"` } type MaxSortRes struct { diff --git a/server/api/backend/notice/notice.go b/server/api/backend/notice/notice.go index 9033f08..7f2ca69 100644 --- a/server/api/backend/notice/notice.go +++ b/server/api/backend/notice/notice.go @@ -8,19 +8,14 @@ package notice import ( "github.com/gogf/gf/v2/frame/g" - "hotgo/internal/model/entity" "hotgo/internal/model/input/adminin" "hotgo/internal/model/input/form" ) // ListReq 查询列表 type ListReq struct { - form.PageReq - form.RangeDateReq - form.StatusReq - Title string `json:"title"` - Content string `json:"content"` - g.Meta `path:"/notice/list" method:"get" tags:"公告" summary:"获取公告列表"` + g.Meta `path:"/notice/list" method:"get" tags:"公告" summary:"获取公告列表"` + adminin.NoticeListInp } type ListRes struct { @@ -30,39 +25,105 @@ type ListRes struct { // ViewReq 获取指定信息 type ViewReq struct { - Id int64 `json:"id" v:"required#公告ID不能为空" dc:"公告ID"` g.Meta `path:"/notice/view" method:"get" tags:"公告" summary:"获取指定信息"` + adminin.NoticeViewInp } + type ViewRes struct { *adminin.NoticeViewModel } // EditReq 修改/新增字典数据 type EditReq struct { - entity.AdminNotice g.Meta `path:"/notice/edit" method:"post" tags:"公告" summary:"修改/新增公告"` + adminin.NoticeEditInp } + type EditRes struct{} // DeleteReq 删除字典类型 type DeleteReq struct { - Id interface{} `json:"id" v:"required#公告ID不能为空" dc:"公告ID"` g.Meta `path:"/notice/delete" method:"post" tags:"公告" summary:"删除公告"` + adminin.NoticeDeleteInp } + type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { - Id int64 `json:"id" dc:"公告ID"` - g.Meta `path:"/notice/max_sort" method:"get" tags:"公告" summary:"公告最大排序"` + g.Meta `path:"/notice/maxSort" method:"get" tags:"公告" summary:"公告最大排序"` + adminin.NoticeMaxSortInp } + type MaxSortRes struct { Sort int `json:"sort" dc:"排序"` } // StatusReq 更新公告状态 type StatusReq struct { - entity.AdminNotice g.Meta `path:"/notice/status" method:"post" tags:"公告" summary:"更新公告状态"` + adminin.NoticeStatusInp } + type StatusRes struct{} + +// EditNotifyReq 修改/新增通知 +type EditNotifyReq struct { + g.Meta `path:"/notice/editNotify" method:"post" tags:"公告" summary:"修改/新增通知"` + adminin.NoticeEditInp +} + +type EditNotifyRes struct{} + +// EditNoticeReq 修改/新增公告 +type EditNoticeReq struct { + g.Meta `path:"/notice/editNotice" method:"post" tags:"公告" summary:"修改/新增公告"` + adminin.NoticeEditInp +} + +type EditNoticeRes struct{} + +// EditLetterReq 修改/新增公告 +type EditLetterReq struct { + g.Meta `path:"/notice/editLetter" method:"post" tags:"公告" summary:"修改/新增私信"` + adminin.NoticeEditInp +} + +type EditLetterRes struct{} + +// PullMessagesReq 拉取我的消息 +type PullMessagesReq struct { + g.Meta `path:"/notice/pullMessages" method:"get" tags:"公告" summary:"拉取我的消息"` + adminin.PullMessagesInp +} + +type PullMessagesRes struct { + *adminin.PullMessagesModel +} + +// ReadAllReq 全部已读 +type ReadAllReq struct { + g.Meta `path:"/notice/readAll" method:"post" tags:"公告" summary:"全部已读"` + adminin.NoticeReadAllInp +} + +type ReadAllRes struct { +} + +// UpReadReq 更新已读 +type UpReadReq struct { + g.Meta `path:"/notice/upRead" method:"post" tags:"公告" summary:"更新已读"` + adminin.NoticeUpReadInp +} +type UpReadRes struct{} + +// MessageListReq 我的消息列表 +type MessageListReq struct { + g.Meta `path:"/notice/messageList" method:"get" tags:"公告" summary:"我的消息列表"` + adminin.NoticeMessageListInp +} + +type MessageListRes struct { + List []*adminin.NoticeMessageListModel `json:"list" dc:"数据列表"` + form.PageRes +} diff --git a/server/api/backend/post/post.go b/server/api/backend/post/post.go index 41cebbf..052ced9 100644 --- a/server/api/backend/post/post.go +++ b/server/api/backend/post/post.go @@ -29,7 +29,7 @@ type DeleteRes struct{} // MaxSortReq 最大排序 type MaxSortReq struct { - g.Meta `path:"/post/max_sort" method:"get" tags:"岗位" summary:"岗位最大排序"` + g.Meta `path:"/post/maxSort" method:"get" tags:"岗位" summary:"岗位最大排序"` Id int64 `json:"id" description:"岗位ID"` } type MaxSortRes struct { diff --git a/server/api/backend/provinces/provinces.go b/server/api/backend/provinces/provinces.go index 2a88fb2..38f32d6 100644 --- a/server/api/backend/provinces/provinces.go +++ b/server/api/backend/provinces/provinces.go @@ -93,3 +93,19 @@ type UniqueIdReq struct { type UniqueIdRes struct { *sysin.ProvincesUniqueIdModel } + +// SelectReq 省市区选项 +type SelectReq struct { + g.Meta `path:"/provinces/select" method:"get" summary:"省市区" tags:"省市区选项"` + sysin.ProvincesSelectInp +} +type SelectRes struct { + *sysin.ProvincesSelectModel +} + +// CityLabelReq 获取指定城市标签 +type CityLabelReq struct { + g.Meta `path:"/provinces/cityLabel" method:"get" summary:"省市区" tags:"获取指定城市标签"` + sysin.ProvincesCityLabelInp +} +type CityLabelRes sysin.ProvincesCityLabelModel diff --git a/server/api/backend/role/role.go b/server/api/backend/role/role.go index ab027d8..55b8ba1 100644 --- a/server/api/backend/role/role.go +++ b/server/api/backend/role/role.go @@ -15,7 +15,7 @@ import ( // MemberListReq 查询列表 type MemberListReq struct { - g.Meta `path:"/role/member_list" method:"get" tags:"角色" summary:"获取角色下的会员列表"` + g.Meta `path:"/role/member_list" method:"get" tags:"角色" summary:"获取角色下的用户列表"` form.PageReq form.RangeDateReq form.StatusReq diff --git a/server/go.mod b/server/go.mod index 364e772..849d614 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,6 +3,7 @@ module hotgo go 1.15 require ( + github.com/BurntSushi/toml v1.2.1 // indirect github.com/Shopify/sarama v1.34.1 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2 github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.5 @@ -12,29 +13,37 @@ require ( github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/bufanyun/pool v0.2.1 github.com/casbin/casbin/v2 v2.55.0 + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/clbanning/mxj/v2 v2.5.7 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/fatih/color v1.14.1 // indirect github.com/forgoer/openssl v1.4.0 + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-resty/resty/v2 v2.7.0 - github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2 - github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0 + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.1 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.1 github.com/gogf/gf/v2 v2.3.1 github.com/golang/mock v1.6.0 // indirect github.com/gomodule/redigo v1.8.8 github.com/google/btree v1.1.2 // indirect github.com/gorilla/websocket v1.5.0 github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 - github.com/mattn/go-colorable v0.1.12 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mojocn/base64Captcha v1.3.5 github.com/olekukonko/tablewriter v0.0.5 + github.com/rivo/uniseg v0.4.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible github.com/shopspring/decimal v1.3.1 github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/ufilesdk-dev/ufile-gosdk v1.0.3 github.com/xuri/excelize/v2 v2.6.0 github.com/yusufpapurcu/wmi v1.2.2 // indirect + go.opentelemetry.io/otel/sdk v1.11.2 // indirect go.uber.org/atomic v1.7.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/tools v0.1.7 - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b + golang.org/x/net v0.5.0 // indirect + golang.org/x/tools v0.1.12 + gopkg.in/yaml.v3 v3.0.1 ) diff --git a/server/go.sum b/server/go.sum index 2a8f4c0..0661c1b 100644 --- a/server/go.sum +++ b/server/go.sum @@ -33,8 +33,9 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -89,13 +90,15 @@ github.com/casbin/casbin/v2 v2.55.0 h1:RyU+OacnVzjxof1U3bmxHM7oCRdx9+gNnkclrvof/ github.com/casbin/casbin/v2 v2.55.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/clbanning/mxj/v2 v2.5.7 h1:7q5lvUpaPF/WOkqgIDiwjBJaznaLCCBd78pi8ZyAnE0= +github.com/clbanning/mxj/v2 v2.5.7/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -119,8 +122,9 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/forgoer/openssl v1.4.0 h1:rPMnQ92OKuBsKnfY/GmUDunnP72Cy+zviAompWMdC9U= github.com/forgoer/openssl v1.4.0/go.mod h1:NMVFOzYeLVR7UiGTxsa+A21nrERTZ3Rv2JHDPcJpDyI= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -128,8 +132,9 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -151,14 +156,15 @@ github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2 h1:QgVPXrGp8wJx18HIOsNATaIiHjXsd/Rk1F1QyxfWv+g= -github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2/go.mod h1:z+/0qiOwMroAnj5ESuobTv0l5P83rf+XR3r6Fj8WJyk= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0 h1:r2q8MLwF6yUIEm6Hhwsfo/ixaJTKluTXSjU8rSeXo3c= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0/go.mod h1:V9o2BF9ovJnaZhHImHAanqUgjX4kI51lgU45u5rPqvw= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.1 h1:uSZtDmlTFS51A98KPgZElPigSGDi7PPDN6mxeIXtsLo= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.1/go.mod h1:z+/0qiOwMroAnj5ESuobTv0l5P83rf+XR3r6Fj8WJyk= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.1 h1:0pt3KCUtVtBPC6m/6natIeBKBYAQUcfSqy5IR58ogLo= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.1/go.mod h1:V9o2BF9ovJnaZhHImHAanqUgjX4kI51lgU45u5rPqvw= github.com/gogf/gf/v2 v2.0.0/go.mod h1:apktt6TleWtCIwpz63vBqUnw8MX8gWKoZyxgDpXFtgM= github.com/gogf/gf/v2 v2.3.1 h1:uptCJK47N6KSRwTBnFAqBWYnYa/OXBkZ0OlhO9CK7bQ= github.com/gogf/gf/v2 v2.3.1/go.mod h1:tsbmtwcAl2chcYoq/fP9W2FZf06aw4i89X34nbSHo9Y= @@ -213,8 +219,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -294,16 +301,20 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -369,6 +380,9 @@ github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5Z github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o= github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -393,14 +407,18 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tidwall/gjson v1.2.1 h1:j0efZLrZUvNerEf6xqoi0NjWMK5YlLrR7Guo/dxY174= github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= @@ -432,6 +450,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -440,14 +459,17 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= -go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= +go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM= -go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= +go.opentelemetry.io/otel/sdk v1.11.2 h1:GF4JoaEx7iihdMFu30sOyRx52HDHOkl9xQ8SMqNXUiU= +go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU= go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= -go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0= +go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -460,6 +482,7 @@ golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= @@ -497,8 +520,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -530,6 +554,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -537,8 +562,10 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -556,6 +583,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -607,14 +635,21 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -622,8 +657,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2 h1:GLw7MR8AfAG2GmGcmVgObFOHXYypgGjnGno25RDwn3Y= golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0= +golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -672,14 +708,13 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -779,8 +814,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/server/internal/cmd/cmd.go b/server/internal/cmd/cmd.go index 2ce88f8..cd881b7 100644 --- a/server/internal/cmd/cmd.go +++ b/server/internal/cmd/cmd.go @@ -54,14 +54,14 @@ var ( g.Log().Debug(ctx, "starting all server") simple.SafeGo(ctx, func(ctx context.Context) { - if err := Http.Func(ctx, parser); err != nil { - g.Log().Fatal(ctx, "http server start fail:", err) + if err := Queue.Func(ctx, parser); err != nil { + g.Log().Fatal(ctx, "queue consumer start fail:", err) } }) simple.SafeGo(ctx, func(ctx context.Context) { - if err := Queue.Func(ctx, parser); err != nil { - g.Log().Fatal(ctx, "queue consumer start fail:", err) + if err := Http.Func(ctx, parser); err != nil { + g.Log().Fatal(ctx, "http server start fail:", err) } }) diff --git a/server/internal/cmd/http.go b/server/internal/cmd/http.go index b11a1f5..e55a0cf 100644 --- a/server/internal/cmd/http.go +++ b/server/internal/cmd/http.go @@ -36,7 +36,8 @@ var ( }) // 请求结束事件回调 - s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().GlobalLog) + s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().AccessLog) + s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().LastActive) s.Group("/", func(group *ghttp.RouterGroup) { @@ -74,7 +75,7 @@ var ( // Just run the server. s.Run() - return nil + return }, } ) @@ -83,7 +84,6 @@ func setSSL(ctx context.Context, s *ghttp.Server) { config, err := service.SysConfig().GetLoadSSL(ctx) if err != nil { g.Log().Fatal(ctx, "ssl配置获取失败:err:%+v", err) - return } if config != nil && config.Switch { s.EnableHTTPS(config.CrtPath, config.KeyPath) diff --git a/server/internal/consts/debris.go b/server/internal/consts/debris.go index 8814a5e..d290658 100644 --- a/server/internal/consts/debris.go +++ b/server/internal/consts/debris.go @@ -10,5 +10,6 @@ package consts const ( DemoTips = "演示系统已隐藏" - NilJsonToString = "{}" // 空json初始化值 + NilJsonToString = "{}" // 空json初始化值 + RegionSpilt = " / " // 地区分隔符 ) diff --git a/server/internal/consts/ems.go b/server/internal/consts/ems.go new file mode 100644 index 0000000..40c9dbd --- /dev/null +++ b/server/internal/consts/ems.go @@ -0,0 +1,39 @@ +package consts + +import "github.com/gogf/gf/v2/frame/g" + +// 邮件内置模板 +const ( + EmsTemplateText = "text" // 通用文本 + EmsTemplateCode = "code" // 通用验证码 + EmsTemplateLogin = "login" // 登录 + EmsTemplateRegister = "register" // 注册 + EmsTemplateResetPwd = "resetPwd" // 重置密码 + EmsTemplateBind = "bind" // 绑定邮箱 + EmsTemplateCash = "cash" // 申请提现 +) + +// 验证码状态 +const ( + EmsStatusNotUsed = 1 // 未使用 + EmsStatusUsed = 2 // 已使用 +) + +var EmsSubjectMap = g.MapStrStr{ + EmsTemplateText: "这是一封来自HotGo的邮件", + EmsTemplateCode: "验证码", + EmsTemplateLogin: "登录验证码", + EmsTemplateRegister: "注册验证码", + EmsTemplateResetPwd: "重置密码", + EmsTemplateBind: "绑定邮箱验证码", + EmsTemplateCash: "申请提现验证码", +} + +// IsCodeEmsTemplate 是否是验证码类型的模板 +func IsCodeEmsTemplate(template string) bool { + return template == EmsTemplateCode || + template == EmsTemplateLogin || + template == EmsTemplateRegister || + template == EmsTemplateBind || + template == EmsTemplateCash +} diff --git a/server/internal/consts/gencodes.go b/server/internal/consts/gencodes.go index 2347a14..a718c4b 100644 --- a/server/internal/consts/gencodes.go +++ b/server/internal/consts/gencodes.go @@ -21,6 +21,13 @@ var GenCodesTypeNameMap = map[int]string{ GenCodesTypeCron: "定时任务(未实现)", } +var GenCodesTypeConfMap = map[int]string{ + GenCodesTypeCurd: "crud", + GenCodesTypeTree: "tree", + GenCodesTypeQueue: "queue", + GenCodesTypeCron: "cron", +} + // 生成代码状态 const ( GenCodesStatusOk = 1 // 生成成功 diff --git a/server/internal/consts/notice.go b/server/internal/consts/notice.go new file mode 100644 index 0000000..8fc0d37 --- /dev/null +++ b/server/internal/consts/notice.go @@ -0,0 +1,8 @@ +package consts + +// 公告类型 +const ( + NoticeTypeNotify = 1 // 通知 + NoticeTypeNotice = 2 // 公告 + NoticeTypeLetter = 3 // 私信 +) diff --git a/server/internal/consts/sms.go b/server/internal/consts/sms.go index e1a07e3..b42f4b9 100644 --- a/server/internal/consts/sms.go +++ b/server/internal/consts/sms.go @@ -17,7 +17,7 @@ const ( SmsTemplateCash = "cash" // 申请提现 ) -// 短信状态码 +// 验证码状态 const ( SmsStatusNotUsed = 1 // 未使用 SmsStatusUsed = 2 // 已使用 diff --git a/server/internal/consts/version.go b/server/internal/consts/version.go index f328dda..d6b2c0e 100644 --- a/server/internal/consts/version.go +++ b/server/internal/consts/version.go @@ -8,5 +8,5 @@ package consts // VersionApp HotGo版本 const ( - VersionApp = "2.1.2" + VersionApp = "2.1.3" ) diff --git a/server/internal/controller/backend/admin/dept.go b/server/internal/controller/backend/admin/dept.go index 1e5f389..789014e 100644 --- a/server/internal/controller/backend/admin/dept.go +++ b/server/internal/controller/backend/admin/dept.go @@ -21,122 +21,102 @@ var ( type cDept struct{} // NameUnique 名称是否唯一 -func (c *cDept) NameUnique(ctx context.Context, req *dept.NameUniqueReq) (*dept.NameUniqueRes, error) { - +func (c *cDept) NameUnique(ctx context.Context, req *dept.NameUniqueReq) (res *dept.NameUniqueRes, err error) { data, err := service.AdminDept().NameUnique(ctx, adminin.DeptNameUniqueInp{Id: req.Id, Name: req.Name}) if err != nil { - return nil, err + return } - var res dept.NameUniqueRes + res = new(dept.NameUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // Delete 删除 func (c *cDept) Delete(ctx context.Context, req *dept.DeleteReq) (res *dept.DeleteRes, err error) { var in adminin.DeptDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminDept().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.AdminDept().Delete(ctx, in) + return } // Edit 更新 func (c *cDept) Edit(ctx context.Context, req *dept.EditReq) (res *dept.EditRes, err error) { - var in adminin.DeptEditInp if err = gconv.Scan(req, &in); err != nil { return nil, err } - if err = service.AdminDept().Edit(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.AdminDept().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (*dept.MaxSortRes, error) { - +func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (res *dept.MaxSortRes, err error) { data, err := service.AdminDept().MaxSort(ctx, adminin.DeptMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res dept.MaxSortRes + res = new(dept.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cDept) View(ctx context.Context, req *dept.ViewReq) (*dept.ViewRes, error) { - +func (c *cDept) View(ctx context.Context, req *dept.ViewReq) (res *dept.ViewRes, err error) { data, err := service.AdminDept().View(ctx, adminin.DeptViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res dept.ViewRes + res = new(dept.ViewRes) res.DeptViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cDept) List(ctx context.Context, req *dept.ListReq) (*dept.ListRes, error) { - - var ( - in adminin.DeptListInp - res dept.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cDept) List(ctx context.Context, req *dept.ListReq) (res *dept.ListRes, err error) { + var in adminin.DeptListInp + if err = gconv.Scan(req, &in); err != nil { + return } + data, err := service.AdminDept().List(ctx, in) if err != nil { - return nil, err + return } - _ = gconv.Structs(data, &res) - - return &res, nil + res = (*dept.ListRes)(&data) + return } // ListTree 查看列表树 -func (c *cDept) ListTree(ctx context.Context, req *dept.ListTreeReq) (*dept.ListTreeRes, error) { - - var ( - in adminin.DeptListTreeInp - res dept.ListTreeRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cDept) ListTree(ctx context.Context, req *dept.ListTreeReq) (res *dept.ListTreeRes, err error) { + var in adminin.DeptListTreeInp + if err = gconv.Scan(req, &in); err != nil { + return } + data, err := service.AdminDept().ListTree(ctx, in) if err != nil { - return nil, err + return } - _ = gconv.Structs(data, &res) - - return &res, nil + res = (*dept.ListTreeRes)(&data) + return } // Status 更新部门状态 func (c *cDept) Status(ctx context.Context, req *dept.StatusReq) (res *dept.StatusRes, err error) { - var in adminin.DeptStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminDept().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.AdminDept().Status(ctx, in) + return } diff --git a/server/internal/controller/backend/admin/member.go b/server/internal/controller/backend/admin/member.go index 3e0ead9..9d7d0fc 100644 --- a/server/internal/controller/backend/admin/member.go +++ b/server/internal/controller/backend/admin/member.go @@ -23,269 +23,228 @@ var ( type cMember struct{} -// UpdateProfile 修改登录密码 -func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileReq) (res *member.UpdateProfileRes, err error) { +// UpdateCash 修改代理商提现信息 +func (c *cMember) UpdateCash(ctx context.Context, req *member.UpdateCashReq) (res *member.UpdateCashRes, err error) { + var in adminin.MemberUpdateCashInp + if err = gconv.Scan(req, &in); err != nil { + return + } + err = service.AdminMember().UpdateCash(ctx, in) + return +} + +// UpdateEmail 换绑邮箱 +func (c *cMember) UpdateEmail(ctx context.Context, req *member.UpdateEmailReq) (res *member.UpdateEmailRes, err error) { + var in adminin.MemberUpdateEmailInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.AdminMember().UpdateEmail(ctx, in) + return +} + +// UpdateMobile 换绑手机号 +func (c *cMember) UpdateMobile(ctx context.Context, req *member.UpdateMobileReq) (res *member.UpdateMobileRes, err error) { + var in adminin.MemberUpdateMobileInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.AdminMember().UpdateMobile(ctx, in) + return +} + +// UpdateProfile 更新用户资料 +func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileReq) (res *member.UpdateProfileRes, err error) { var in adminin.MemberUpdateProfileInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - - if err = service.AdminMember().UpdateProfile(ctx, in); err != nil { - return nil, err + return } + err = service.AdminMember().UpdateProfile(ctx, in) return } // UpdatePwd 修改登录密码 func (c *cMember) UpdatePwd(ctx context.Context, req *member.UpdatePwdReq) (res *member.UpdatePwdRes, err error) { - - memberId := contexts.Get(ctx).User.Id + var memberId = contexts.Get(ctx).User.Id if memberId <= 0 { - err := gerror.New("获取用户信息失败!") + err = gerror.New("获取用户信息失败!") return nil, err } - if err = service.AdminMember(). - UpdatePwd(ctx, adminin.MemberUpdatePwdInp{Id: memberId, OldPassword: req.OldPassword, NewPassword: req.NewPassword}); err != nil { - return nil, err + var in = adminin.MemberUpdatePwdInp{ + Id: memberId, + OldPassword: req.OldPassword, + NewPassword: req.NewPassword, } + err = service.AdminMember().UpdatePwd(ctx, in) return } -// Profile 获取登录用户的基本信息 -func (c *cMember) Profile(ctx context.Context, req *member.ProfileReq) (*member.ProfileRes, error) { - - var res member.ProfileRes - - memberId := contexts.Get(ctx).User.Id - if memberId <= 0 { - err := gerror.New("获取用户信息失败!") - return nil, err - } - - // 用户基本信息 - memberInfo, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: memberId}) - if err != nil { - return nil, err - } - res.User = memberInfo - - // 所在部门 - sysDept, err := service.AdminDept().View(ctx, adminin.DeptViewInp{Id: memberInfo.DeptId}) - if err != nil { - return nil, err - } - res.SysDept = sysDept - - // 角色列表 - sysRoles, err := service.AdminRole().GetMemberList(ctx, memberInfo.RoleId) - if err != nil { - return nil, err - } - res.SysRoles = sysRoles - - // 获取角色名称 - roleGroup, err := service.AdminRole().GetName(ctx, memberInfo.RoleId) - if err != nil { - return nil, err - } - res.RoleGroup = roleGroup - - // 获取第一岗位名称 - postGroup, err := service.AdminPost().GetMemberByStartName(ctx, memberInfo.Id) - if err != nil { - return nil, err - } - res.PostGroup = postGroup - - return &res, nil -} - // ResetPwd 重置密码 func (c *cMember) ResetPwd(ctx context.Context, req *member.ResetPwdReq) (res *member.ResetPwdRes, err error) { - - if err = service.AdminMember(). - ResetPwd(ctx, adminin.MemberResetPwdInp{Id: req.Id, Password: req.Password}); err != nil { - return nil, err + var in = adminin.MemberResetPwdInp{ + Id: req.Id, + Password: req.Password, } + err = service.AdminMember().ResetPwd(ctx, in) return } // EmailUnique 邮箱是否唯一 -func (c *cMember) EmailUnique(ctx context.Context, req *member.EmailUniqueReq) (*member.EmailUniqueRes, error) { - - data, err := service.AdminMember().EmailUnique(ctx, adminin.MemberEmailUniqueInp{Id: req.Id, Email: req.Email}) - if err != nil { - return nil, err +func (c *cMember) EmailUnique(ctx context.Context, req *member.EmailUniqueReq) (res *member.EmailUniqueRes, err error) { + var in = adminin.MemberEmailUniqueInp{ + Id: req.Id, + Email: req.Email, } - var res member.EmailUniqueRes + data, err := service.AdminMember().EmailUnique(ctx, in) + if err != nil { + return + } + + res = new(member.EmailUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // MobileUnique 手机号是否唯一 -func (c *cMember) MobileUnique(ctx context.Context, req *member.MobileUniqueReq) (*member.MobileUniqueRes, error) { - - data, err := service.AdminMember().MobileUnique(ctx, adminin.MemberMobileUniqueInp{Id: req.Id, Mobile: req.Mobile}) - if err != nil { - return nil, err +func (c *cMember) MobileUnique(ctx context.Context, req *member.MobileUniqueReq) (res *member.MobileUniqueRes, err error) { + var in = adminin.MemberMobileUniqueInp{ + Id: req.Id, + Mobile: req.Mobile, } - var res member.MobileUniqueRes + data, err := service.AdminMember().MobileUnique(ctx, in) + if err != nil { + return + } + + res = new(member.MobileUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // NameUnique 名称是否唯一 -func (c *cMember) NameUnique(ctx context.Context, req *member.NameUniqueReq) (*member.NameUniqueRes, error) { - - data, err := service.AdminMember().NameUnique(ctx, adminin.MemberNameUniqueInp{Id: req.Id, Username: req.Username}) - if err != nil { - return nil, err +func (c *cMember) NameUnique(ctx context.Context, req *member.NameUniqueReq) (res *member.NameUniqueRes, err error) { + var in = adminin.MemberNameUniqueInp{ + Id: req.Id, + Username: req.Username, } - var res member.NameUniqueRes + data, err := service.AdminMember().NameUnique(ctx, in) + if err != nil { + return + } + + res = new(member.NameUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // Delete 删除 func (c *cMember) Delete(ctx context.Context, req *member.DeleteReq) (res *member.DeleteRes, err error) { - var in adminin.MemberDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminMember().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.AdminMember().Delete(ctx, in) + return } // Edit 修改/新增 func (c *cMember) Edit(ctx context.Context, req *member.EditReq) (res *member.EditRes, err error) { - var in adminin.MemberEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } in.PostIds = req.PostIds - if err = service.AdminMember().Edit(ctx, in); err != nil { - return nil, err - } - - return res, nil + err = service.AdminMember().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cMember) MaxSort(ctx context.Context, req *member.MaxSortReq) (*member.MaxSortRes, error) { - - data, err := service.AdminMember().MaxSort(ctx, adminin.MemberMaxSortInp{Id: req.Id}) +func (c *cMember) MaxSort(ctx context.Context, req *member.MaxSortReq) (res *member.MaxSortRes, err error) { + var in = adminin.MemberMaxSortInp{Id: req.Id} + data, err := service.AdminMember().MaxSort(ctx, in) if err != nil { - return nil, err + return } - var res member.MaxSortRes + res = new(member.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cMember) View(ctx context.Context, req *member.ViewReq) (*member.ViewRes, error) { - - postsList, _, err := service.AdminPost().List(ctx, adminin.PostListInp{}) +func (c *cMember) View(ctx context.Context, req *member.ViewReq) (res *member.ViewRes, err error) { + data, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - //roleList, _, err := service.AdminRole().List(ctx, adminin.RoleListInp{}) - //if err != nil { - // return nil, err - //} - - var res member.ViewRes - res.Posts = postsList - //res.Roles = roleList - - if req.Id <= 0 { - return &res, err - } - - memberInfo, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: req.Id}) - if err != nil { - return nil, err - } - - res.MemberViewModel = memberInfo - - res.PostIds, err = service.AdminMemberPost().GetMemberByIds(ctx, memberInfo.Id) - if err != nil { - return nil, err - } - - res.RoleIds = []int64{memberInfo.RoleId} - res.DeptName, err = service.AdminDept().GetName(ctx, memberInfo.DeptId) - if err != nil { - return nil, err - } - return &res, nil + res = new(member.ViewRes) + res.MemberViewModel = data + return } // List 查看列表 -func (c *cMember) List(ctx context.Context, req *member.ListReq) (*member.ListRes, error) { - - var ( - in adminin.MemberListInp - res member.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cMember) List(ctx context.Context, req *member.ListReq) (res *member.ListRes, err error) { + var in adminin.MemberListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.AdminMember().List(ctx, in) if err != nil { - return nil, err + return } + res = new(member.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } -// Info 登录用户信息 -func (c *cMember) Info(ctx context.Context, req *member.InfoReq) (res *member.InfoRes, err error) { - - model, err := service.AdminMember().LoginMemberInfo(ctx, req) +// LoginInfo 登录用户信息 +func (c *cMember) LoginInfo(ctx context.Context, req *member.LoginInfoReq) (res *member.LoginInfoRes, err error) { + data, err := service.AdminMember().LoginMemberInfo(ctx) if err != nil { - return nil, err + return } - if err = gconv.Scan(model, &res); err != nil { - return nil, err - } + res = new(member.LoginInfoRes) + res.LoginMemberInfoModel = data return } // Status 更新状态 func (c *cMember) Status(ctx context.Context, req *member.StatusReq) (res *member.StatusRes, err error) { - var in adminin.MemberStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminMember().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.AdminMember().Status(ctx, in) + return +} + +// Select 获取可选的后台用户选项 +func (c *cMember) Select(ctx context.Context, req *member.SelectReq) (res *member.SelectRes, err error) { + data, err := service.AdminMember().Select(ctx, adminin.MemberSelectInp{}) + if err != nil { + return + } + + res = (*member.SelectRes)(&data) + return } diff --git a/server/internal/controller/backend/admin/menu.go b/server/internal/controller/backend/admin/menu.go index b5ac4c2..6641119 100644 --- a/server/internal/controller/backend/admin/menu.go +++ b/server/internal/controller/backend/admin/menu.go @@ -22,99 +22,67 @@ var ( type cMenu struct{} // RoleList 查询角色菜单列表 -func (c *cMenu) RoleList(ctx context.Context, req *menu.RoleListReq) (*menu.RoleListRes, error) { - +func (c *cMenu) RoleList(ctx context.Context, req *menu.RoleListReq) (res *menu.RoleListRes, err error) { var in adminin.MenuRoleListInp - if err := gconv.Scan(req, &in); err != nil { - return nil, err + if err = gconv.Scan(req, &in); err != nil { + return } data, err := service.AdminMenu().RoleList(ctx, in) if err != nil { - return nil, err + return } - var res menu.RoleListRes + res = new(menu.RoleListRes) res.CheckedKeys = data.CheckedKeys res.Menus = data.Menus - return &res, nil + return } // SearchList 查询菜单列表 func (c *cMenu) SearchList(ctx context.Context, req *menu.SearchListReq) (res *menu.SearchListRes, err error) { - res, err = service.AdminMenu().SearchList(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // MaxSort 最大排序 func (c *cMenu) MaxSort(ctx context.Context, req *menu.MaxSortReq) (res *menu.MaxSortRes, err error) { - res, err = service.AdminMenu().MaxSort(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // NameUnique 菜单名称是否唯一 func (c *cMenu) NameUnique(ctx context.Context, req *menu.NameUniqueReq) (res *menu.NameUniqueRes, err error) { - res, err = service.AdminMenu().NameUnique(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // CodeUnique 菜单编码是否唯一 func (c *cMenu) CodeUnique(ctx context.Context, req *menu.CodeUniqueReq) (res *menu.CodeUniqueRes, err error) { - res, err = service.AdminMenu().CodeUnique(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // Delete 删除 func (c *cMenu) Delete(ctx context.Context, req *menu.DeleteReq) (res *menu.DeleteRes, err error) { - - if err = service.AdminMenu().Delete(ctx, req); err != nil { - return nil, err - } - return res, nil + err = service.AdminMenu().Delete(ctx, req) + return } // Edit 更新 func (c *cMenu) Edit(ctx context.Context, req *menu.EditReq) (res *menu.EditRes, err error) { - - if err = service.AdminMenu().Edit(ctx, req); err != nil { - return nil, err - } - return res, nil + err = service.AdminMenu().Edit(ctx, req) + return } // View 获取信息 func (c *cMenu) View(ctx context.Context, req *menu.ViewReq) (res *menu.ViewRes, err error) { - res, err = service.AdminMenu().View(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // List 获取列表 func (c *cMenu) List(ctx context.Context, req *menu.ListReq) (res menu.ListRes, err error) { - res.List, err = service.AdminMenu().List(ctx, req) - - if err != nil { - return res, err - } - return res, nil + return } diff --git a/server/internal/controller/backend/admin/monitor.go b/server/internal/controller/backend/admin/monitor.go index c8ca5a2..ea71f1e 100644 --- a/server/internal/controller/backend/admin/monitor.go +++ b/server/internal/controller/backend/admin/monitor.go @@ -42,24 +42,23 @@ func (c *cMonitor) Offline(ctx context.Context, req *monitor.OfflineReq) (res *m websocket.Close(client) }) - return res, nil + return } // View 获取指定信息 -func (c *cMonitor) View(ctx context.Context, req *monitor.OnlineViewReq) (*monitor.OnlineViewRes, error) { - return &monitor.OnlineViewRes{}, nil +func (c *cMonitor) View(ctx context.Context, req *monitor.OnlineViewReq) (res *monitor.OnlineViewRes, err error) { + return } // OnlineList 获取在线列表 -func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (*monitor.OnlineListRes, error) { +func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (res *monitor.OnlineListRes, err error) { var ( - res monitor.OnlineListRes clients []*monitor.OnlineModel i int ) if c.wsManager.GetClientsLen() == 0 { - return &res, nil + return } for conn, _ := range c.wsManager.GetClients() { @@ -90,6 +89,7 @@ func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) ( }) } + res = new(monitor.OnlineListRes) res.PageCount = form.CalPageCount(len(clients), req.PerPage) res.Page = req.Page res.PerPage = req.PerPage @@ -108,5 +108,5 @@ func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) ( } } - return &res, nil + return } diff --git a/server/internal/controller/backend/admin/notice.go b/server/internal/controller/backend/admin/notice.go index ac9c7b4..33649c4 100644 --- a/server/internal/controller/backend/admin/notice.go +++ b/server/internal/controller/backend/admin/notice.go @@ -10,6 +10,7 @@ import ( "context" "github.com/gogf/gf/v2/util/gconv" "hotgo/api/backend/notice" + "hotgo/internal/consts" "hotgo/internal/model/input/adminin" "hotgo/internal/model/input/form" "hotgo/internal/service" @@ -25,63 +26,53 @@ type cNotice struct{} func (c *cNotice) Delete(ctx context.Context, req *notice.DeleteReq) (res *notice.DeleteRes, err error) { var in adminin.NoticeDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminNotice().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.AdminNotice().Delete(ctx, in) + return } // Edit 更新 func (c *cNotice) Edit(ctx context.Context, req *notice.EditReq) (res *notice.EditRes, err error) { - var in adminin.NoticeEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminNotice().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + in.Receiver = req.Receiver + err = service.AdminNotice().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (*notice.MaxSortRes, error) { - +func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (res *notice.MaxSortRes, err error) { data, err := service.AdminNotice().MaxSort(ctx, adminin.NoticeMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res notice.MaxSortRes + res = new(notice.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cNotice) View(ctx context.Context, req *notice.ViewReq) (*notice.ViewRes, error) { - +func (c *cNotice) View(ctx context.Context, req *notice.ViewReq) (res *notice.ViewRes, err error) { data, err := service.AdminNotice().View(ctx, adminin.NoticeViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res notice.ViewRes + res = new(notice.ViewRes) res.NoticeViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (*notice.ListRes, error) { - - var ( - in adminin.NoticeListInp - res notice.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { +func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (res *notice.ListRes, err error) { + var in adminin.NoticeListInp + if err = gconv.Scan(req, &in); err != nil { return nil, err } @@ -90,24 +81,123 @@ func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (*notice.ListRe return nil, err } + res = new(notice.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cNotice) Status(ctx context.Context, req *notice.StatusReq) (res *notice.StatusRes, err error) { - var in adminin.NoticeStatusInp if err = gconv.Scan(req, &in); err != nil { return nil, err } - if err = service.AdminNotice().Status(ctx, in); err != nil { + + err = service.AdminNotice().Status(ctx, in) + return +} + +// Notify 更新通知 +func (c *cNotice) Notify(ctx context.Context, req *notice.EditNotifyReq) (res *notice.EditNotifyRes, err error) { + var in adminin.NoticeEditInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + in.Type = consts.NoticeTypeNotify + in.Receiver = req.Receiver + err = service.AdminNotice().Edit(ctx, in) + return +} + +// Notice 更新公告 +func (c *cNotice) Notice(ctx context.Context, req *notice.EditNoticeReq) (res *notice.EditNoticeRes, err error) { + var in adminin.NoticeEditInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + in.Type = consts.NoticeTypeNotice + in.Receiver = req.Receiver + err = service.AdminNotice().Edit(ctx, in) + return +} + +// Letter 更新私信 +func (c *cNotice) Letter(ctx context.Context, req *notice.EditLetterReq) (res *notice.EditLetterRes, err error) { + var in adminin.NoticeEditInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + in.Type = consts.NoticeTypeLetter + in.Receiver = req.Receiver + err = service.AdminNotice().Edit(ctx, in) + return +} + +// UpRead 更新已读 +func (c *cNotice) UpRead(ctx context.Context, req *notice.UpReadReq) (res *notice.UpReadRes, err error) { + var in adminin.NoticeUpReadInp + if err = gconv.Scan(req, &in); err != nil { return nil, err } + err = service.AdminNotice().UpRead(ctx, in) return res, nil } + +// PullMessages 拉取未读消息列表 +func (c *cNotice) PullMessages(ctx context.Context, req *notice.PullMessagesReq) (res *notice.PullMessagesRes, err error) { + var in adminin.PullMessagesInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + if in.Limit == 0 { + in.Limit = 100 + } + + data, err := service.AdminNotice().PullMessages(ctx, in) + if err != nil { + return + } + + res = new(notice.PullMessagesRes) + res.PullMessagesModel = data + return +} + +// ReadAll 全部已读 +func (c *cNotice) ReadAll(ctx context.Context, req *notice.ReadAllReq) (res *notice.ReadAllRes, err error) { + var in adminin.NoticeReadAllInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.AdminNotice().ReadAll(ctx, in) + return +} + +// MessageList 我的消息列表 +func (c *cNotice) MessageList(ctx context.Context, req *notice.MessageListReq) (res *notice.MessageListRes, err error) { + var in adminin.NoticeMessageListInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + list, totalCount, err := service.AdminNotice().MessageList(ctx, in) + if err != nil { + return + } + + res = new(notice.MessageListRes) + res.List = list + res.PageCount = form.CalPageCount(totalCount, req.PerPage) + res.Page = req.Page + res.PerPage = req.PerPage + return +} diff --git a/server/internal/controller/backend/admin/post.go b/server/internal/controller/backend/admin/post.go index 1f463ab..e1a4bd4 100644 --- a/server/internal/controller/backend/admin/post.go +++ b/server/internal/controller/backend/admin/post.go @@ -24,117 +24,99 @@ type cPost struct{} func (c *cPost) Delete(ctx context.Context, req *post.DeleteReq) (res *post.DeleteRes, err error) { var in adminin.PostDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminPost().Delete(ctx, in); err != nil { - return nil, err + return } + + err = service.AdminPost().Delete(ctx, in) return res, nil } // Edit 修改/新增 func (c *cPost) Edit(ctx context.Context, req *post.EditReq) (res *post.EditRes, err error) { - var in adminin.PostEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminPost().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.AdminPost().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (*post.MaxSortRes, error) { - +func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (res *post.MaxSortRes, err error) { data, err := service.AdminPost().MaxSort(ctx, adminin.PostMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res post.MaxSortRes + res = new(post.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // NameUnique 名称是否唯一 -func (c *cPost) NameUnique(ctx context.Context, req *post.NameUniqueReq) (*post.NameUniqueRes, error) { - +func (c *cPost) NameUnique(ctx context.Context, req *post.NameUniqueReq) (res *post.NameUniqueRes, err error) { data, err := service.AdminPost().NameUnique(ctx, adminin.PostNameUniqueInp{Id: req.Id, Name: req.Name}) if err != nil { - return nil, err + return } - var res post.NameUniqueRes + res = new(post.NameUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // CodeUnique 编码是否唯一 -func (c *cPost) CodeUnique(ctx context.Context, req *post.CodeUniqueReq) (*post.CodeUniqueRes, error) { - +func (c *cPost) CodeUnique(ctx context.Context, req *post.CodeUniqueReq) (res *post.CodeUniqueRes, err error) { data, err := service.AdminPost().CodeUnique(ctx, adminin.PostCodeUniqueInp{Id: req.Id, Code: req.Code}) if err != nil { return nil, err } - var res post.CodeUniqueRes + res = new(post.CodeUniqueRes) res.IsUnique = data.IsUnique - return &res, nil + return } // View 获取指定信息 -func (c *cPost) View(ctx context.Context, req *post.ViewReq) (*post.ViewRes, error) { - +func (c *cPost) View(ctx context.Context, req *post.ViewReq) (res *post.ViewRes, err error) { data, err := service.AdminPost().View(ctx, adminin.PostViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res post.ViewRes + res = new(post.ViewRes) res.PostViewModel = data - return &res, nil + return } // List 获取列表 -func (c *cPost) List(ctx context.Context, req *post.ListReq) (*post.ListRes, error) { +func (c *cPost) List(ctx context.Context, req *post.ListReq) (res *post.ListRes, err error) { var in adminin.PostListInp - if err := gconv.Scan(req, &in); err != nil { - return nil, err - } - //adminin.PostListInp{ - // Page: req.Page, - // PerPage: req.PerPage, - // Name: req.Name, - // Code: req.Code, - // Status: req.Status, - //} - list, totalCount, err := service.AdminPost().List(ctx, in) - if err != nil { - return nil, err + if err = gconv.Scan(req, &in); err != nil { + return } - var res post.ListRes + list, totalCount, err := service.AdminPost().List(ctx, in) + if err != nil { + return + } + + res = new(post.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新状态 func (c *cPost) Status(ctx context.Context, req *post.StatusReq) (res *post.StatusRes, err error) { - var in adminin.PostStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.AdminPost().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.AdminPost().Status(ctx, in) + return } diff --git a/server/internal/controller/backend/admin/role.go b/server/internal/controller/backend/admin/role.go index 78c4782..f0aaf4b 100644 --- a/server/internal/controller/backend/admin/role.go +++ b/server/internal/controller/backend/admin/role.go @@ -22,73 +22,61 @@ var ( type cRole struct{} -// RoleMemberList 获取角色下的会员列表 -func (c *cRole) RoleMemberList(ctx context.Context, req *role.MemberListReq) (*role.MemberListRes, error) { - +// RoleMemberList 获取角色下的用户列表 +func (c *cRole) RoleMemberList(ctx context.Context, req *role.MemberListReq) (res *role.MemberListRes, err error) { var in adminin.RoleMemberListInp - if err := gconv.Scan(req, &in); err != nil { - return nil, err + if err = gconv.Scan(req, &in); err != nil { + return } + list, totalCount, err := service.AdminMember().RoleMemberList(ctx, in) if err != nil { - return nil, err + return } - var res role.MemberListRes + res = new(role.MemberListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.PerPage = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // List 获取列表 -func (c *cRole) List(ctx context.Context, req *role.ListReq) (*role.ListRes, error) { +func (c *cRole) List(ctx context.Context, req *role.ListReq) (res *role.ListRes, err error) { var in adminin.RoleListInp - if err := gconv.Scan(req, &in); err != nil { - return nil, err - } - list, totalCount, err := service.AdminRole().List(ctx, in) - if err != nil { - return nil, err + if err = gconv.Scan(req, &in); err != nil { + return } - var res role.ListRes + list, totalCount, err := service.AdminRole().List(ctx, in) + if err != nil { + return + } + + res = new(role.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Edit 修改角色 func (c *cRole) Edit(ctx context.Context, req *role.EditReq) (res *role.EditRes, err error) { err = service.AdminRole().Edit(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // Delete 删除 func (c *cRole) Delete(ctx context.Context, req *role.DeleteReq) (res *role.DeleteRes, err error) { - - if err = service.AdminRole().Delete(ctx, req); err != nil { - return nil, err - } - return res, nil + err = service.AdminRole().Delete(ctx, req) + return } // Dynamic 动态路由 func (c *cRole) Dynamic(ctx context.Context, req *role.DynamicReq) (res role.DynamicRes, err error) { - - res, err = service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx)) - if err != nil { - return res, err - } - return res, nil + return service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx)) } // GetPermissions 获取指定角色权限 @@ -97,23 +85,21 @@ func (c *cRole) GetPermissions(ctx context.Context, req *role.GetPermissionsReq) if err != nil { return nil, err } + res = &role.GetPermissionsRes{ MenuIds: []int64{}, } + if MenuIds != nil { res.MenuIds = MenuIds } - return res, nil } // UpdatePermissions 修改角色菜单权限 func (c *cRole) UpdatePermissions(ctx context.Context, req *role.UpdatePermissionsReq) (res *role.UpdatePermissionsRes, err error) { err = service.AdminRole().UpdatePermissions(ctx, req) - if err != nil { - return nil, err - } - return res, nil + return } // DataScopeSelect 获取数据权限选项 @@ -121,21 +107,17 @@ func (c *cRole) DataScopeSelect(ctx context.Context, req *role.DataScopeSelectRe data := service.AdminRole().DataScopeSelect(ctx) res = new(role.DataScopeSelectRes) res.List = data - return res, nil + return } // DataScopeEdit 获取数据权限选项 func (c *cRole) DataScopeEdit(ctx context.Context, req *role.DataScopeEditReq) (res *role.DataScopeEditRes, err error) { var in adminin.DataScopeEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } in.CustomDept = req.CustomDept err = service.AdminRole().DataScopeEdit(ctx, &in) - if err != nil { - return nil, err - } - - return res, nil + return } diff --git a/server/internal/controller/backend/admin/test.go b/server/internal/controller/backend/admin/test.go index c936db9..5384a53 100644 --- a/server/internal/controller/backend/admin/test.go +++ b/server/internal/controller/backend/admin/test.go @@ -26,16 +26,16 @@ type cTest struct{} func (c *cTest) List(ctx context.Context, req *test.ListReq) (res *test.ListRes, err error) { var in adminin.TestListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } list, totalCount, err := service.AdminTest().List(ctx, in) if err != nil { - return nil, err + return } res = new(test.ListRes) @@ -43,102 +43,93 @@ func (c *cTest) List(ctx context.Context, req *test.ListReq) (res *test.ListRes, res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - return res, nil + return } // Export 导出列表 func (c *cTest) Export(ctx context.Context, req *test.ExportReq) (res *test.ExportRes, err error) { var in adminin.TestListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminTest().Export(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.AdminTest().Export(ctx, in) + return } // Edit 更新 func (c *cTest) Edit(ctx context.Context, req *test.EditReq) (res *test.EditRes, err error) { var in adminin.TestEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.AdminTest().Edit(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.AdminTest().Edit(ctx, in) + return } // MaxSort 最大排序 func (c *cTest) MaxSort(ctx context.Context, req *test.MaxSortReq) (res *test.MaxSortRes, err error) { data, err := service.AdminTest().MaxSort(ctx, adminin.TestMaxSortInp{}) if err != nil { - return nil, err + return } res = new(test.MaxSortRes) res.TestMaxSortModel = data - return res, nil + return } // View 获取指定信息 func (c *cTest) View(ctx context.Context, req *test.ViewReq) (res *test.ViewRes, err error) { var in adminin.TestViewInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } data, err := service.AdminTest().View(ctx, in) if err != nil { - return nil, err + return } res = new(test.ViewRes) res.TestViewModel = data - return res, nil + return } // Delete 删除 func (c *cTest) Delete(ctx context.Context, req *test.DeleteReq) (res *test.DeleteRes, err error) { var in adminin.TestDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminTest().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.AdminTest().Delete(ctx, in) + return } // Status 更新状态 func (c *cTest) Status(ctx context.Context, req *test.StatusReq) (res *test.StatusRes, err error) { var in adminin.TestStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminTest().Status(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.AdminTest().Status(ctx, in) + return } // Switch 更新开关状态 func (c *cTest) Switch(ctx context.Context, req *test.SwitchReq) (res *test.SwitchRes, err error) { var in adminin.TestSwitchInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.AdminTest().Switch(ctx, in); err != nil { - return nil, err - } - - return res, nil + err = service.AdminTest().Switch(ctx, in) + return } diff --git a/server/internal/controller/backend/common/console.go b/server/internal/controller/backend/common/console.go index 61f2a34..b0e43b1 100644 --- a/server/internal/controller/backend/common/console.go +++ b/server/internal/controller/backend/common/console.go @@ -37,6 +37,5 @@ func (c *cConsole) Stat(ctx context.Context, req *common.ConsoleStatReq) (res *c res.Volume.Rise = 40202 res.Volume.Decline = 45003 res.Volume.Amount = 49004 - return } diff --git a/server/internal/controller/backend/common/ems.go b/server/internal/controller/backend/common/ems.go index d0862e6..b4afe26 100644 --- a/server/internal/controller/backend/common/ems.go +++ b/server/internal/controller/backend/common/ems.go @@ -8,8 +8,13 @@ package common import ( "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" "hotgo/api/backend/common" - "hotgo/internal/library/ems" + "hotgo/internal/consts" + "hotgo/internal/library/contexts" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/sysin" "hotgo/internal/service" ) @@ -19,14 +24,56 @@ type cEms struct{} // SendTest 发送测试邮件 func (c *cEms) SendTest(ctx context.Context, req *common.SendTestEmailReq) (res *common.SendTestEmailRes, err error) { + err = service.SysEmsLog().Send(ctx, sysin.SendEmsInp{ + Event: consts.EmsTemplateText, + Email: req.To, + Content: ` + + + + + 这是一封来自HotGo的测试邮件 + + + 这是您通过HotGo后台发送的测试邮件。当你收到这封邮件的时候,说明已经联调成功了,恭喜你! + + `, + }) + return +} - conf, err := service.SysConfig().GetSmtp(ctx) +// SendBindEms 发送换绑邮件 +func (c *cSms) SendBindEms(ctx context.Context, req *common.SendBindEmsReq) (res *common.SendBindEmsRes, err error) { + var ( + memberId = contexts.GetUserId(ctx) + models *entity.AdminMember + ) + if memberId <= 0 { + err = gerror.New("用户身份异常,请重新登录!") + return + } + + err = g.Model("admin_member"). + Fields("email"). + Where("id", memberId). + Scan(&models) if err != nil { return } - if err = ems.SendTestMail(conf, req.To); err != nil { - return nil, err + if models == nil { + err = gerror.New("用户信息不存在") + return } + + if models.Email == "" { + err = gerror.New("未绑定邮箱无需发送") + return + } + + err = service.SysEmsLog().Send(ctx, sysin.SendEmsInp{ + Event: consts.EmsTemplateBind, + Email: models.Email, + }) return } diff --git a/server/internal/controller/backend/common/site.go b/server/internal/controller/backend/common/site.go index cd20107..6e4b20b 100644 --- a/server/internal/controller/backend/common/site.go +++ b/server/internal/controller/backend/common/site.go @@ -70,7 +70,7 @@ func (c *cSite) Captcha(ctx context.Context, req *common.LoginCaptchaReq) (res * func (c *cSite) Login(ctx context.Context, req *common.LoginReq) (res *common.LoginRes, err error) { var in adminin.MemberLoginInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } defer func() { @@ -89,33 +89,23 @@ func (c *cSite) Login(ctx context.Context, req *common.LoginReq) (res *common.Lo model, err := service.AdminMember().Login(ctx, in) if err != nil { - return nil, err + return } - if err = gconv.Scan(model, &res); err != nil { - return nil, err - } + err = gconv.Scan(model, &res) return } // Logout 注销登录 func (c *cSite) Logout(ctx context.Context, req *common.LoginLogoutReq) (res *common.LoginLogoutRes, err error) { - - var authorization = jwt.GetAuthorization(ghttp.RequestFromCtx(ctx)) - - // 获取jwtToken - jwtToken := consts.RedisJwtToken + gmd5.MustEncryptString(authorization) - if len(jwtToken) == 0 { + token := consts.RedisJwtToken + gmd5.MustEncryptString(jwt.GetAuthorization(ghttp.RequestFromCtx(ctx))) + if len(token) == 0 { err = gerror.New("当前用户未登录!") return res, err } // 删除登录token ca := cache.New() - _, err = ca.Remove(ctx, jwtToken) - if err != nil { - return res, err - } - + _, err = ca.Remove(ctx, token) return } diff --git a/server/internal/controller/backend/common/sms.go b/server/internal/controller/backend/common/sms.go index 7d990f4..e8b5044 100644 --- a/server/internal/controller/backend/common/sms.go +++ b/server/internal/controller/backend/common/sms.go @@ -8,8 +8,13 @@ package common import ( "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" "hotgo/api/backend/common" + "hotgo/internal/consts" + "hotgo/internal/library/contexts" + "hotgo/internal/model/entity" "hotgo/internal/model/input/sysin" "hotgo/internal/service" "hotgo/utility/validate" @@ -23,15 +28,50 @@ type cSms struct{} func (c *cSms) SendTest(ctx context.Context, req *common.SendTestSmsReq) (res *common.SendTestSmsRes, err error) { var in sysin.SendCodeInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.SysSmsLog().SendCode(ctx, in); err != nil { - return nil, err - } + err = service.SysSmsLog().SendCode(ctx, in) + return +} + +// SendBindSms 发送换绑短信 +func (c *cSms) SendBindSms(ctx context.Context, req *common.SendBindSmsReq) (res *common.SendBindSmsRes, err error) { + var ( + memberId = contexts.GetUserId(ctx) + models *entity.AdminMember + ) + + if memberId <= 0 { + err = gerror.New("用户身份异常,请重新登录!") + return + } + + err = g.Model("admin_member"). + Fields("mobile"). + Where("id", memberId). + Scan(&models) + if err != nil { + return + } + + if models == nil { + err = gerror.New("用户信息不存在") + return + } + + if models.Mobile == "" { + err = gerror.New("未绑定手机号无需发送") + return + } + + err = service.SysSmsLog().SendCode(ctx, sysin.SendCodeInp{ + Event: consts.SmsTemplateBind, + Mobile: models.Mobile, + }) return } diff --git a/server/internal/controller/backend/common/upload.go b/server/internal/controller/backend/common/upload.go index 167bb69..f3f906b 100644 --- a/server/internal/controller/backend/common/upload.go +++ b/server/internal/controller/backend/common/upload.go @@ -20,34 +20,22 @@ type cUpload struct{} // UploadImage 上传图片 func (c *cUpload) UploadImage(ctx context.Context, req *common.UploadImageReq) (res common.UploadImageRes, err error) { - r := g.RequestFromCtx(ctx) - file := r.GetUploadFile("file") + file := g.RequestFromCtx(ctx).GetUploadFile("file") if file == nil { err = gerror.New("没有找到上传的文件") return } - res, err = service.CommonUpload().UploadImage(ctx, file) - if err != nil { - return - } - - return + return service.CommonUpload().UploadImage(ctx, file) } // UploadFile 上传附件 func (c *cUpload) UploadFile(ctx context.Context, req *common.UploadFileReq) (res common.UploadFileRes, err error) { - r := g.RequestFromCtx(ctx) - file := r.GetUploadFile("file") + file := g.RequestFromCtx(ctx).GetUploadFile("file") if file == nil { err = gerror.New("没有找到上传的文件") return } - res, err = service.CommonUpload().UploadFile(ctx, file) - if err != nil { - return - } - - return + return service.CommonUpload().UploadFile(ctx, file) } diff --git a/server/internal/controller/backend/sys/attachment.go b/server/internal/controller/backend/sys/attachment.go index dbef948..da7f0c4 100644 --- a/server/internal/controller/backend/sys/attachment.go +++ b/server/internal/controller/backend/sys/attachment.go @@ -25,89 +25,75 @@ type cAttachment struct{} func (c *cAttachment) Delete(ctx context.Context, req *attachment.DeleteReq) (res *attachment.DeleteRes, err error) { var in sysin.AttachmentDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysAttachment().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysAttachment().Delete(ctx, in) + return } // Edit 更新 func (c *cAttachment) Edit(ctx context.Context, req *attachment.EditReq) (res *attachment.EditRes, err error) { - var in sysin.AttachmentEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysAttachment().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysAttachment().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cAttachment) MaxSort(ctx context.Context, req *attachment.MaxSortReq) (*attachment.MaxSortRes, error) { - +func (c *cAttachment) MaxSort(ctx context.Context, req *attachment.MaxSortReq) (res *attachment.MaxSortRes, err error) { data, err := service.SysAttachment().MaxSort(ctx, sysin.AttachmentMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res attachment.MaxSortRes + res = new(attachment.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cAttachment) View(ctx context.Context, req *attachment.ViewReq) (*attachment.ViewRes, error) { - +func (c *cAttachment) View(ctx context.Context, req *attachment.ViewReq) (res *attachment.ViewRes, err error) { data, err := service.SysAttachment().View(ctx, sysin.AttachmentViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res attachment.ViewRes + res = new(attachment.ViewRes) res.AttachmentViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cAttachment) List(ctx context.Context, req *attachment.ListReq) (*attachment.ListRes, error) { - - var ( - in sysin.AttachmentListInp - res attachment.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cAttachment) List(ctx context.Context, req *attachment.ListReq) (res *attachment.ListRes, err error) { + var in sysin.AttachmentListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysAttachment().List(ctx, in) if err != nil { - return nil, err + return } + res = new(attachment.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cAttachment) Status(ctx context.Context, req *attachment.StatusReq) (res *attachment.StatusRes, err error) { - var in sysin.AttachmentStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysAttachment().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysAttachment().Status(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/blacklist.go b/server/internal/controller/backend/sys/blacklist.go index 9d308ff..4a6a6ca 100644 --- a/server/internal/controller/backend/sys/blacklist.go +++ b/server/internal/controller/backend/sys/blacklist.go @@ -25,89 +25,75 @@ type cBlacklist struct{} func (c *cBlacklist) Delete(ctx context.Context, req *blacklist.DeleteReq) (res *blacklist.DeleteRes, err error) { var in sysin.BlacklistDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysBlacklist().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysBlacklist().Delete(ctx, in) + return } // Edit 更新 func (c *cBlacklist) Edit(ctx context.Context, req *blacklist.EditReq) (res *blacklist.EditRes, err error) { - var in sysin.BlacklistEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysBlacklist().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysBlacklist().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cBlacklist) MaxSort(ctx context.Context, req *blacklist.MaxSortReq) (*blacklist.MaxSortRes, error) { - +func (c *cBlacklist) MaxSort(ctx context.Context, req *blacklist.MaxSortReq) (res *blacklist.MaxSortRes, err error) { data, err := service.SysBlacklist().MaxSort(ctx, sysin.BlacklistMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res blacklist.MaxSortRes + res = new(blacklist.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cBlacklist) View(ctx context.Context, req *blacklist.ViewReq) (*blacklist.ViewRes, error) { - +func (c *cBlacklist) View(ctx context.Context, req *blacklist.ViewReq) (res *blacklist.ViewRes, err error) { data, err := service.SysBlacklist().View(ctx, sysin.BlacklistViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res blacklist.ViewRes + res = new(blacklist.ViewRes) res.BlacklistViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cBlacklist) List(ctx context.Context, req *blacklist.ListReq) (*blacklist.ListRes, error) { - - var ( - in sysin.BlacklistListInp - res blacklist.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cBlacklist) List(ctx context.Context, req *blacklist.ListReq) (res *blacklist.ListRes, err error) { + var in sysin.BlacklistListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysBlacklist().List(ctx, in) if err != nil { - return nil, err + return } + res = new(blacklist.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cBlacklist) Status(ctx context.Context, req *blacklist.StatusReq) (res *blacklist.StatusRes, err error) { - var in sysin.BlacklistStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysBlacklist().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysBlacklist().Status(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/config.go b/server/internal/controller/backend/sys/config.go index e39937e..478c337 100644 --- a/server/internal/controller/backend/sys/config.go +++ b/server/internal/controller/backend/sys/config.go @@ -23,39 +23,26 @@ var ( type cConfig struct{} // GetConfig 获取指定分组的配置 -func (c *cConfig) GetConfig(ctx context.Context, req *config.GetReq) (*config.GetRes, error) { - var ( - in sysin.GetConfigInp - res config.GetRes - err error - ) +func (c *cConfig) GetConfig(ctx context.Context, req *config.GetReq) (res *config.GetRes, err error) { + var in sysin.GetConfigInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - res.GetConfigModel, err = service.SysConfig().GetConfigByGroup(ctx, in) - if err != nil { - return nil, err + return } - return &res, nil + res = new(config.GetRes) + res.GetConfigModel, err = service.SysConfig().GetConfigByGroup(ctx, in) + return } // UpdateConfig 更新指定分组的配置 -func (c *cConfig) UpdateConfig(ctx context.Context, req *config.UpdateReq) (*config.UpdateRes, error) { - var ( - in sysin.UpdateConfigInp - res config.UpdateRes - err error - ) +func (c *cConfig) UpdateConfig(ctx context.Context, req *config.UpdateReq) (res *config.UpdateRes, err error) { + var in sysin.UpdateConfigInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysConfig().UpdateConfigByGroup(ctx, in); err != nil { - return nil, err - } - - return &res, nil + err = service.SysConfig().UpdateConfigByGroup(ctx, in) + return } // TypeSelect 数据类型选项 diff --git a/server/internal/controller/backend/sys/cron.go b/server/internal/controller/backend/sys/cron.go index 8949443..33d8b84 100644 --- a/server/internal/controller/backend/sys/cron.go +++ b/server/internal/controller/backend/sys/cron.go @@ -26,91 +26,77 @@ type cCron struct{} func (c *cCron) Delete(ctx context.Context, req *cron.DeleteReq) (res *cron.DeleteRes, err error) { var in sysin.CronDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysCron().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysCron().Delete(ctx, in) + return } // Edit 更新 func (c *cCron) Edit(ctx context.Context, req *cron.EditReq) (res *cron.EditRes, err error) { - var in sysin.CronEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysCron().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysCron().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cCron) MaxSort(ctx context.Context, req *cron.MaxSortReq) (*cron.MaxSortRes, error) { - +func (c *cCron) MaxSort(ctx context.Context, req *cron.MaxSortReq) (res *cron.MaxSortRes, err error) { data, err := service.SysCron().MaxSort(ctx, sysin.CronMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res cron.MaxSortRes + res = new(cron.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cCron) View(ctx context.Context, req *cron.ViewReq) (*cron.ViewRes, error) { - +func (c *cCron) View(ctx context.Context, req *cron.ViewReq) (res *cron.ViewRes, err error) { data, err := service.SysCron().View(ctx, sysin.CronViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res cron.ViewRes + res = new(cron.ViewRes) res.CronViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cCron) List(ctx context.Context, req *cron.ListReq) (*cron.ListRes, error) { - - var ( - in sysin.CronListInp - res cron.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cCron) List(ctx context.Context, req *cron.ListReq) (res *cron.ListRes, err error) { + var in sysin.CronListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysCron().List(ctx, in) if err != nil { - return nil, err + return } + res = new(cron.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cCron) Status(ctx context.Context, req *cron.StatusReq) (res *cron.StatusRes, err error) { - var in sysin.CronStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysCron().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysCron().Status(ctx, in) + return } // OnlineExec 在线执行 @@ -121,7 +107,7 @@ func (c *cCron) OnlineExec(ctx context.Context, req *cron.OnlineExecReq) (res *c var in sysin.OnlineExecInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } return res, service.SysCron().OnlineExec(ctx, in) diff --git a/server/internal/controller/backend/sys/cron_group.go b/server/internal/controller/backend/sys/cron_group.go index bda2a4b..a93a0fa 100644 --- a/server/internal/controller/backend/sys/cron_group.go +++ b/server/internal/controller/backend/sys/cron_group.go @@ -25,90 +25,76 @@ type cCronGroup struct{} func (c *cCronGroup) Delete(ctx context.Context, req *cron.GroupDeleteReq) (res *cron.GroupDeleteRes, err error) { var in sysin.CronGroupDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysCronGroup().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysCronGroup().Delete(ctx, in) + return } // Edit 更新 func (c *cCronGroup) Edit(ctx context.Context, req *cron.GroupEditReq) (res *cron.GroupEditRes, err error) { - var in sysin.CronGroupEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysCronGroup().Edit(ctx, in); err != nil { - return nil, err + return } + err = service.SysCronGroup().Edit(ctx, in) return res, nil } // MaxSort 最大排序 -func (c *cCronGroup) MaxSort(ctx context.Context, req *cron.GroupMaxSortReq) (*cron.GroupMaxSortRes, error) { - +func (c *cCronGroup) MaxSort(ctx context.Context, req *cron.GroupMaxSortReq) (res *cron.GroupMaxSortRes, err error) { data, err := service.SysCronGroup().MaxSort(ctx, sysin.CronGroupMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res cron.GroupMaxSortRes + res = new(cron.GroupMaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cCronGroup) View(ctx context.Context, req *cron.GroupViewReq) (*cron.GroupViewRes, error) { - +func (c *cCronGroup) View(ctx context.Context, req *cron.GroupViewReq) (res *cron.GroupViewRes, err error) { data, err := service.SysCronGroup().View(ctx, sysin.CronGroupViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res cron.GroupViewRes + res = new(cron.GroupViewRes) res.CronGroupViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cCronGroup) List(ctx context.Context, req *cron.GroupListReq) (*cron.GroupListRes, error) { - - var ( - in sysin.CronGroupListInp - res cron.GroupListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cCronGroup) List(ctx context.Context, req *cron.GroupListReq) (res *cron.GroupListRes, err error) { + var in sysin.CronGroupListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysCronGroup().List(ctx, in) if err != nil { - return nil, err + return } + res = new(cron.GroupListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } -// Status 更新部门状态 +// Status 更新状态 func (c *cCronGroup) Status(ctx context.Context, req *cron.GroupStatusReq) (res *cron.GroupStatusRes, err error) { - var in sysin.CronGroupStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysCronGroup().Status(ctx, in); err != nil { - return nil, err + return } + err = service.SysCronGroup().Status(ctx, in) return res, nil } @@ -116,9 +102,9 @@ func (c *cCronGroup) Status(ctx context.Context, req *cron.GroupStatusReq) (res func (c *cCronGroup) Select(ctx context.Context, req *cron.GroupSelectReq) (res *cron.GroupSelectRes, err error) { list, err := service.SysCronGroup().Select(ctx, sysin.CronGroupSelectInp{}) if err != nil { - return nil, err + return } - res = (*cron.GroupSelectRes)(&list) - return res, nil + res = (*cron.GroupSelectRes)(&list) + return } diff --git a/server/internal/controller/backend/sys/curd_demo.go b/server/internal/controller/backend/sys/curd_demo.go index 6f48515..2708162 100644 --- a/server/internal/controller/backend/sys/curd_demo.go +++ b/server/internal/controller/backend/sys/curd_demo.go @@ -3,8 +3,8 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.1.0 -// @AutoGenerate Date 2023-01-18 15:19:42 +// @AutoGenerate Version 2.1.2 +// @AutoGenerate Date 2023-02-08 17:47:32 // package sys @@ -164,6 +164,5 @@ func (c *cCurdDemo) Switch(ctx context.Context, req *curddemo.SwitchReq) (res *c if err = service.SysCurdDemo().Switch(ctx, in); err != nil { return nil, err } - return res, nil } diff --git a/server/internal/controller/backend/sys/dict_data.go b/server/internal/controller/backend/sys/dict_data.go index bf89527..b0506bc 100644 --- a/server/internal/controller/backend/sys/dict_data.go +++ b/server/internal/controller/backend/sys/dict_data.go @@ -25,75 +25,63 @@ type cDictData struct{} func (c *cDictData) Delete(ctx context.Context, req *dict.DataDeleteReq) (res *dict.DataDeleteRes, err error) { var in sysin.DictDataDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysDictData().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysDictData().Delete(ctx, in) + return } // Edit 更新 func (c *cDictData) Edit(ctx context.Context, req *dict.DataEditReq) (res *dict.DataEditRes, err error) { - var in sysin.DictDataEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysDictData().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysDictData().Edit(ctx, in) + return } // List 查看列表 -func (c *cDictData) List(ctx context.Context, req *dict.DataListReq) (*dict.DataListRes, error) { - var ( - in sysin.DictDataListInp - res dict.DataListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cDictData) List(ctx context.Context, req *dict.DataListReq) (res *dict.DataListRes, err error) { + var in sysin.DictDataListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysDictData().List(ctx, in) if err != nil { - return nil, err + return } + res = new(dict.DataListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Select 指定选项 -func (c *cDictData) Select(ctx context.Context, req *dict.DataSelectReq) (*dict.DataSelectRes, error) { - var ( - in sysin.DataSelectInp - res dict.DataSelectRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cDictData) Select(ctx context.Context, req *dict.DataSelectReq) (res dict.DataSelectRes, err error) { + var in sysin.DataSelectInp + if err = gconv.Scan(req, &in); err != nil { + return } list, err := service.SysDictData().Select(ctx, in) if err != nil { - return nil, err + return } res = dict.DataSelectRes(list) - return &res, nil + return } // Selects 多个选项 -func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (*dict.DataSelectsRes, error) { - res := make(dict.DataSelectsRes) +func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (res dict.DataSelectsRes, err error) { + res = make(dict.DataSelectsRes) for _, v := range req.Types { option, err := service.SysDictData().Select(ctx, sysin.DataSelectInp{Type: v}) if err != nil { @@ -102,5 +90,5 @@ func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (*dic res[v] = option } - return &res, nil + return } diff --git a/server/internal/controller/backend/sys/dict_type.go b/server/internal/controller/backend/sys/dict_type.go index 4af4d8a..9def22c 100644 --- a/server/internal/controller/backend/sys/dict_type.go +++ b/server/internal/controller/backend/sys/dict_type.go @@ -21,52 +21,41 @@ var ( type cDictType struct{} // Tree 树 -func (c *cDictType) Tree(ctx context.Context, req *dict.TypeTreeReq) (*dict.TypeTreeRes, error) { - var ( - res dict.TypeTreeRes - err error - ) +func (c *cDictType) Tree(ctx context.Context, req *dict.TypeTreeReq) (res *dict.TypeTreeRes, err error) { + res = new(dict.TypeTreeRes) res.List, err = service.SysDictType().Tree(ctx) - if err != nil { - return nil, err - } - - return &res, nil + return } // Delete 删除 func (c *cDictType) Delete(ctx context.Context, req *dict.TypeDeleteReq) (res *dict.TypeDeleteRes, err error) { var in sysin.DictTypeDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysDictType().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysDictType().Delete(ctx, in) + return } // Edit 更新 func (c *cDictType) Edit(ctx context.Context, req *dict.TypeEditReq) (res *dict.TypeEditRes, err error) { - var in sysin.DictTypeEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysDictType().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysDictType().Edit(ctx, in) + return } // Select 选项 func (c *cDictType) Select(ctx context.Context, req *dict.TypeSelectReq) (res *dict.TypeSelectRes, err error) { list, err := service.SysDictType().Select(ctx, sysin.DictTypeSelectInp{}) if err != nil { - return nil, err + return } - res = (*dict.TypeSelectRes)(&list) - return res, nil + res = (*dict.TypeSelectRes)(&list) + return } diff --git a/server/internal/controller/backend/sys/ems_log.go b/server/internal/controller/backend/sys/ems_log.go new file mode 100644 index 0000000..6724795 --- /dev/null +++ b/server/internal/controller/backend/sys/ems_log.go @@ -0,0 +1,87 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2022 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// +package sys + +import ( + "context" + "github.com/gogf/gf/v2/util/gconv" + "hotgo/api/backend/emslog" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" + "hotgo/internal/service" +) + +var ( + EmsLog = cEmsLog{} +) + +type cEmsLog struct{} + +// Delete 删除 +func (c *cEmsLog) Delete(ctx context.Context, req *emslog.DeleteReq) (res *emslog.DeleteRes, err error) { + var in sysin.EmsLogDeleteInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.SysEmsLog().Delete(ctx, in) + return +} + +// Edit 更新 +func (c *cEmsLog) Edit(ctx context.Context, req *emslog.EditReq) (res *emslog.EditRes, err error) { + var in sysin.EmsLogEditInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.SysEmsLog().Edit(ctx, in) + return +} + +// View 获取指定信息 +func (c *cEmsLog) View(ctx context.Context, req *emslog.ViewReq) (res *emslog.ViewRes, err error) { + data, err := service.SysEmsLog().View(ctx, sysin.EmsLogViewInp{Id: req.Id}) + if err != nil { + return + } + + res = new(emslog.ViewRes) + res.EmsLogViewModel = data + return +} + +// List 查看列表 +func (c *cEmsLog) List(ctx context.Context, req *emslog.ListReq) (res *emslog.ListRes, err error) { + var in sysin.EmsLogListInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + list, totalCount, err := service.SysEmsLog().List(ctx, in) + if err != nil { + return + } + + res = new(emslog.ListRes) + res.List = list + res.PageCount = form.CalPageCount(totalCount, req.PerPage) + res.Page = req.Page + res.PerPage = req.PerPage + return +} + +// Status 更新部门状态 +func (c *cEmsLog) Status(ctx context.Context, req *emslog.StatusReq) (res *emslog.StatusRes, err error) { + var in sysin.EmsLogStatusInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + err = service.SysEmsLog().Status(ctx, in) + return +} diff --git a/server/internal/controller/backend/sys/gen_codes.go b/server/internal/controller/backend/sys/gen_codes.go index cb7fda4..b837f30 100644 --- a/server/internal/controller/backend/sys/gen_codes.go +++ b/server/internal/controller/backend/sys/gen_codes.go @@ -25,184 +25,159 @@ type cGenCodes struct{} func (c *cGenCodes) Delete(ctx context.Context, req *gencodes.DeleteReq) (res *gencodes.DeleteRes, err error) { var in sysin.GenCodesDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysGenCodes().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysGenCodes().Delete(ctx, in) + return } // Edit 更新 func (c *cGenCodes) Edit(ctx context.Context, req *gencodes.EditReq) (res *gencodes.EditRes, err error) { - var in sysin.GenCodesEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } + data, err := service.SysGenCodes().Edit(ctx, in) if err != nil { - return nil, err + return } + res = new(gencodes.EditRes) res.GenCodesEditModel = data - return res, nil + return } // MaxSort 最大排序 -func (c *cGenCodes) MaxSort(ctx context.Context, req *gencodes.MaxSortReq) (*gencodes.MaxSortRes, error) { - +func (c *cGenCodes) MaxSort(ctx context.Context, req *gencodes.MaxSortReq) (res *gencodes.MaxSortRes, err error) { data, err := service.SysGenCodes().MaxSort(ctx, sysin.GenCodesMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res gencodes.MaxSortRes + res = new(gencodes.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cGenCodes) View(ctx context.Context, req *gencodes.ViewReq) (*gencodes.ViewRes, error) { - +func (c *cGenCodes) View(ctx context.Context, req *gencodes.ViewReq) (res *gencodes.ViewRes, err error) { data, err := service.SysGenCodes().View(ctx, sysin.GenCodesViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res gencodes.ViewRes + res = new(gencodes.ViewRes) res.GenCodesViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cGenCodes) List(ctx context.Context, req *gencodes.ListReq) (*gencodes.ListRes, error) { - - var ( - in sysin.GenCodesListInp - res gencodes.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cGenCodes) List(ctx context.Context, req *gencodes.ListReq) (res *gencodes.ListRes, err error) { + var in sysin.GenCodesListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysGenCodes().List(ctx, in) if err != nil { - return nil, err + return } + res = new(gencodes.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cGenCodes) Status(ctx context.Context, req *gencodes.StatusReq) (res *gencodes.StatusRes, err error) { - var in sysin.GenCodesStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysGenCodes().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysGenCodes().Status(ctx, in) + return } // Selects 获取指定信息 -func (c *cGenCodes) Selects(ctx context.Context, req *gencodes.SelectsReq) (*gencodes.SelectsRes, error) { +func (c *cGenCodes) Selects(ctx context.Context, req *gencodes.SelectsReq) (res *gencodes.SelectsRes, err error) { data, err := service.SysGenCodes().Selects(ctx, sysin.GenCodesSelectsInp{}) if err != nil { - return nil, err + return } - var res gencodes.SelectsRes + res = new(gencodes.SelectsRes) res.GenCodesSelectsModel = data - return &res, nil + return } // TableSelect 数据库表选项 -func (c *cGenCodes) TableSelect(ctx context.Context, req *gencodes.TableSelectReq) (*gencodes.TableSelectRes, error) { +func (c *cGenCodes) TableSelect(ctx context.Context, req *gencodes.TableSelectReq) (res *gencodes.TableSelectRes, err error) { data, err := service.SysGenCodes().TableSelect(ctx, sysin.GenCodesTableSelectInp{Name: req.Name}) if err != nil { - return nil, err + return } - var res gencodes.TableSelectRes - res = data - return &res, nil + res = (*gencodes.TableSelectRes)(&data) + return } // ColumnSelect 表字段选项 -func (c *cGenCodes) ColumnSelect(ctx context.Context, req *gencodes.ColumnSelectReq) (*gencodes.ColumnSelectRes, error) { +func (c *cGenCodes) ColumnSelect(ctx context.Context, req *gencodes.ColumnSelectReq) (res *gencodes.ColumnSelectRes, err error) { data, err := service.SysGenCodes().ColumnSelect(ctx, sysin.GenCodesColumnSelectInp{Name: req.Name, Table: req.Table}) if err != nil { - return nil, err + return } - var res gencodes.ColumnSelectRes - res = data - return &res, nil + res = (*gencodes.ColumnSelectRes)(&data) + return } // ColumnList 表字段列表 -func (c *cGenCodes) ColumnList(ctx context.Context, req *gencodes.ColumnListReq) (*gencodes.ColumnListRes, error) { - var ( - in sysin.GenCodesColumnListInp - err error - ) +func (c *cGenCodes) ColumnList(ctx context.Context, req *gencodes.ColumnListReq) (res *gencodes.ColumnListRes, err error) { + var in sysin.GenCodesColumnListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } data, err := service.SysGenCodes().ColumnList(ctx, in) if err != nil { - return nil, err + return } - var res gencodes.ColumnListRes - res = data - return &res, nil + res = (*gencodes.ColumnListRes)(&data) + return } // Preview 生成预览 -func (c *cGenCodes) Preview(ctx context.Context, req *gencodes.PreviewReq) (*gencodes.PreviewRes, error) { - var ( - in sysin.GenCodesPreviewInp - err error - ) +func (c *cGenCodes) Preview(ctx context.Context, req *gencodes.PreviewReq) (res *gencodes.PreviewRes, err error) { + var in sysin.GenCodesPreviewInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } data, err := service.SysGenCodes().Preview(ctx, in) if err != nil { - return nil, err + return } - res := new(gencodes.PreviewRes) + res = new(gencodes.PreviewRes) res.GenCodesPreviewModel = data - return res, nil + return } // Build 生成预览 -func (c *cGenCodes) Build(ctx context.Context, req *gencodes.BuildReq) (*gencodes.BuildRes, error) { - var ( - in sysin.GenCodesBuildInp - err error - ) +func (c *cGenCodes) Build(ctx context.Context, req *gencodes.BuildReq) (res *gencodes.BuildRes, err error) { + var in sysin.GenCodesBuildInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysGenCodes().Build(ctx, in); err != nil { - return nil, err - } - - return nil, nil + err = service.SysGenCodes().Build(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/log.go b/server/internal/controller/backend/sys/log.go index d0afd58..fcd4f9b 100644 --- a/server/internal/controller/backend/sys/log.go +++ b/server/internal/controller/backend/sys/log.go @@ -23,7 +23,7 @@ type sLog struct{} // Clear 清空日志 func (c *sLog) Clear(ctx context.Context, req *log.ClearReq) (res *log.ClearRes, err error) { - err = gerror.New("考虑安全,请到数据库清空") + err = gerror.New("暂时考虑到安全问题,请到数据库清空") return } @@ -31,58 +31,52 @@ func (c *sLog) Clear(ctx context.Context, req *log.ClearReq) (res *log.ClearRes, func (c *sLog) Export(ctx context.Context, req *log.ExportReq) (res *log.ExportRes, err error) { var in sysin.LogListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysLog().Export(ctx, in); err != nil { - return nil, err + return } + err = service.SysLog().Export(ctx, in) return } // List 获取访问日志列表 -func (c *sLog) List(ctx context.Context, req *log.ListReq) (*log.ListRes, error) { - var ( - in sysin.LogListInp - res log.ListRes - ) - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *sLog) List(ctx context.Context, req *log.ListReq) (res *log.ListRes, err error) { + var in sysin.LogListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysLog().List(ctx, in) if err != nil { - return nil, err + return } + res = new(log.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // View 获取指定信息 -func (c *sLog) View(ctx context.Context, req *log.ViewReq) (*log.ViewRes, error) { - var res log.ViewRes +func (c *sLog) View(ctx context.Context, req *log.ViewReq) (res *log.ViewRes, err error) { data, err := service.SysLog().View(ctx, sysin.LogViewInp{Id: req.Id}) if err != nil { - return nil, err + return } + res = new(log.ViewRes) res.LogViewModel = data - return &res, nil + return } // Delete 删除 func (c *sLog) Delete(ctx context.Context, req *log.DeleteReq) (res *log.DeleteRes, err error) { var in sysin.LogDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysLog().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysLog().Delete(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/login_log.go b/server/internal/controller/backend/sys/login_log.go index 0586398..2d82f69 100644 --- a/server/internal/controller/backend/sys/login_log.go +++ b/server/internal/controller/backend/sys/login_log.go @@ -28,16 +28,16 @@ type cLoginLog struct{} func (c *cLoginLog) List(ctx context.Context, req *loginlog.ListReq) (res *loginlog.ListRes, err error) { var in sysin.LoginLogListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } list, totalCount, err := service.SysLoginLog().List(ctx, in) if err != nil { - return nil, err + return } res = new(loginlog.ListRes) @@ -45,60 +45,56 @@ func (c *cLoginLog) List(ctx context.Context, req *loginlog.ListReq) (res *login res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - return res, nil + return } // Export 导出登录日志列表 func (c *cLoginLog) Export(ctx context.Context, req *loginlog.ExportReq) (res *loginlog.ExportRes, err error) { var in sysin.LoginLogListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.SysLoginLog().Export(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.SysLoginLog().Export(ctx, in) + return } // View 获取指定登录日志信息 func (c *cLoginLog) View(ctx context.Context, req *loginlog.ViewReq) (res *loginlog.ViewRes, err error) { var in sysin.LoginLogViewInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } data, err := service.SysLoginLog().View(ctx, in) if err != nil { - return nil, err + return } res = new(loginlog.ViewRes) res.LoginLogViewModel = data - return res, nil + return } // Delete 删除登录日志 func (c *cLoginLog) Delete(ctx context.Context, req *loginlog.DeleteReq) (res *loginlog.DeleteRes, err error) { var in sysin.LoginLogDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.SysLoginLog().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.SysLoginLog().Delete(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/provinces.go b/server/internal/controller/backend/sys/provinces.go index 9274cb0..f475977 100644 --- a/server/internal/controller/backend/sys/provinces.go +++ b/server/internal/controller/backend/sys/provinces.go @@ -10,6 +10,7 @@ import ( "context" "github.com/gogf/gf/v2/util/gconv" "hotgo/api/backend/provinces" + "hotgo/internal/library/location" "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" "hotgo/internal/service" @@ -22,140 +23,150 @@ var ( type cProvinces struct{} // Tree 关系树选项列表 -func (c *cProvinces) Tree(ctx context.Context, req *provinces.TreeReq) (*provinces.TreeRes, error) { - var ( - res provinces.TreeRes - err error - ) +func (c *cProvinces) Tree(ctx context.Context, req *provinces.TreeReq) (res *provinces.TreeRes, err error) { + res = new(provinces.TreeRes) res.List, err = service.SysProvinces().Tree(ctx) - if err != nil { - return nil, err - } - - return &res, nil + return } // Delete 删除 func (c *cProvinces) Delete(ctx context.Context, req *provinces.DeleteReq) (res *provinces.DeleteRes, err error) { var in sysin.ProvincesDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysProvinces().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysProvinces().Delete(ctx, in) + return } // Edit 更新 func (c *cProvinces) Edit(ctx context.Context, req *provinces.EditReq) (res *provinces.EditRes, err error) { var in sysin.ProvincesEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysProvinces().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysProvinces().Edit(ctx, in) + return } // MaxSort 最大排序 func (c *cProvinces) MaxSort(ctx context.Context, req *provinces.MaxSortReq) (res *provinces.MaxSortRes, err error) { data, err := service.SysProvinces().MaxSort(ctx, sysin.ProvincesMaxSortInp{}) if err != nil { - return nil, err + return } res = new(provinces.MaxSortRes) res.ProvincesMaxSortModel = data - return res, nil + return } // View 获取指定信息 -func (c *cProvinces) View(ctx context.Context, req *provinces.ViewReq) (*provinces.ViewRes, error) { +func (c *cProvinces) View(ctx context.Context, req *provinces.ViewReq) (res *provinces.ViewRes, err error) { data, err := service.SysProvinces().View(ctx, sysin.ProvincesViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res provinces.ViewRes + + res = new(provinces.ViewRes) res.ProvincesViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cProvinces) List(ctx context.Context, req *provinces.ListReq) (*provinces.ListRes, error) { - var ( - in sysin.ProvincesListInp - res provinces.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cProvinces) List(ctx context.Context, req *provinces.ListReq) (res *provinces.ListRes, err error) { + var in sysin.ProvincesListInp + if err = gconv.Scan(req, &in); err != nil { + return } + list, totalCount, err := service.SysProvinces().List(ctx, in) if err != nil { - return nil, err + return } + res = new(provinces.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cProvinces) Status(ctx context.Context, req *provinces.StatusReq) (res *provinces.StatusRes, err error) { var in sysin.ProvincesStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysProvinces().Status(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysProvinces().Status(ctx, in) + return } // ChildrenList 获取省市区下级列表 -func (c *cProvinces) ChildrenList(ctx context.Context, req *provinces.ChildrenListReq) (*provinces.ChildrenListRes, error) { - var ( - in sysin.ProvincesChildrenListInp - res provinces.ChildrenListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cProvinces) ChildrenList(ctx context.Context, req *provinces.ChildrenListReq) (res *provinces.ChildrenListRes, err error) { + var in sysin.ProvincesChildrenListInp + if err = gconv.Scan(req, &in); err != nil { + return } + list, totalCount, err := service.SysProvinces().ChildrenList(ctx, in) if err != nil { - return nil, err + return } + res = new(provinces.ChildrenListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // UniqueId 地区ID是否唯一 func (c *cProvinces) UniqueId(ctx context.Context, req *provinces.UniqueIdReq) (res *provinces.UniqueIdRes, err error) { var in sysin.ProvincesUniqueIdInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } data, err := service.SysProvinces().UniqueId(ctx, in) if err != nil { - return nil, err + return } res = new(provinces.UniqueIdRes) res.ProvincesUniqueIdModel = data - - return res, nil + return +} + +// Select 省市区选项 +func (c *cProvinces) Select(ctx context.Context, req *provinces.SelectReq) (res *provinces.SelectRes, err error) { + var in sysin.ProvincesSelectInp + if err = gconv.Scan(req, &in); err != nil { + return + } + + data, err := service.SysProvinces().Select(ctx, in) + if err != nil { + return + } + + res = new(provinces.SelectRes) + res.ProvincesSelectModel = data + return +} + +// CityLabel 省市区选项 +func (c *cProvinces) CityLabel(ctx context.Context, req *provinces.CityLabelReq) (res *provinces.CityLabelRes, err error) { + cityLabel, err := location.ParseSimpleRegion(ctx, req.Id, req.Spilt) + if err != nil { + return + } + + res = (*provinces.CityLabelRes)(&cityLabel) + return } diff --git a/server/internal/controller/backend/sys/serve_log.go b/server/internal/controller/backend/sys/serve_log.go index 6cc8714..3132670 100644 --- a/server/internal/controller/backend/sys/serve_log.go +++ b/server/internal/controller/backend/sys/serve_log.go @@ -26,16 +26,16 @@ type cServeLog struct{} func (c *cServeLog) List(ctx context.Context, req *servelog.ListReq) (res *servelog.ListRes, err error) { var in sysin.ServeLogListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } list, totalCount, err := service.SysServeLog().List(ctx, in) if err != nil { - return nil, err + return } res = new(servelog.ListRes) @@ -43,60 +43,56 @@ func (c *cServeLog) List(ctx context.Context, req *servelog.ListReq) (res *serve res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - return res, nil + return } // Export 导出服务日志列表 func (c *cServeLog) Export(ctx context.Context, req *servelog.ExportReq) (res *servelog.ExportRes, err error) { var in sysin.ServeLogListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.SysServeLog().Export(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.SysServeLog().Export(ctx, in) + return } // View 获取指定服务日志信息 func (c *cServeLog) View(ctx context.Context, req *servelog.ViewReq) (res *servelog.ViewRes, err error) { var in sysin.ServeLogViewInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } data, err := service.SysServeLog().View(ctx, in) if err != nil { - return nil, err + return } res = new(servelog.ViewRes) res.ServeLogViewModel = data - return res, nil + return } // Delete 删除服务日志 func (c *cServeLog) Delete(ctx context.Context, req *servelog.DeleteReq) (res *servelog.DeleteRes, err error) { var in sysin.ServeLogDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.SysServeLog().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.SysServeLog().Delete(ctx, in) + return } diff --git a/server/internal/controller/backend/sys/sms_log.go b/server/internal/controller/backend/sys/sms_log.go index b3ff191..a0dc8d1 100644 --- a/server/internal/controller/backend/sys/sms_log.go +++ b/server/internal/controller/backend/sys/sms_log.go @@ -25,89 +25,75 @@ type cSmsLog struct{} func (c *cSmsLog) Delete(ctx context.Context, req *smslog.DeleteReq) (res *smslog.DeleteRes, err error) { var in sysin.SmsLogDeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysSmsLog().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + + err = service.SysSmsLog().Delete(ctx, in) + return } // Edit 更新 func (c *cSmsLog) Edit(ctx context.Context, req *smslog.EditReq) (res *smslog.EditRes, err error) { - var in sysin.SmsLogEditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err - } - if err = service.SysSmsLog().Edit(ctx, in); err != nil { - return nil, err + return } - return res, nil + err = service.SysSmsLog().Edit(ctx, in) + return } // MaxSort 最大排序 -func (c *cSmsLog) MaxSort(ctx context.Context, req *smslog.MaxSortReq) (*smslog.MaxSortRes, error) { - +func (c *cSmsLog) MaxSort(ctx context.Context, req *smslog.MaxSortReq) (res *smslog.MaxSortRes, err error) { data, err := service.SysSmsLog().MaxSort(ctx, sysin.SmsLogMaxSortInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res smslog.MaxSortRes + res = new(smslog.MaxSortRes) res.Sort = data.Sort - return &res, nil + return } // View 获取指定信息 -func (c *cSmsLog) View(ctx context.Context, req *smslog.ViewReq) (*smslog.ViewRes, error) { - +func (c *cSmsLog) View(ctx context.Context, req *smslog.ViewReq) (res *smslog.ViewRes, err error) { data, err := service.SysSmsLog().View(ctx, sysin.SmsLogViewInp{Id: req.Id}) if err != nil { - return nil, err + return } - var res smslog.ViewRes + res = new(smslog.ViewRes) res.SmsLogViewModel = data - return &res, nil + return } // List 查看列表 -func (c *cSmsLog) List(ctx context.Context, req *smslog.ListReq) (*smslog.ListRes, error) { - - var ( - in sysin.SmsLogListInp - res smslog.ListRes - ) - - if err := gconv.Scan(req, &in); err != nil { - return nil, err +func (c *cSmsLog) List(ctx context.Context, req *smslog.ListReq) (res *smslog.ListRes, err error) { + var in sysin.SmsLogListInp + if err = gconv.Scan(req, &in); err != nil { + return } list, totalCount, err := service.SysSmsLog().List(ctx, in) if err != nil { - return nil, err + return } + res = new(smslog.ListRes) res.List = list res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - - return &res, nil + return } // Status 更新部门状态 func (c *cSmsLog) Status(ctx context.Context, req *smslog.StatusReq) (res *smslog.StatusRes, err error) { - var in sysin.SmsLogStatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } - if err = service.SysSmsLog().Status(ctx, in); err != nil { - return nil, err - } - - return res, nil + + err = service.SysSmsLog().Status(ctx, in) + return } diff --git a/server/internal/controller/websocket/send.go b/server/internal/controller/websocket/send.go index 5d8910b..711c25f 100644 --- a/server/internal/controller/websocket/send.go +++ b/server/internal/controller/websocket/send.go @@ -10,6 +10,7 @@ import ( "context" "hotgo/internal/model/input/websocketin" "hotgo/internal/websocket" + "hotgo/utility/simple" ) // Send 通过http发送ws消息 @@ -19,10 +20,11 @@ type send struct{} // ToTag 发送标签消息 func (c *send) ToTag(ctx context.Context, req *websocketin.SendToTagReq) (res *websocketin.SendToTagRes, err error) { - - go websocket.SendToTag(req.Tag, &websocket.WResponse{ - Event: req.Response.Event, - Data: req.Response, + simple.SafeGo(ctx, func(ctx context.Context) { + websocket.SendToTag(req.Tag, &websocket.WResponse{ + Event: req.Response.Event, + Data: req.Response, + }) }) return } diff --git a/server/internal/crons/init.go b/server/internal/crons/init.go index 5ad4b40..a8bec3c 100644 --- a/server/internal/crons/init.go +++ b/server/internal/crons/init.go @@ -134,9 +134,28 @@ func StartALL(sysCron []*entity.SysCron) error { return nil } +// RefreshStatus 刷新状态 +func RefreshStatus(sysCron *entity.SysCron) (err error) { + if sysCron == nil { + return + } + g.DumpWithType(sysCron) + + if sysCron.Status == consts.StatusEnabled { + return Start(sysCron) + } + + return Stop(sysCron) +} + // Stop 停止单个任务 -func Stop(sysCron *entity.SysCron) error { - return nil +func Stop(sysCron *entity.SysCron) (err error) { + cr := gcron.Search(sysCron.Name) + if cr == nil { + return + } + cr.Stop() + return } // Once 立即执行一次某个任务 @@ -152,15 +171,31 @@ func Once(ctx context.Context, sysCron *entity.SysCron) error { } // Delete 删除任务 -func Delete(sysCron *entity.SysCron) error { - // ... +func Delete(sysCron *entity.SysCron) (err error) { + if sysCron == nil { + return + } + for _, v := range gcron.Entries() { + if v.Name == sysCron.Name { + gcron.Remove(v.Name) + } - return Stop(sysCron) + } + return } // Start 启动单个任务 -func Start(sysCron *entity.SysCron) error { - return nil +func Start(sysCron *entity.SysCron) (err error) { + if sysCron == nil { + return + } + cr := gcron.Search(sysCron.Name) + if cr != nil { + cr.Start() + return + } + + return StartALL([]*entity.SysCron{sysCron}) } // Add 添加任务 diff --git a/server/internal/dao/admin_member_post.go b/server/internal/dao/admin_member_post.go index 263820c..1077a3d 100644 --- a/server/internal/dao/admin_member_post.go +++ b/server/internal/dao/admin_member_post.go @@ -47,7 +47,7 @@ func (dao *adminMemberPostDao) UpdatePostIds(ctx context.Context, memberId int64 PostId: postIds[i], }) if err != nil { - err = gerror.Wrap(err, "插入会员岗位失败") + err = gerror.Wrap(err, "插入用户岗位失败") return err } } diff --git a/server/internal/dao/admin_notice_read.go b/server/internal/dao/admin_notice_read.go new file mode 100644 index 0000000..9b590ac --- /dev/null +++ b/server/internal/dao/admin_notice_read.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "hotgo/internal/dao/internal" +) + +// internalAdminNoticeReadDao is internal type for wrapping internal DAO implements. +type internalAdminNoticeReadDao = *internal.AdminNoticeReadDao + +// adminNoticeReadDao is the data access object for table hg_admin_notice_read. +// You can define custom methods on it to extend its functionality as you wish. +type adminNoticeReadDao struct { + internalAdminNoticeReadDao +} + +var ( + // AdminNoticeRead is globally public accessible object for table hg_admin_notice_read operations. + AdminNoticeRead = adminNoticeReadDao{ + internal.NewAdminNoticeReadDao(), + } +) + +// Fill with you ideas below. diff --git a/server/internal/dao/internal/admin_member.go b/server/internal/dao/internal/admin_member.go index d0f2103..62dce59 100644 --- a/server/internal/dao/internal/admin_member.go +++ b/server/internal/dao/internal/admin_member.go @@ -29,22 +29,20 @@ type AdminMemberColumns struct { Salt string // 密码盐 AuthKey string // 授权令牌 PasswordResetToken string // 密码重置令牌 + Balance string // 余额 Avatar string // 头像 Sex string // 性别 Qq string // qq Email string // 邮箱 Mobile string // 手机号码 Birthday string // 生日 - ProvinceId string // 省编码 CityId string // 城市编码 - CountyId string // 区域编码 Address string // 联系地址 - VisitCount string // 访问次数 - LastTime string // 最后一次登录时间 - LastIp string // 最后一次登录ip Pid string // 上级管理员ID Level string // 关系树等级 Tree string // 关系树 + Cash string // 提现配置 + LastActiveAt string // 最后活跃时间 Remark string // 备注 Status string // 状态 CreatedAt string // 创建时间 @@ -62,22 +60,20 @@ var adminMemberColumns = AdminMemberColumns{ Salt: "salt", AuthKey: "auth_key", PasswordResetToken: "password_reset_token", + Balance: "balance", Avatar: "avatar", Sex: "sex", Qq: "qq", Email: "email", Mobile: "mobile", Birthday: "birthday", - ProvinceId: "province_id", CityId: "city_id", - CountyId: "county_id", Address: "address", - VisitCount: "visit_count", - LastTime: "last_time", - LastIp: "last_ip", Pid: "pid", Level: "level", Tree: "tree", + Cash: "cash", + LastActiveAt: "last_active_at", Remark: "remark", Status: "status", CreatedAt: "created_at", diff --git a/server/internal/dao/internal/admin_notice.go b/server/internal/dao/internal/admin_notice.go index 19da724..db1768f 100644 --- a/server/internal/dao/internal/admin_notice.go +++ b/server/internal/dao/internal/admin_notice.go @@ -23,14 +23,17 @@ type AdminNoticeColumns struct { Id string // 公告ID Title string // 公告标题 Type string // 公告类型 + Tag string // 标签 Content string // 公告内容 Receiver string // 接收者 - Reader string // 已读人 Remark string // 备注 Sort string // 排序 Status string // 公告状态 + CreatedBy string // 发送人 + UpdatedBy string // 修改人 CreatedAt string // 创建时间 UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 } // adminNoticeColumns holds the columns for table hg_admin_notice. @@ -38,14 +41,17 @@ var adminNoticeColumns = AdminNoticeColumns{ Id: "id", Title: "title", Type: "type", + Tag: "tag", Content: "content", Receiver: "receiver", - Reader: "reader", Remark: "remark", Sort: "sort", Status: "status", + CreatedBy: "created_by", + UpdatedBy: "updated_by", CreatedAt: "created_at", UpdatedAt: "updated_at", + DeletedAt: "deleted_at", } // NewAdminNoticeDao creates and returns a new DAO object for table data access. diff --git a/server/internal/dao/internal/admin_notice_read.go b/server/internal/dao/internal/admin_notice_read.go new file mode 100644 index 0000000..112d964 --- /dev/null +++ b/server/internal/dao/internal/admin_notice_read.go @@ -0,0 +1,83 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AdminNoticeReadDao is the data access object for table hg_admin_notice_read. +type AdminNoticeReadDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AdminNoticeReadColumns // columns contains all the column names of Table for convenient usage. +} + +// AdminNoticeReadColumns defines and stores column names for table hg_admin_notice_read. +type AdminNoticeReadColumns struct { + Id string // 记录ID + NoticeId string // 公告ID + MemberId string // 会员ID + Clicks string // 已读次数 + UpdatedAt string // 更新时间 + CreatedAt string // 阅读时间 +} + +// adminNoticeReadColumns holds the columns for table hg_admin_notice_read. +var adminNoticeReadColumns = AdminNoticeReadColumns{ + Id: "id", + NoticeId: "notice_id", + MemberId: "member_id", + Clicks: "clicks", + UpdatedAt: "updated_at", + CreatedAt: "created_at", +} + +// NewAdminNoticeReadDao creates and returns a new DAO object for table data access. +func NewAdminNoticeReadDao() *AdminNoticeReadDao { + return &AdminNoticeReadDao{ + group: "default", + table: "hg_admin_notice_read", + columns: adminNoticeReadColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AdminNoticeReadDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AdminNoticeReadDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AdminNoticeReadDao) Columns() AdminNoticeReadColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AdminNoticeReadDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AdminNoticeReadDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AdminNoticeReadDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/server/internal/dao/internal/sys_ems_log.go b/server/internal/dao/internal/sys_ems_log.go new file mode 100644 index 0000000..84f9967 --- /dev/null +++ b/server/internal/dao/internal/sys_ems_log.go @@ -0,0 +1,91 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysEmsLogDao is the data access object for table hg_sys_ems_log. +type SysEmsLogDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysEmsLogColumns // columns contains all the column names of Table for convenient usage. +} + +// SysEmsLogColumns defines and stores column names for table hg_sys_ems_log. +type SysEmsLogColumns struct { + Id string // 主键 + Event string // 事件 + Email string // 邮箱地址,多个用;隔开 + Code string // 验证码 + Times string // 验证次数 + Content string // 邮件内容 + Ip string // ip地址 + Status string // 状态(1未验证,2已验证) + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +// sysEmsLogColumns holds the columns for table hg_sys_ems_log. +var sysEmsLogColumns = SysEmsLogColumns{ + Id: "id", + Event: "event", + Email: "email", + Code: "code", + Times: "times", + Content: "content", + Ip: "ip", + Status: "status", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysEmsLogDao creates and returns a new DAO object for table data access. +func NewSysEmsLogDao() *SysEmsLogDao { + return &SysEmsLogDao{ + group: "default", + table: "hg_sys_ems_log", + columns: sysEmsLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysEmsLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysEmsLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysEmsLogDao) Columns() SysEmsLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysEmsLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysEmsLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysEmsLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/server/internal/dao/internal/sys_gen_codes.go b/server/internal/dao/internal/sys_gen_codes.go index 22f5e5c..2d87c75 100644 --- a/server/internal/dao/internal/sys_gen_codes.go +++ b/server/internal/dao/internal/sys_gen_codes.go @@ -22,6 +22,7 @@ type SysGenCodesDao struct { type SysGenCodesColumns struct { Id string // 生成ID GenType string // 生成类型 + GenTemplate string // 生成模板 VarName string // 实体命名 Options string // 配置选项 DbName string // 数据库名称 @@ -38,6 +39,7 @@ type SysGenCodesColumns struct { var sysGenCodesColumns = SysGenCodesColumns{ Id: "id", GenType: "gen_type", + GenTemplate: "gen_template", VarName: "var_name", Options: "options", DbName: "db_name", diff --git a/server/internal/dao/internal/sys_gen_curd_demo.go b/server/internal/dao/internal/sys_gen_curd_demo.go index 71fc5dc..7976c25 100644 --- a/server/internal/dao/internal/sys_gen_curd_demo.go +++ b/server/internal/dao/internal/sys_gen_curd_demo.go @@ -27,6 +27,7 @@ type SysGenCurdDemoColumns struct { Content string // 内容 Image string // 单图 Attachfile string // 附件 + CityId string // 所在城市 Switch string // 显示开关 Sort string // 排序 Status string // 状态 @@ -46,6 +47,7 @@ var sysGenCurdDemoColumns = SysGenCurdDemoColumns{ Content: "content", Image: "image", Attachfile: "attachfile", + CityId: "city_id", Switch: "switch", Sort: "sort", Status: "status", diff --git a/server/internal/dao/internal/sys_login_log.go b/server/internal/dao/internal/sys_login_log.go index ea19a95..33103f4 100644 --- a/server/internal/dao/internal/sys_login_log.go +++ b/server/internal/dao/internal/sys_login_log.go @@ -26,6 +26,7 @@ type SysLoginLogColumns struct { Username string // 用户名 Response string // 响应数据 LoginAt string // 登录时间 + LoginIp string // 登录IP ErrMsg string // 错误提示 Status string // 状态 CreatedAt string // 创建时间 @@ -40,6 +41,7 @@ var sysLoginLogColumns = SysLoginLogColumns{ Username: "username", Response: "response", LoginAt: "login_at", + LoginIp: "login_ip", ErrMsg: "err_msg", Status: "status", CreatedAt: "created_at", diff --git a/server/internal/dao/internal/test.go b/server/internal/dao/internal/test.go index 91dc642..b1609c4 100644 --- a/server/internal/dao/internal/test.go +++ b/server/internal/dao/internal/test.go @@ -46,6 +46,7 @@ type TestColumns struct { Mobile string // 手机号码 Hobby string // 爱好 Channel string // 渠道 + CityId string // 所在城市 Pid string // 上级ID Level string // 树等级 Tree string // 关系树 @@ -86,6 +87,7 @@ var testColumns = TestColumns{ Mobile: "mobile", Hobby: "hobby", Channel: "channel", + CityId: "city_id", Pid: "pid", Level: "level", Tree: "tree", diff --git a/server/internal/dao/sys_ems_log.go b/server/internal/dao/sys_ems_log.go new file mode 100644 index 0000000..af48dd5 --- /dev/null +++ b/server/internal/dao/sys_ems_log.go @@ -0,0 +1,43 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "context" + "github.com/gogf/gf/v2/os/gtime" + "hotgo/internal/dao/internal" +) + +// internalSysEmsLogDao is internal type for wrapping internal DAO implements. +type internalSysEmsLogDao = *internal.SysEmsLogDao + +// sysEmsLogDao is the data access object for table hg_sys_ems_log. +// You can define custom methods on it to extend its functionality as you wish. +type sysEmsLogDao struct { + internalSysEmsLogDao +} + +var ( + // SysEmsLog is globally public accessible object for table hg_sys_ems_log operations. + SysEmsLog = sysEmsLogDao{ + internal.NewSysEmsLogDao(), + } +) + +// Fill with you ideas below. + +// NowDayCount 当天发送次数 +func (dao *sysEmsLogDao) NowDayCount(ctx context.Context, event, email string) (count int, err error) { + count, err = dao.Ctx(ctx). + Where("email", email). + Where("event", event). + WhereGTE("created_at", gtime.Now().Format("Y-m-d")). + Count() + if err != nil { + return 0, err + } + + return +} diff --git a/server/internal/dao/sys_provinces.go b/server/internal/dao/sys_provinces.go index d2a6e19..ce46858 100644 --- a/server/internal/dao/sys_provinces.go +++ b/server/internal/dao/sys_provinces.go @@ -5,10 +5,6 @@ package dao import ( - "context" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/errors/gerror" - "hotgo/internal/consts" "hotgo/internal/dao/internal" ) @@ -29,38 +25,3 @@ var ( ) // Fill with you ideas below. - -// GetRegion 获取省市编码对应的地区名称 -func (dao *sysProvincesDao) GetRegion(ctx context.Context, province int64, city int64, spilt ...string) (string, error) { - var ( - provinceName *gvar.Var - cityName *gvar.Var - err error - ) - - // 分隔符 - spiltSymbol := "-" - if len(spilt) > 0 { - spiltSymbol = spilt[0] - } - - if province > 0 && province < 999999 { - provinceName, err = dao.Ctx(ctx).Where("id", province).Fields("title").Value() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return "", err - } - - if city > 0 { - cityName, err = dao.Ctx(ctx).Where("id", city).Fields("title").Value() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return "", err - } - } - } else { - return "内网IP", nil - } - - return provinceName.String() + spiltSymbol + cityName.String(), nil -} diff --git a/server/internal/global/init.go b/server/internal/global/init.go index a1ae33c..3fad304 100644 --- a/server/internal/global/init.go +++ b/server/internal/global/init.go @@ -26,6 +26,7 @@ import ( "hotgo/utility/charset" "hotgo/utility/simple" "os" + "strings" ) func Init(ctx context.Context) { @@ -45,12 +46,12 @@ func Init(ctx context.Context) { RootPtah, _ = os.Getwd() fmt.Printf("欢迎使用HotGo!\r\n当前运行环境:%v, 运行根路径为:%v \r\nHotGo版本:v%v, gf版本:%v \n", SysType, RootPtah, consts.VersionApp, gf.VERSION) - g.Log().SetHandlers(LoggingServeLogHandler) - setOrmCacheAdapter() service.SysBlacklist().Load(ctx) + g.Log().SetHandlers(LoggingServeLogHandler) + startMonitor(ctx) hggen.InIt(ctx) @@ -61,13 +62,13 @@ func startMonitor(ctx context.Context) { MonitorData.STartTime = gtime.Now() intranetIP, err := location.GetLocalIP() if err != nil { - g.Log().Warningf(ctx, "parse intranetIP err:%+v", err) + g.Log().Infof(ctx, "parse intranetIP err:%+v", err) } MonitorData.IntranetIP = intranetIP publicIP, err := location.GetPublicIP(ctx) if err != nil { - g.Log().Warningf(ctx, "parse publicIP err:%+v", err) + g.Log().Infof(ctx, "parse publicIP err:%+v", err) } MonitorData.PublicIP = publicIP }) @@ -81,47 +82,59 @@ func setOrmCacheAdapter() { func LoggingServeLogHandler(ctx context.Context, in *glog.HandlerInput) { in.Next(ctx) - conf, err := service.SysConfig().GetLoadServeLog(ctx) - if err != nil { - return - } + err := g.Try(ctx, func(ctx context.Context) { + var err error + defer func() { + if err != nil { + panic(err) + } + }() + conf, err := service.SysConfig().GetLoadServeLog(ctx) + if err != nil { + return + } - if conf == nil { - return - } + if conf == nil { + return + } - if !conf.Switch { - return - } + if !conf.Switch { + return + } - if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) { - return - } + if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) { + return + } - var data entity.SysServeLog - data.TraceId = gctx.CtxId(ctx) - data.LevelFormat = in.LevelFormat - data.Content = in.Content - data.Stack = gjson.New(charset.ParseStack(in.Stack)) - data.Line = in.CallerPath - data.TriggerNs = in.Time.UnixNano() - data.Status = consts.StatusEnabled + if in.Stack == "" { + in.Stack = in.Logger.GetStack(4) // 4是跳过当前方法,如果调整本行位置需要重新调整skip + } - if data.Stack.IsNil() { - data.Stack = gjson.New(consts.NilJsonToString) - } + var data entity.SysServeLog + data.TraceId = gctx.CtxId(ctx) + data.LevelFormat = in.LevelFormat + data.Content = in.Content + data.Stack = gjson.New(charset.ParseStack(in.Stack)) + data.Line = strings.TrimRight(in.CallerPath, ":") + data.TriggerNs = in.Time.UnixNano() + data.Status = consts.StatusEnabled - if gstr.Contains(in.Content, `exception recovered`) { - data.LevelFormat = "PANI" - } + if data.Stack.IsNil() { + data.Stack = gjson.New(consts.NilJsonToString) + } - if conf.Queue { - err = queue.Push(consts.QueueServeLogTopic, data) - } else { - err = service.SysServeLog().RealWrite(ctx, data) - } + if gstr.Contains(in.Content, `exception recovered`) { + data.LevelFormat = "PANI" + } + + if conf.Queue { + err = queue.Push(consts.QueueServeLogTopic, data) + } else { + err = service.SysServeLog().RealWrite(ctx, data) + } + }) if err != nil { - g.Log().Printf(ctx, "LoggingServeLogHandler err:%+v", err) + g.Log("serveLog").Errorf(ctx, "LoggingServeLogHandler err:%+v", err) } } diff --git a/server/internal/library/captcha/captcha.go b/server/internal/library/captcha/captcha.go index 69f5e7e..c887d1d 100644 --- a/server/internal/library/captcha/captcha.go +++ b/server/internal/library/captcha/captcha.go @@ -33,7 +33,7 @@ func Generate(ctx context.Context) (id string, base64 string) { // Fonts: []string{"chromohv.ttf"}, //} - // 计算 + // 算数 driver := &base64Captcha.DriverMath{ Height: 42, Width: 100, diff --git a/server/internal/library/contexts/context.go b/server/internal/library/contexts/context.go index 44f08d0..cc938b0 100644 --- a/server/internal/library/contexts/context.go +++ b/server/internal/library/contexts/context.go @@ -50,6 +50,16 @@ func SetTakeUpTime(ctx context.Context, takeUpTime int64) { Get(ctx).TakeUpTime = takeUpTime } +// GetUser 获取用户信息 +func GetUser(ctx context.Context) *model.Identity { + c := Get(ctx) + if c == nil { + return nil + } + + return c.User +} + // GetUserId 获取用户ID func GetUserId(ctx context.Context) int64 { user := Get(ctx).User diff --git a/server/internal/library/debris/debris.go b/server/internal/library/debris/debris.go index 3503885..6defd0e 100644 --- a/server/internal/library/debris/debris.go +++ b/server/internal/library/debris/debris.go @@ -7,7 +7,3 @@ package debris // 碎片 - -func Test() { - -} diff --git a/server/internal/library/ems/ems.go b/server/internal/library/ems/ems.go index 769333a..f238375 100644 --- a/server/internal/library/ems/ems.go +++ b/server/internal/library/ems/ems.go @@ -19,24 +19,6 @@ func Send(config *model.EmailConfig, to string, subject string, body string) err return sendToMail(config, to, subject, body, "html") } -// SendTestMail 发送测试邮件 -func SendTestMail(config *model.EmailConfig, to string) error { - subject := "这是一封来自HotGo的测试邮件" - body := ` - - - - - 这是一封来自HotGo的测试邮件 - - - 当你收到这封邮件的时候,说明已经联调成功了,恭喜你! - - ` - - return Send(config, to, subject, body) -} - func sendToMail(config *model.EmailConfig, to, subject, body, mailType string) error { if config == nil { diff --git a/server/internal/library/hggen/hggen.go b/server/internal/library/hggen/hggen.go index ae4f953..b189e24 100644 --- a/server/internal/library/hggen/hggen.go +++ b/server/internal/library/hggen/hggen.go @@ -15,6 +15,7 @@ import ( "hotgo/internal/library/hggen/internal/cmd" "hotgo/internal/library/hggen/internal/cmd/gendao" "hotgo/internal/library/hggen/views" + "hotgo/internal/model" "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" "hotgo/internal/service" @@ -49,11 +50,33 @@ func TableColumns(ctx context.Context, in sysin.GenCodesColumnListInp) (fields [ func TableSelects(ctx context.Context, in sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) { res = new(sysin.GenCodesSelectsModel) for k, v := range consts.GenCodesTypeNameMap { - res.GenType = append(res.GenType, &form.Select{ - Value: k, - Name: v, - Label: v, - }) + row := &sysin.GenTypeSelect{ + Value: k, + Name: v, + Label: v, + Templates: make(form.Selects, 0), + } + + confName, ok := consts.GenCodesTypeConfMap[k] + if ok { + var temps []*model.GenerateAppCrudTemplate + err = g.Cfg().MustGet(ctx, "hggen.application."+confName+".templates").Scan(&temps) + if err != nil { + return + } + if len(temps) > 0 { + for index, temp := range temps { + row.Templates = append(row.Templates, &form.Select{ + Value: index, + Label: temp.Group, + Name: temp.Group, + }) + } + sort.Sort(row.Templates) + } + } + + res.GenType = append(res.GenType, row) } sort.Sort(res.GenType) res.Db = DbSelect(ctx) diff --git a/server/internal/library/hggen/init.go b/server/internal/library/hggen/init.go index 8dd031a..944b83b 100644 --- a/server/internal/library/hggen/init.go +++ b/server/internal/library/hggen/init.go @@ -61,7 +61,6 @@ func GetServiceConfig() genservice.CGenServiceInput { } func GetDaoConfig(group string) gendao.CGenDaoInput { - inp := defaultGenDaoInput find := func(group string) g.Map { for _, v := range daoConfig { if v.(g.Map)["group"].(string) == group { @@ -72,9 +71,9 @@ func GetDaoConfig(group string) gendao.CGenDaoInput { } v := find(group) + inp := defaultGenDaoInput if v != nil { - err := gconv.Scan(v, &inp) - if err != nil { + if err := gconv.Scan(v, &inp); err != nil { panic(err) } } diff --git a/server/internal/library/hggen/internal/cmd/cmd_gen.go b/server/internal/library/hggen/internal/cmd/cmd_gen.go index 3cc2f0e..0ad6637 100644 --- a/server/internal/library/hggen/internal/cmd/cmd_gen.go +++ b/server/internal/library/hggen/internal/cmd/cmd_gen.go @@ -10,7 +10,7 @@ var ( ) type cGen struct { - g.Meta `name:"hggen" brief:"{cGenBrief}" dc:"{cGenDc}"` + g.Meta `name:"gen" brief:"{cGenBrief}" dc:"{cGenDc}"` cGenDao cGenPb cGenPbEntity @@ -20,9 +20,9 @@ type cGen struct { const ( cGenBrief = `automatically generate go files for dao/do/entity/pb/pbentity` cGenDc = ` -The "hggen" command is designed for multiple generating purposes. +The "gen" command is designed for multiple generating purposes. It's currently supporting generating go files for ORM models, protobuf and protobuf entity files. -Please use "gf hggen dao -h" for specified type help. +Please use "gf gen dao -h" for specified type help. ` ) diff --git a/server/internal/library/hggen/internal/cmd/cmd_gen_pbentity.go b/server/internal/library/hggen/internal/cmd/cmd_gen_pbentity.go index e65425e..5cd7790 100644 --- a/server/internal/library/hggen/internal/cmd/cmd_gen_pbentity.go +++ b/server/internal/library/hggen/internal/cmd/cmd_gen_pbentity.go @@ -44,22 +44,22 @@ type ( ) const ( - cGenPbEntityConfig = `gfcli.hggen.pbentity` + cGenPbEntityConfig = `gfcli.gen.pbentity` cGenPbEntityBrief = `generate entity message files in protobuf3 format` cGenPbEntityEg = ` -gf hggen pbentity -gf hggen pbentity -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test" -gf hggen pbentity -p ./protocol/demos/entity -t user,user_detail,user_login -gf hggen pbentity -r user_ +gf gen pbentity +gf gen pbentity -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test" +gf gen pbentity -p ./protocol/demos/entity -t user,user_detail,user_login +gf gen pbentity -r user_ ` cGenPbEntityAd = ` CONFIGURATION SUPPORT Options are also supported by configuration file. It's suggested using configuration file instead of command line arguments making producing. - The configuration node name is "gf.hggen.pbentity", which also supports multiple databases, for example(config.yaml): + The configuration node name is "gf.gen.pbentity", which also supports multiple databases, for example(config.yaml): gfcli: - hggen: + gen: - pbentity: link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test" path: "protocol/demos/entity" diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao.go b/server/internal/library/hggen/internal/cmd/gendao/gendao.go index 97a7398..046225a 100644 --- a/server/internal/library/hggen/internal/cmd/gendao/gendao.go +++ b/server/internal/library/hggen/internal/cmd/gendao/gendao.go @@ -18,23 +18,23 @@ import ( ) const ( - CGenDaoConfig = `gfcli.hggen.dao` - CGenDaoUsage = `gf hggen dao [OPTION]` + CGenDaoConfig = `gfcli.gen.dao` + CGenDaoUsage = `gf gen dao [OPTION]` CGenDaoBrief = `automatically generate go files for dao/do/entity` CGenDaoEg = ` -gf hggen dao -gf hggen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test" -gf hggen dao -p ./model -g user-center -t user,user_detail,user_login -gf hggen dao -r user_ +gf gen dao +gf gen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test" +gf gen dao -p ./model -g user-center -t user,user_detail,user_login +gf gen dao -r user_ ` CGenDaoAd = ` CONFIGURATION SUPPORT Options are also supported by configuration file. It's suggested using configuration file instead of command line arguments making producing. - The configuration node name is "gfcli.hggen.dao", which also supports multiple databases, for example(config.yaml): + The configuration node name is "gfcli.gen.dao", which also supports multiple databases, for example(config.yaml): gfcli: - hggen: + gen: dao: - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test" tables: "order,products" @@ -179,7 +179,6 @@ type ( ) func (c CGenDao) Dao(ctx context.Context, in CGenDaoInput) (out *CGenDaoOutput, err error) { - g.Log().Warningf(ctx, "g.Cfg().Available(ctx):%v", g.Cfg().Available(ctx)) if g.Cfg().Available(ctx) { v := g.Cfg().MustGet(ctx, CGenDaoConfig) if v.IsSlice() { @@ -200,7 +199,7 @@ func DoGenDaoForArray(ctx context.Context, in CGenDaoInput) { doGenDaoForArray(ctx, -1, in) } -// doGenDaoForArray implements the "hggen dao" command for configuration array. +// doGenDaoForArray implements the "gen dao" command for configuration array. func doGenDaoForArray(ctx context.Context, index int, in CGenDaoInput) { var ( err error diff --git a/server/internal/library/hggen/internal/cmd/genservice/genservice.go b/server/internal/library/hggen/internal/cmd/genservice/genservice.go index c5dc9d8..d771763 100644 --- a/server/internal/library/hggen/internal/cmd/genservice/genservice.go +++ b/server/internal/library/hggen/internal/cmd/genservice/genservice.go @@ -20,12 +20,12 @@ import ( ) const ( - CGenServiceConfig = `gfcli.hggen.service` - CGenServiceUsage = `gf hggen service [OPTION]` + CGenServiceConfig = `gfcli.gen.service` + CGenServiceUsage = `gf gen service [OPTION]` CGenServiceBrief = `parse struct and associated functions from packages to generate service go file` CGenServiceEg = ` -gf hggen service -gf hggen service -f Snake +gf gen service +gf gen service -f Snake ` CGenServiceBriefSrcFolder = `source folder path to be parsed. default: internal/logic` CGenServiceBriefDstFolder = `destination folder path storing automatically generated go files. default: internal/service` @@ -89,13 +89,13 @@ const ( func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGenServiceOutput, err error) { // File lock to avoid multiple processes. var ( - flockFilePath = gfile.Temp("gf.cli.hggen.service.lock") + flockFilePath = gfile.Temp("gf.cli.gen.service.lock") flockContent = gfile.GetContents(flockFilePath) ) if flockContent != "" { if gtime.Timestamp()-gconv.Int64(flockContent) < genServiceFileLockSeconds { - // If another "hggen service" process is running, it just exits. - mlog.Debug(`another "hggen service" process is running, exit`) + // If another "gen service" process is running, it just exits. + mlog.Debug(`another "gen service" process is running, exit`) return } } @@ -127,7 +127,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe mlog.Debug("Chdir:", newWorkingDir) _ = gfile.Remove(flockFilePath) var command = fmt.Sprintf( - `%s hggen service -packages=%s`, + `%s gen service -packages=%s`, gfile.SelfName(), gfile.Basename(watchFileDir), ) err = gproc.ShellRun(ctx, command) diff --git a/server/internal/library/hggen/views/column_default.go b/server/internal/library/hggen/views/column_default.go index 29cb153..bb4a06c 100644 --- a/server/internal/library/hggen/views/column_default.go +++ b/server/internal/library/hggen/views/column_default.go @@ -157,6 +157,11 @@ func setDefaultFormMode(field *sysin.GenCodesColumnListModel) { return } + if (field.GoName == "ProvinceId" || field.GoName == "CityId") && IsNumberType(field.GoType) { + field.FormMode = FormModeCitySelector + return + } + if field.DataType == "datetime" || field.DataType == "timestamp" || field.DataType == "timestamptz" { field.FormMode = FormModeTime return diff --git a/server/internal/library/hggen/views/column_map.go b/server/internal/library/hggen/views/column_map.go index 4ab6a69..e08a9aa 100644 --- a/server/internal/library/hggen/views/column_map.go +++ b/server/internal/library/hggen/views/column_map.go @@ -115,6 +115,7 @@ const ( FormModeUploadFiles = "UploadFiles" // 多文件上传 FormModeSwitch = "Switch" // 开关 FormModeRate = "Rate" // 评分 + FormModeCitySelector = "CitySelector" // 省市区选择 ) var FormModes = []string{ @@ -124,6 +125,7 @@ var FormModes = []string{ FormModeUploadImage, FormModeUploadImages, FormModeUploadFile, FormModeUploadFiles, FormModeSwitch, FormModeRate, + FormModeCitySelector, } var FormModeMap = map[string]string{ @@ -146,6 +148,7 @@ var FormModeMap = map[string]string{ FormModeUploadFiles: "多文件上传", FormModeSwitch: "开关", FormModeRate: "评分", + FormModeCitySelector: "省市区选择", } // 表单验证 diff --git a/server/internal/library/hggen/views/curd.go b/server/internal/library/hggen/views/curd.go index 2a78d0b..a868efc 100644 --- a/server/internal/library/hggen/views/curd.go +++ b/server/internal/library/hggen/views/curd.go @@ -118,7 +118,16 @@ func (l *gCurd) initInput(ctx context.Context, in *CurdPreviewInput) (err error) initStep(ctx, in) in.options.dictMap = make(g.Map) - in.options.TemplateGroup = "sys" + + if len(in.Config.Application.Crud.Templates)-1 < in.In.GenTemplate { + return gerror.New("没有找到生成模板的配置,请检查!") + } + + err = checkCurdPath(in.Config.Application.Crud.Templates[in.In.GenTemplate]) + if err != nil { + return + } + in.options.TemplateGroup = in.Config.Application.Crud.Templates[in.In.GenTemplate].MasterPackage return } @@ -137,14 +146,14 @@ func initStep(ctx context.Context, in *CurdPreviewInput) { in.options.Step.HasMenu = gstr.InArray(in.options.AutoOps, "genMenuPermissions") } -func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error { +func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) (err error) { view := gview.New() - err := view.SetConfigWithMap(g.Map{ - "Paths": "./resource/template/generate/default/curd", + err = view.SetConfigWithMap(g.Map{ + "Paths": in.Config.Application.Crud.Templates[in.In.GenTemplate].TemplatePath, "Delimiters": in.Config.Delimiters, }) if err != nil { - return err + return } view.BindFuncMap(g.Map{ @@ -156,7 +165,7 @@ func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error { dictOptions, err := l.generateWebModelDictOptions(ctx, in) if err != nil { - return err + return } view.Assigns(gview.Params{ @@ -174,13 +183,13 @@ func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error { "dictOptions": dictOptions, // web字典选项 }) in.view = view - return nil + return } func (l *gCurd) DoBuild(ctx context.Context, in *CurdBuildInput) (err error) { preview, err := l.DoPreview(ctx, in.PreviewIn) if err != nil { - return err + return } // 前置操作 @@ -307,7 +316,7 @@ func (l *gCurd) generateApiContent(ctx context.Context, in *CurdPreviewInput) (e return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].ApiPath, strings.ToLower(in.In.VarName), strings.ToLower(in.In.VarName)+".go") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].ApiPath, strings.ToLower(in.In.VarName), strings.ToLower(in.In.VarName)+".go") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -338,7 +347,7 @@ func (l *gCurd) generateInputContent(ctx context.Context, in *CurdPreviewInput) if err != nil { return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].InputPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].InputPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -364,7 +373,7 @@ func (l *gCurd) generateControllerContent(ctx context.Context, in *CurdPreviewIn if err != nil { return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].ControllerPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].ControllerPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -394,7 +403,7 @@ func (l *gCurd) generateLogicContent(ctx context.Context, in *CurdPreviewInput) if err != nil { return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].LogicPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].LogicPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -420,7 +429,7 @@ func (l *gCurd) generateRouterContent(ctx context.Context, in *CurdPreviewInput) return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].RouterPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].RouterPath, convert.CamelCaseToUnderline(in.In.VarName)+".go") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -446,7 +455,7 @@ func (l *gCurd) generateWebApiContent(ctx context.Context, in *CurdPreviewInput) return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebApiPath, gstr.LcFirst(in.In.VarName), "index.ts") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebApiPath, gstr.LcFirst(in.In.VarName), "index.ts") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -477,7 +486,7 @@ func (l *gCurd) generateWebModelContent(ctx context.Context, in *CurdPreviewInpu return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "model.ts") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "model.ts") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -507,7 +516,7 @@ func (l *gCurd) generateWebIndexContent(ctx context.Context, in *CurdPreviewInpu return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "index.vue") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "index.vue") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -538,7 +547,7 @@ func (l *gCurd) generateWebEditContent(ctx context.Context, in *CurdPreviewInput return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "edit.vue") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "edit.vue") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -573,7 +582,7 @@ func (l *gCurd) generateWebViewContent(ctx context.Context, in *CurdPreviewInput return err } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "view.vue") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "view.vue") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip @@ -609,7 +618,7 @@ func (l *gCurd) generateSqlContent(ctx context.Context, in *CurdPreviewInput) (e tplData["mainComponent"] = "ParentLayout" //gstr.LcFirst(in.In.VarName) } - genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].SqlPath, convert.CamelCaseToUnderline(in.In.VarName)+"_menu.sql") + genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].SqlPath, convert.CamelCaseToUnderline(in.In.VarName)+"_menu.sql") genFile.Meth = consts.GenCodesBuildMethCreate if gfile.Exists(genFile.Path) { genFile.Meth = consts.GenCodesBuildMethSkip diff --git a/server/internal/library/hggen/views/curd_generate_logic.go b/server/internal/library/hggen/views/curd_generate_logic.go index f914920..abe14a2 100644 --- a/server/internal/library/hggen/views/curd_generate_logic.go +++ b/server/internal/library/hggen/views/curd_generate_logic.go @@ -19,11 +19,13 @@ import ( 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 nil, 0, err\n\t}" + 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})" 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 = "\t\t_, err = dao.%s.Ctx(ctx).\n\t\t\tFieldsEx(\n%s\t\t\t).\n\t\t\tWhere(dao.%s.Columns().%s, in.%s).Data(in).Update()\n\t\tif err != nil {\n\t\t\terr = gerror.Wrap(err, consts.ErrorORM)\n\t\t\treturn err\n\t\t}\n\t\treturn nil" - LogicEditInsert = "\t_, err = dao.%s.Ctx(ctx).\n\t\tFieldsEx(\n%s\t\t).\n\t\tData(in).Insert()\n\tif err != nil {\n\t\terr = gerror.Wrap(err, consts.ErrorORM)\n\t\treturn err\n\t}" + LogicEditUpdate = "\t\t_, err = s.Model(ctx).\n\t\t\tFieldsEx(\n%s\t\t\t).\n\t\t\tWhere(dao.%s.Columns().%s, in.%s).Data(in).Update()\n\t\treturn " + LogicEditInsert = "\t_, err = s.Model(ctx, &handler.Option{FilterAuth: false}).\n\t\tFieldsEx(\n%s\t\t).\n\t\tData(in).Insert()" + LogicSwitchUpdate = "g.Map{\n\t\tin.Key: in.Value,\n%s}" + LogicStatusUpdate = "g.Map{\n\t\tdao.%s.Columns().Status: in.Status,\n%s}" ) func (l *gCurd) logicTplData(ctx context.Context, in *CurdPreviewInput) (data g.Map, err error) { @@ -33,9 +35,35 @@ func (l *gCurd) logicTplData(ctx context.Context, in *CurdPreviewInput) (data g. data["listOrder"] = l.generateLogicListOrder(ctx, in) data["edit"] = l.generateLogicEdit(ctx, in) data["switchFields"] = l.generateLogicSwitchFields(ctx, in) + data["switchUpdate"] = l.generateLogicSwitchUpdate(ctx, in) + data["statusUpdate"] = l.generateLogicStatusUpdate(ctx, in) return } +func (l *gCurd) generateLogicStatusUpdate(ctx context.Context, in *CurdPreviewInput) string { + var update string + for _, field := range in.masterFields { + if field.GoName == "UpdatedBy" { + update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n" + } + } + + update += "\t" + return fmt.Sprintf(LogicStatusUpdate, in.In.DaoName, update) +} + +func (l *gCurd) generateLogicSwitchUpdate(ctx context.Context, in *CurdPreviewInput) string { + var update string + for _, field := range in.masterFields { + if field.GoName == "UpdatedBy" { + update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n" + } + } + + update += "\t" + return fmt.Sprintf(LogicSwitchUpdate, update) +} + func (l *gCurd) generateLogicSwitchFields(ctx context.Context, in *CurdPreviewInput) string { buffer := bytes.NewBuffer(nil) if in.options.Step.HasSwitch { @@ -71,8 +99,8 @@ func (l *gCurd) generateLogicEdit(ctx context.Context, in *CurdPreviewInput) g.M } } - updateBuffer.WriteString(fmt.Sprintf(LogicEditUpdate, in.In.DaoName, updateFieldsEx, in.In.DaoName, in.pk.GoName, in.pk.GoName)) - insertBuffer.WriteString(fmt.Sprintf(LogicEditInsert, in.In.DaoName, insertFieldsEx)) + updateBuffer.WriteString(fmt.Sprintf(LogicEditUpdate, updateFieldsEx, in.In.DaoName, in.pk.GoName, in.pk.GoName)) + insertBuffer.WriteString(fmt.Sprintf(LogicEditInsert, insertFieldsEx)) data["update"] = updateBuffer.String() data["insert"] = insertBuffer.String() 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 72c6683..b8646eb 100644 --- a/server/internal/library/hggen/views/curd_generate_web_edit.go +++ b/server/internal/library/hggen/views/curd_generate_web_edit.go @@ -34,7 +34,7 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu } var ( - defaultComponent = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) + defaultComponent = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) component string ) @@ -43,65 +43,68 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu component = defaultComponent case FormModeInputNumber: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) case FormModeInputTextarea: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.Dc, field.TsName) case FormModeInputEditor: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeInputDynamic: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeDate: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) //case FormModeDateRange: // 必须要有两个字段,后面优化下 case FormModeTime: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) //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) + 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) case FormModeCheckbox: - component = fmt.Sprintf("\n \n \n \n \n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) + component = fmt.Sprintf("\n \n \n \n \n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) case FormModeSelect: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) case FormModeSelectMultiple: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName]) case FormModeUploadImage: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeUploadImages: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeUploadFile: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeUploadFiles: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeSwitch: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) case FormModeRate: - component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, field.GoName) + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName, field.GoName) + + case FormModeCitySelector: + component = fmt.Sprintf("\n \n ", field.Dc, field.TsName, field.TsName) default: component = defaultComponent } if len(in.masterFields) == k { - buffer.WriteString(" " + component) + buffer.WriteString(" " + component) } else { - buffer.WriteString(" " + component + "\n\n") + buffer.WriteString(" " + component + "\n\n") } } @@ -117,11 +120,12 @@ func (l *gCurd) generateWebEditScript(ctx context.Context, in *CurdPreviewInput) if in.options.Step.HasMaxSort { importBuffer.WriteString(" import { onMounted, ref, computed, watch } from 'vue';\n") - importBuffer.WriteString(" import { Edit, MaxSort } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n") - setupBuffer.WriteString(" watch(\n () => params.value,\n (value) => {\n if (value.id === 0) {\n MaxSort().then((res) => {\n params.value.sort = res.sort;\n });\n }\n }\n );\n\n") + importBuffer.WriteString(" import { Edit, MaxSort, View } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n") + setupBuffer.WriteString(" function loadForm(value) {\n loading.value = true;\n\n // 新增\n if (value.id < 1) {\n params.value = newState(value);\n MaxSort()\n .then((res) => {\n params.value.sort = res.sort;\n })\n .finally(() => {\n loading.value = false;\n });\n return;\n }\n\n // 编辑\n View({ id: value.id })\n .then((res) => {\n params.value = res;\n })\n .finally(() => {\n loading.value = false;\n });\n }\n\n watch(\n () => props.formParams,\n (value) => {\n loadForm(value);\n }\n );") } else { importBuffer.WriteString(" import { onMounted, ref, computed } from 'vue';\n") - importBuffer.WriteString(" import { Edit } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n") + importBuffer.WriteString(" import { Edit, View } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n") + setupBuffer.WriteString(" function loadForm(value) {\n // 新增\n if (value.id < 1) {\n params.value = newState(value);\n loading.value = false;\n return;\n }\n\n loading.value = true;\n // 编辑\n View({ id: value.id })\n .then((res) => {\n params.value = res;\n })\n .finally(() => {\n loading.value = false;\n });\n }\n\n watch(\n () => props.formParams,\n (value) => {\n loadForm(value);\n }\n );") } for _, field := range in.masterFields { @@ -147,12 +151,15 @@ func (l *gCurd) generateWebEditScript(ctx context.Context, in *CurdPreviewInput) } case FormModeRate: setupBuffer.WriteString(fmt.Sprintf(" function update%s(num) {\n params.value.%s = num;\n }\n", field.GoName, field.TsName)) + case FormModeCitySelector: + if !gstr.Contains(importBuffer.String(), `import CitySelector`) { + importBuffer.WriteString(" import CitySelector from '@/components/CitySelector/citySelector.vue';\n") + } } } data["import"] = importBuffer.String() data["setup"] = setupBuffer.String() - return data } diff --git a/server/internal/library/hggen/views/utils.go b/server/internal/library/hggen/views/utils.go index 30e682a..29c8d82 100644 --- a/server/internal/library/hggen/views/utils.go +++ b/server/internal/library/hggen/views/utils.go @@ -1,4 +1,4 @@ -// Package hggen +// Package views // @Link https://github.com/bufanyun/hotgo // @Copyright Copyright (c) 2022 HotGo CLI // @Author Ms <133814250@qq.com> @@ -8,9 +8,12 @@ package views import ( "context" + "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gstr" "hotgo/internal/consts" + "hotgo/internal/model" "hotgo/internal/model/input/sysin" "io/ioutil" "strings" @@ -94,3 +97,41 @@ func ImportSql(ctx context.Context, path string) error { return nil } + +func checkCurdPath(temp *model.GenerateAppCrudTemplate) (err error) { + if temp == nil { + return gerror.New("生成模板配置不能为空") + } + + tip := `生成模板配置参数'%s'路径不存在,请先创建路径` + + if !gfile.Exists(temp.TemplatePath) { + return gerror.Newf(tip, "TemplatePath") + } + if !gfile.Exists(temp.ApiPath) { + return gerror.Newf(tip, "ApiPath") + } + if !gfile.Exists(temp.InputPath) { + return gerror.Newf(tip, "InputPath") + } + if !gfile.Exists(temp.ControllerPath) { + return gerror.Newf(tip, "ControllerPath") + } + if !gfile.Exists(temp.LogicPath) { + return gerror.Newf(tip, "LogicPath") + } + if !gfile.Exists(temp.RouterPath) { + return gerror.Newf(tip, "RouterPath") + } + if !gfile.Exists(temp.SqlPath) { + return gerror.Newf(tip, "SqlPath") + } + if !gfile.Exists(temp.WebApiPath) { + return gerror.Newf(tip, "WebApiPath") + } + if !gfile.Exists(temp.WebViewsPath) { + return gerror.Newf(tip, "WebViewsPath") + } + + return +} diff --git a/server/internal/library/hgorm/dao.go b/server/internal/library/hgorm/dao.go index 82febe1..3f58f27 100644 --- a/server/internal/library/hgorm/dao.go +++ b/server/internal/library/hgorm/dao.go @@ -19,15 +19,6 @@ import ( "hotgo/utility/tree" ) -// GenJoinOnRelation 生成关联表关联条件 -func GenJoinOnRelation(masterTable, masterField, joinTable, alias, onField string) []string { - return []string{ - joinTable, - alias, - fmt.Sprintf("`%s`.`%s` = `%s`.`%s`", alias, onField, masterTable, masterField), - } -} - type daoInstance interface { Table() string Ctx(ctx context.Context) *gdb.Model @@ -40,6 +31,15 @@ type Join struct { fields map[string]*gdb.TableField // 表字段列表 } +// GenJoinOnRelation 生成关联表关联条件 +func GenJoinOnRelation(masterTable, masterField, joinTable, alias, onField string) []string { + return []string{ + joinTable, + alias, + fmt.Sprintf("`%s`.`%s` = `%s`.`%s`", alias, onField, masterTable, masterField), + } +} + // GenJoinSelect 生成关联表select // 这里会将实体中的字段驼峰转为下划线于数据库进行匹配,意味着数据库字段必须全部是小写字母+下划线的格式 func GenJoinSelect(ctx context.Context, entity interface{}, masterDao interface{}, joins []*Join) (allFields string, err error) { diff --git a/server/internal/library/hgorm/handler.go b/server/internal/library/hgorm/handler/filter_auth.go similarity index 53% rename from server/internal/library/hgorm/handler.go rename to server/internal/library/hgorm/handler/filter_auth.go index a35e40a..315eea8 100644 --- a/server/internal/library/hgorm/handler.go +++ b/server/internal/library/hgorm/handler/filter_auth.go @@ -1,14 +1,6 @@ -// Package hgorm -// @Link https://github.com/bufanyun/hotgo -// @Copyright Copyright (c) 2022 HotGo CLI -// @Author Ms <133814250@qq.com> -// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// -package hgorm +package handler -// 预处理 import ( - "fmt" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/text/gstr" @@ -18,22 +10,15 @@ import ( "hotgo/utility/tree" ) -// HandlerFilterAuth 过滤数据权限 +// FilterAuth 过滤数据权限 // 通过上下文中的用户角色权限和表中是否含有需要过滤的字段附加查询条件 -func HandlerFilterAuth(m *gdb.Model) *gdb.Model { +func FilterAuth(m *gdb.Model) *gdb.Model { var ( needAuth bool filterField string - role *entity.AdminRole - ctx = m.GetCtx() fields = escapeFieldsToSlice(m.GetFieldsStr()) - co = contexts.Get(ctx) ) - if co == nil || co.User == nil { - return m - } - // 优先级:created_by > member_id if gstr.InArray(fields, "created_by") { needAuth = true @@ -49,43 +34,54 @@ func HandlerFilterAuth(m *gdb.Model) *gdb.Model { return m } - err := g.Model("admin_role").Where("id", co.User.RoleId).Scan(&role) - if err != nil { - panic(fmt.Sprintf("failed to role information err:%+v", err)) - } - - if role == nil { - panic("failed to role information roleModel == nil") - } - - sq := g.Model("admin_member").Fields("id") - - switch role.DataScope { - case consts.RoleDataAll: // 全部权限 - // ... - case consts.RoleDataNowDept: // 当前部门 - m = m.WhereIn(filterField, sq.Where("dept_id", co.User.DeptId)) - case consts.RoleDataDeptAndSub: // 当前部门及以下部门 - m = m.WhereIn(filterField, sq.WhereIn("dept_id", GetDeptAndSub(co.User.DeptId))) - case consts.RoleDataDeptCustom: // 自定义部门 - m = m.WhereIn(filterField, sq.WhereIn("dept_id", role.CustomDept.Var().Ints())) - case consts.RoleDataSelf: // 仅自己 - m = m.Where(filterField, co.User.Id) - case consts.RoleDataSelfAndSub: // 自己和直属下级 - m = m.WhereIn(filterField, GetSelfAndSub(co.User.Id)) - case consts.RoleDataSelfAndAllSub: // 自己和全部下级 - m = m.WhereIn(filterField, GetSelfAndAllSub(co.User.Id)) - - default: - panic("dataScope is not registered") - } - - return m + return m.Handler(FilterAuthWithField(filterField)) } -// HandlerForceCache 强制缓存 -func HandlerForceCache(m *gdb.Model) *gdb.Model { - return m.Cache(gdb.CacheOption{Duration: -1, Force: true}) +// FilterAuthWithField 过滤数据权限,设置指定字段 +func FilterAuthWithField(filterField string) func(m *gdb.Model) *gdb.Model { + return func(m *gdb.Model) *gdb.Model { + var ( + role *entity.AdminRole + ctx = m.GetCtx() + co = contexts.Get(ctx) + ) + + if co == nil || co.User == nil { + return m + } + + err := g.Model("admin_role").Where("id", co.User.RoleId).Scan(&role) + if err != nil { + g.Log().Fatalf(ctx, "failed to role information err:%+v", err) + } + + if role == nil { + g.Log().Fatalf(ctx, "failed to role information roleModel == nil") + } + + sq := g.Model("admin_member").Fields("id") + + switch role.DataScope { + case consts.RoleDataAll: // 全部权限 + // ... + case consts.RoleDataNowDept: // 当前部门 + m = m.WhereIn(filterField, sq.Where("dept_id", co.User.DeptId)) + case consts.RoleDataDeptAndSub: // 当前部门及以下部门 + m = m.WhereIn(filterField, sq.WhereIn("dept_id", GetDeptAndSub(co.User.DeptId))) + case consts.RoleDataDeptCustom: // 自定义部门 + m = m.WhereIn(filterField, sq.WhereIn("dept_id", role.CustomDept.Var().Ints())) + case consts.RoleDataSelf: // 仅自己 + m = m.Where(filterField, co.User.Id) + case consts.RoleDataSelfAndSub: // 自己和直属下级 + m = m.WhereIn(filterField, GetSelfAndSub(co.User.Id)) + case consts.RoleDataSelfAndAllSub: // 自己和全部下级 + m = m.WhereIn(filterField, GetSelfAndAllSub(co.User.Id)) + default: + g.Log().Fatalf(ctx, "dataScope is not registered") + } + + return m + } } // escapeFieldsToSlice 将转义过的字段转换为字段集切片 diff --git a/server/internal/library/hgorm/handler/force_cache.go b/server/internal/library/hgorm/handler/force_cache.go new file mode 100644 index 0000000..a6eaf62 --- /dev/null +++ b/server/internal/library/hgorm/handler/force_cache.go @@ -0,0 +1,8 @@ +package handler + +import "github.com/gogf/gf/v2/database/gdb" + +// ForceCache 强制缓存 +func ForceCache(m *gdb.Model) *gdb.Model { + return m.Cache(gdb.CacheOption{Duration: -1, Force: true}) +} diff --git a/server/internal/library/hgorm/handler/handler.go b/server/internal/library/hgorm/handler/handler.go new file mode 100644 index 0000000..885feba --- /dev/null +++ b/server/internal/library/hgorm/handler/handler.go @@ -0,0 +1,39 @@ +// Package handler +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2022 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// +package handler + +// handler. +import ( + "github.com/gogf/gf/v2/database/gdb" +) + +// Option 预处理选项 +type Option struct { + FilterAuth bool // 过滤权限 + ForceCache bool // 强制缓存 +} + +// DefaultOption 默认预处理选项 +var DefaultOption = &Option{ + FilterAuth: true, +} + +func Model(m *gdb.Model, opt ...*Option) *gdb.Model { + var option *Option + if len(opt) > 0 { + option = opt[0] + } else { + option = DefaultOption + } + if option.FilterAuth { + m = m.Handler(FilterAuth) + } + if option.ForceCache { + m = m.Handler(ForceCache) + } + return m +} diff --git a/server/internal/library/hgorm/hook.go b/server/internal/library/hgorm/hook.go deleted file mode 100644 index 8a4c45e..0000000 --- a/server/internal/library/hgorm/hook.go +++ /dev/null @@ -1,9 +0,0 @@ -// Package hgorm -// @Link https://github.com/bufanyun/hotgo -// @Copyright Copyright (c) 2022 HotGo CLI -// @Author Ms <133814250@qq.com> -// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// -package hgorm - -// 常用钩子 diff --git a/server/internal/library/hgorm/hook/hook.go b/server/internal/library/hgorm/hook/hook.go new file mode 100644 index 0000000..2b894e6 --- /dev/null +++ b/server/internal/library/hgorm/hook/hook.go @@ -0,0 +1,3 @@ +package hook + +// hook. diff --git a/server/internal/library/hgorm/hook/member.go b/server/internal/library/hgorm/hook/member.go new file mode 100644 index 0000000..ce1f3da --- /dev/null +++ b/server/internal/library/hgorm/hook/member.go @@ -0,0 +1,58 @@ +package hook + +import ( + "context" + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// MemberInfo 后台用户信息 +var MemberInfo = gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + for i, record := range result { + // 部门 + if !record["dept_id"].IsEmpty() { + deptName, err := g.Model("admin_dept").Ctx(ctx). + Fields("name"). + Where("id", record["dept_id"]). + Value() + if err != nil { + break + } + record["deptName"] = deptName + } + + // 角色 + if !record["role_id"].IsEmpty() { + roleName, err := g.Model("admin_role").Ctx(ctx). + Fields("name"). + Where("id", record["role_id"]). + Value() + if err != nil { + break + } + record["roleName"] = roleName + } + + if !record["password_hash"].IsEmpty() { + record["password_hash"] = gvar.New("") + } + + if !record["salt"].IsEmpty() { + record["salt"] = gvar.New("") + } + + if !record["auth_key"].IsEmpty() { + record["auth_key"] = gvar.New("") + } + + result[i] = record + } + return + }, +} diff --git a/server/internal/library/hgorm/hook/provinces.go b/server/internal/library/hgorm/hook/provinces.go new file mode 100644 index 0000000..0cf0c1f --- /dev/null +++ b/server/internal/library/hgorm/hook/provinces.go @@ -0,0 +1,59 @@ +package hook + +import ( + "context" + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/library/location" +) + +// CityLabel 城市地区标签 +var CityLabel = gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + + parse := func(id int64, index int) { + cityLabel, err := location.ParseSimpleRegion(ctx, id) + if err != nil { + g.Log().Warningf(ctx, "hook.CityLabel parse err:%+v", err) + } + result[index]["cityLabel"] = gvar.New(cityLabel) + return + } + + for i, record := range result { + // 优先级: 区 > 市 > 省 + + cityId, ok := record["city_id"] + if ok && !cityId.IsEmpty() { + parse(cityId.Int64(), i) + continue + } + + provinceId, ok := record["province_id"] + if ok && !provinceId.IsEmpty() { + parse(cityId.Int64(), i) + continue + } + + // 以下是默认关联表 省市区字段 + + sysLogCityId, ok := record["sysLogCityId"] + if ok && !sysLogCityId.IsEmpty() { + parse(sysLogCityId.Int64(), i) + continue + } + + sysLogProvinceId, ok := record["sysLogProvinceId"] + if ok && !sysLogProvinceId.IsEmpty() { + parse(cityId.Int64(), i) + continue + } + } + return + }, +} diff --git a/server/internal/library/jwt/jwt.go b/server/internal/library/jwt/jwt.go index 1a39d5c..09dcb90 100644 --- a/server/internal/library/jwt/jwt.go +++ b/server/internal/library/jwt/jwt.go @@ -38,12 +38,9 @@ func GenerateLoginToken(ctx context.Context, user *model.Identity, isRefresh boo "avatar": user.Avatar, "email": user.Email, "mobile": user.Mobile, - "lastTime": user.LastTime, - "lastIp": user.LastIp, "exp": user.Exp, "expires": user.Expires, "app": user.App, - "visitCount": user.VisitCount, "isRefresh": isRefresh, "jwtVersion": jwtVersion.String(), }) diff --git a/server/internal/library/location/geocode.go b/server/internal/library/location/geocode.go index c120bc6..ccb5575 100644 --- a/server/internal/library/location/geocode.go +++ b/server/internal/library/location/geocode.go @@ -46,8 +46,8 @@ type AddressRegion struct { CountyCode string `json:"countyCode"` } -// AnalysisAddress 将地址解析出省市区编码 -func AnalysisAddress(ctx context.Context, address, key string) (region *AddressRegion, err error) { +// ParseAddress 将地址解析出省市区编码 +func ParseAddress(ctx context.Context, address, key string) (region *AddressRegion, err error) { var ( url = fmt.Sprintf("https://restapi.amap.com/v3/geocode/geo?address=%v&output=JSON&key=%v", address, key) responseMap = make(g.Map) diff --git a/server/internal/library/location/location.go b/server/internal/library/location/location.go index 076f421..1373c9e 100644 --- a/server/internal/library/location/location.go +++ b/server/internal/library/location/location.go @@ -141,12 +141,12 @@ func GetPublicIP(ctx context.Context) (ip string, err error) { var data *WhoisRegionData err = g.Client().Timeout(10*time.Second).GetVar(ctx, whoisApi).Scan(&data) if err != nil { - g.Log().Warningf(ctx, "GetPublicIP alternatives are being tried err:%+v", err) + g.Log().Infof(ctx, "GetPublicIP alternatives are being tried err:%+v", err) return GetPublicIP2() } if data == nil { - g.Log().Warningf(ctx, "publicIP address Parsing failure, check the network and firewall blocking.") + g.Log().Infof(ctx, "publicIP address Parsing failure, check the network and firewall blocking.") return "0.0.0.0", nil } return data.Ip, nil diff --git a/server/internal/library/location/region.go b/server/internal/library/location/region.go new file mode 100644 index 0000000..cf6cdba --- /dev/null +++ b/server/internal/library/location/region.go @@ -0,0 +1,104 @@ +package location + +import ( + "context" + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/consts" + "hotgo/internal/model/entity" + "hotgo/utility/tree" +) + +// ParseSimpleRegion 通过地区ID解析地区名称,自动加入上级地区 +func ParseSimpleRegion(ctx context.Context, id int64, spilt ...string) (string, error) { + if id == 0 { + return "", nil + } + var ( + models *entity.SysProvinces + err error + ) + + if err = g.Model("sys_provinces").Ctx(ctx).Fields("title,level,tree").Where("id", id).Scan(&models); err != nil { + return "", err + } + + if models == nil { + return "", gerror.Newf("the area code :%v is not in the database", id) + } + + if models.Level == 1 { + return models.Title, nil + } + + ids := tree.GetIds(models.Tree) + + if models.Level == 2 { + if len(ids) != 1 { + return "", gerror.Newf("the region code is incorrectly configured, models:%+v, ids:%v", models, ids) + } + return ParseRegion(ctx, ids[0], id, 0, spilt...) + } + + if models.Level == 3 { + if len(ids) != 2 { + return "", gerror.Newf("the region code is incorrectly configured, models:%+v, ids:%v", models, ids) + } + return ParseRegion(ctx, ids[0], ids[1], id, spilt...) + } + + return "", gerror.New("currently, it is only supported to regional areas") +} + +// ParseRegion 解析省市编码对应的地区名称 +func ParseRegion(ctx context.Context, province int64, city int64, county int64, spilt ...string) (string, error) { + var ( + provinceName *gvar.Var + cityName *gvar.Var + countyName *gvar.Var + err error + ) + + // 分隔符 + sp := consts.RegionSpilt + if len(spilt) > 0 { + sp = spilt[0] + } + + if province > 0 && province < 999999 { + provinceName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", province).Fields("title").Value() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return "", err + } + + if city > 0 { + cityName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", city).Fields("title").Value() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return "", err + } + } + + if county > 0 { + countyName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", county).Fields("title").Value() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return "", err + } + } + } else { + return "保留地址", nil + } + + if province > 0 && city > 0 && county > 0 { + return provinceName.String() + sp + cityName.String() + sp + countyName.String(), nil + } + + if province > 0 && city > 0 { + return provinceName.String() + sp + cityName.String(), nil + } + + return provinceName.String(), nil +} diff --git a/server/internal/library/queue/init.go b/server/internal/library/queue/init.go index 64a281a..91b47ed 100644 --- a/server/internal/library/queue/init.go +++ b/server/internal/library/queue/init.go @@ -79,8 +79,9 @@ var ( func init() { mqProducerInstanceMap = make(map[string]MqProducer) mqConsumerInstanceMap = make(map[string]MqConsumer) - get := g.Cfg().MustGet(ctx, "queue") - get.Scan(&config) + if err := g.Cfg().MustGet(ctx, "queue").Scan(&config); err != nil { + g.Log().Infof(ctx, "queue init err:%+v", err) + } } // InstanceConsumer 实例化消费者 @@ -100,30 +101,34 @@ func NewProducer(groupName string) (mqClient MqProducer, err error) { } if groupName == "" { - return mqClient, gerror.New("mq groupName is empty.") + err = gerror.New("mq groupName is empty.") + return } switch config.Driver { case "rocketmq": if len(config.Rocketmq.Address) == 0 { - g.Log().Fatal(ctx, "queue rocketmq address is not support") + err = gerror.New("queue rocketmq address is not support") + return } - mqClient = RegisterRocketProducerMust(config.Rocketmq.Address, groupName, config.Retry) + mqClient, err = RegisterRocketProducer(config.Rocketmq.Address, groupName, config.Retry) case "kafka": if len(config.Kafka.Address) == 0 { - g.Log().Fatal(ctx, "queue kafka address is not support") + err = gerror.New("queue kafka address is not support") + return } - mqClient = RegisterKafkaProducerMust(KafkaConfig{ + mqClient, err = RegisterKafkaProducer(KafkaConfig{ Brokers: config.Kafka.Address, GroupID: groupName, Version: config.Kafka.Version, }) case "redis": - address := g.Cfg().MustGet(ctx, "queue.redis.address", nil) - if len(address.String()) == 0 { - g.Log().Fatal(ctx, "queue redis address is not support") + address := g.Cfg().MustGet(ctx, "queue.redis.address", nil).String() + if len(address) == 0 { + err = gerror.New("queue redis address is not support") + return } - mqClient = RegisterRedisMqProducerMust(RedisOption{ + mqClient, err = RegisterRedisMqProducer(RedisOption{ Addr: config.Redis.Address, Passwd: config.Redis.Pass, DBnum: config.Redis.Db, @@ -133,14 +138,18 @@ func NewProducer(groupName string) (mqClient MqProducer, err error) { }, groupName, config.Retry) default: - g.Log().Fatal(ctx, "queue driver is not support") + err = gerror.New("queue driver is not support") + } + + if err != nil { + return } mutex.Lock() defer mutex.Unlock() mqProducerInstanceMap[groupName] = mqClient - return mqClient, nil + return } // NewConsumer 初始化消费者实例 @@ -157,18 +166,21 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) { } if groupName == "" { - return mqClient, gerror.New("mq groupName is empty.") + err = gerror.New("mq groupName is empty.") + return } switch config.Driver { case "rocketmq": if len(config.Rocketmq.Address) == 0 { - return nil, gerror.New("queue.rocketmq.address is empty.") + err = gerror.New("queue.rocketmq.address is empty.") + return } - mqClient = RegisterRocketConsumerMust(config.Rocketmq.Address, groupName) + mqClient, err = RegisterRocketConsumer(config.Rocketmq.Address, groupName) case "kafka": if len(config.Kafka.Address) == 0 { - g.Log().Fatal(ctx, "queue kafka address is not support") + err = gerror.New("queue kafka address is not support") + return } clientId := "HOTGO-Consumer-" + groupName @@ -176,7 +188,7 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) { clientId += "-" + randTag } - mqClient = RegisterKafkaMqConsumerMust(KafkaConfig{ + mqClient, err = RegisterKafkaMqConsumer(KafkaConfig{ Brokers: config.Kafka.Address, GroupID: groupName, Version: config.Kafka.Version, @@ -184,10 +196,11 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) { }) case "redis": if len(config.Redis.Address) == 0 { - g.Log().Fatal(ctx, "queue redis address is not support") + err = gerror.New("queue redis address is not support") + return } - mqClient = RegisterRedisMqConsumerMust(RedisOption{ + mqClient, err = RegisterRedisMqConsumer(RedisOption{ Addr: config.Redis.Address, Passwd: config.Redis.Pass, DBnum: config.Redis.Db, @@ -196,14 +209,18 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) { 5, 50, 5, }, groupName) default: - g.Log().Fatal(ctx, "queue driver is not support") + err = gerror.New("queue driver is not support") + } + + if err != nil { + return } mutex.Lock() defer mutex.Unlock() mqConsumerInstanceMap[groupName] = mqClient - return mqClient, nil + return } // BodyString 返回消息体 diff --git a/server/internal/library/queue/kafkamq.go b/server/internal/library/queue/kafkamq.go index 98791c7..63f90ad 100644 --- a/server/internal/library/queue/kafkamq.go +++ b/server/internal/library/queue/kafkamq.go @@ -48,12 +48,13 @@ func (r *KafkaMq) SendByteMsg(topic string, body []byte) (mqMsg MqMsg, err error } if r.producerIns == nil { - return mqMsg, gerror.New("queue kafka producerIns is nil") + err = gerror.New("queue kafka producerIns is nil") + return } r.producerIns.Input() <- msg - ctx, cancle := context.WithTimeout(context.Background(), 5*time.Second) - defer cancle() + sendCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() select { case info := <-r.producerIns.Successes(): @@ -68,7 +69,7 @@ func (r *KafkaMq) SendByteMsg(topic string, body []byte) (mqMsg MqMsg, err error if nil != fail { return mqMsg, fail.Err } - case <-ctx.Done(): + case <-sendCtx.Done(): return mqMsg, gerror.New("send mqMst timeout") } @@ -86,22 +87,23 @@ func (r *KafkaMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg)) receiveDoFun: receiveDo, } - ctx, cancel := context.WithCancel(context.Background()) - go func(ctx context.Context) { + consumerCtx, cancel := context.WithCancel(context.Background()) + go func(consumerCtx context.Context) { for { - if err := r.consumerIns.Consume(ctx, []string{topic}, &consumer); err != nil { + if err = r.consumerIns.Consume(consumerCtx, []string{topic}, &consumer); err != nil { g.Log().Fatalf(ctx, "kafka Error from consumer, err%+v", err) } - if ctx.Err() != nil { - g.Log().Debugf(ctx, fmt.Sprintf("kafka consoumer stop : %v", ctx.Err())) + if consumerCtx.Err() != nil { + g.Log().Debugf(ctx, fmt.Sprintf("kafka consoumer stop : %v", consumerCtx.Err())) return } consumer.ready = make(chan bool) } - }(ctx) + }(consumerCtx) - <-consumer.ready // Await till the consumer has been set up + // await till the consumer has been set up + <-consumer.ready g.Log().Debug(ctx, "kafka consumer up and running!...") signal.AppDefer(func() { @@ -115,85 +117,94 @@ func (r *KafkaMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg)) return } -// RegisterKafkaMqConsumerMust 注册消费者 -func RegisterKafkaMqConsumerMust(connOpt KafkaConfig) (client MqConsumer) { +// RegisterKafkaMqConsumer 注册消费者 +func RegisterKafkaMqConsumer(connOpt KafkaConfig) (client MqConsumer, err error) { mqIns := &KafkaMq{} - kfkVersion, _ := sarama.ParseKafkaVersion(connOpt.Version) + kfkVersion, err := sarama.ParseKafkaVersion(connOpt.Version) + if err != nil { + return + } if validateVersion(kfkVersion) == false { kfkVersion = sarama.V2_4_0_0 } brokers := connOpt.Brokers - config := sarama.NewConfig() - config.Consumer.Return.Errors = true - config.Version = kfkVersion + conf := sarama.NewConfig() + conf.Consumer.Return.Errors = true + conf.Version = kfkVersion if connOpt.UserName != "" { - config.Net.SASL.Enable = true - config.Net.SASL.User = connOpt.UserName - config.Net.SASL.Password = connOpt.Password + conf.Net.SASL.Enable = true + conf.Net.SASL.User = connOpt.UserName + conf.Net.SASL.Password = connOpt.Password } // 默认按随机方式消费 - config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange - config.Consumer.Offsets.Initial = sarama.OffsetNewest - config.Consumer.Offsets.AutoCommit.Interval = 10 * time.Millisecond - config.ClientID = connOpt.ClientId + conf.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange + conf.Consumer.Offsets.Initial = sarama.OffsetNewest + conf.Consumer.Offsets.AutoCommit.Interval = 10 * time.Millisecond + conf.ClientID = connOpt.ClientId - consumerClient, err := sarama.NewConsumerGroup(brokers, connOpt.GroupID, config) + consumerClient, err := sarama.NewConsumerGroup(brokers, connOpt.GroupID, conf) if err != nil { - g.Log().Fatal(ctx, err) + return } mqIns.consumerIns = consumerClient - return mqIns + return mqIns, err } -// RegisterKafkaProducerMust 注册并启动生产者接口实现 -func RegisterKafkaProducerMust(connOpt KafkaConfig) (client MqProducer) { +// RegisterKafkaProducer 注册并启动生产者接口实现 +func RegisterKafkaProducer(connOpt KafkaConfig) (client MqProducer, err error) { mqIns := &KafkaMq{} - connOpt.ClientId = "HOTGO-Producer" - RegisterKafkaProducer(connOpt, mqIns) //这里如果使用go程需要处理chan同步问题 - return mqIns + // 这里如果使用go程需要处理chan同步问题 + if err = doRegisterKafkaProducer(connOpt, mqIns); err != nil { + return nil, err + } + + return mqIns, nil } -// RegisterKafkaProducer 注册同步类型实例 -func RegisterKafkaProducer(connOpt KafkaConfig, mqIns *KafkaMq) { - kfkVersion, _ := sarama.ParseKafkaVersion(connOpt.Version) +// doRegisterKafkaProducer 注册同步类型实例 +func doRegisterKafkaProducer(connOpt KafkaConfig, mqIns *KafkaMq) (err error) { + kfkVersion, err := sarama.ParseKafkaVersion(connOpt.Version) + if err != nil { + return + } if validateVersion(kfkVersion) == false { kfkVersion = sarama.V2_4_0_0 } brokers := connOpt.Brokers - config := sarama.NewConfig() + conf := sarama.NewConfig() // 等待服务器所有副本都保存成功后的响应 - config.Producer.RequiredAcks = sarama.WaitForAll + conf.Producer.RequiredAcks = sarama.WaitForAll // 随机向partition发送消息 - config.Producer.Partitioner = sarama.NewRandomPartitioner + conf.Producer.Partitioner = sarama.NewRandomPartitioner // 是否等待成功和失败后的响应,只有上面的RequireAcks设置不是NoReponse这里才有用. - config.Producer.Return.Successes = true + conf.Producer.Return.Successes = true - config.Producer.Return.Errors = true - config.Producer.Compression = sarama.CompressionNone - config.ClientID = connOpt.ClientId + conf.Producer.Return.Errors = true + conf.Producer.Compression = sarama.CompressionNone + conf.ClientID = connOpt.ClientId - config.Version = kfkVersion + conf.Version = kfkVersion if connOpt.UserName != "" { - config.Net.SASL.Enable = true - config.Net.SASL.User = connOpt.UserName - config.Net.SASL.Password = connOpt.Password + conf.Net.SASL.Enable = true + conf.Net.SASL.User = connOpt.UserName + conf.Net.SASL.Password = connOpt.Password } - var err error - mqIns.producerIns, err = sarama.NewAsyncProducer(brokers, config) + mqIns.producerIns, err = sarama.NewAsyncProducer(brokers, conf) if err != nil { - g.Log().Fatal(ctx, err) + return } signal.AppDefer(func() { g.Log().Debug(ctx, "kafka producer AsyncClose...") mqIns.producerIns.AsyncClose() }) + return } // validateVersion 验证版本是否有效 diff --git a/server/internal/library/queue/push.go b/server/internal/library/queue/push.go index 4ea38df..775e72e 100644 --- a/server/internal/library/queue/push.go +++ b/server/internal/library/queue/push.go @@ -1,7 +1,6 @@ package queue import ( - "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" ) @@ -9,8 +8,7 @@ import ( func Push(topic string, data interface{}) (err error) { q, err := InstanceProducer() if err != nil { - g.Log().Fatalf(ctx, "queue.InstanceProducer err:%+v", err) - return err + return } mqMsg, err := q.SendMsg(topic, gconv.String(data)) ProducerLog(ctx, topic, mqMsg.MsgId, err) diff --git a/server/internal/library/queue/redismq.go b/server/internal/library/queue/redismq.go index 0d4c51b..627fa2b 100644 --- a/server/internal/library/queue/redismq.go +++ b/server/internal/library/queue/redismq.go @@ -146,25 +146,23 @@ func (r *RedisMq) loopReadQueue(queueName string) (mqMsgList []MqMsg) { return mqMsgList } -func RegisterRedisMqProducerMust(connOpt RedisOption, poolOpt PoolOption, groupName string, retry int) (client MqProducer) { - var err error +func RegisterRedisMqProducer(connOpt RedisOption, poolOpt PoolOption, groupName string, retry int) (client MqProducer, err error) { client, err = RegisterRedisMq(connOpt, poolOpt, groupName, retry) if err != nil { - g.Log().Fatal(ctx, "RegisterRedisMqProducerMust err:%+v", err) + err = gerror.Newf("RegisterRedisMqProducer err:%+v", err) return } - return client + return } -// RegisterRedisMqConsumerMust 注册消费者 -func RegisterRedisMqConsumerMust(connOpt RedisOption, poolOpt PoolOption, groupName string) (client MqConsumer) { - var err error +// RegisterRedisMqConsumer 注册消费者 +func RegisterRedisMqConsumer(connOpt RedisOption, poolOpt PoolOption, groupName string) (client MqConsumer, err error) { client, err = RegisterRedisMq(connOpt, poolOpt, groupName, 0) if err != nil { - g.Log().Fatal(ctx, "RegisterRedisMqConsumerMust err:%+v", err) + err = gerror.Newf("RegisterRedisMqConsumer err:%+v", err) return } - return client + return } // RegisterRedisMq 注册redis实例 @@ -200,12 +198,12 @@ func registerRedis(host, pass string, dbNum int, opt PoolOption) (poolName strin return nil, err } if pass != "" { - if _, err := conn.Do("AUTH", pass); err != nil { + if _, err = conn.Do("AUTH", pass); err != nil { return nil, err } } if dbNum > 0 { - if _, err := conn.Do("SELECT", dbNum); err != nil { + if _, err = conn.Do("SELECT", dbNum); err != nil { return nil, err } } @@ -270,19 +268,20 @@ func getRedis(poolName string, retry int) (db redis.Conn, put func(), err error) if err != nil { return nil, put, err } + put = func() { - redisPool.Put(conn) + if err = redisPool.Put(conn); err != nil { + return + } } db = conn.(redis.Conn) return db, put, nil } -func getRandMsgId() (msgId string) { +func getRandMsgId() string { rand.Seed(time.Now().UnixNano()) radium := rand.Intn(999) + 1 timeCode := time.Now().UnixNano() - - msgId = fmt.Sprintf("%d%.4d", timeCode, radium) - return msgId + return fmt.Sprintf("%d%.4d", timeCode, radium) } diff --git a/server/internal/library/queue/rocketmq.go b/server/internal/library/queue/rocketmq.go index a5bfb0e..60e246e 100644 --- a/server/internal/library/queue/rocketmq.go +++ b/server/internal/library/queue/rocketmq.go @@ -26,30 +26,27 @@ type RocketMq struct { // rewriteLog 重写日志 func rewriteLog() { - level := g.Cfg().MustGet(ctx, "queue.rocketmq.logLevel", "debug").String() - rlog.SetLogger(&RocketMqLogger{Flag: "[rocket_mq]", LevelLog: level}) + rlog.SetLogger(&RocketMqLogger{Flag: "[rocket_mq]", LevelLog: g.Cfg().MustGet(ctx, "queue.rocketmq.logLevel", "debug").String()}) } -// RegisterRocketProducerMust 注册并启动生产者接口实现 -func RegisterRocketProducerMust(endPoints []string, groupName string, retry int) (client MqProducer) { +// RegisterRocketProducer 注册并启动生产者接口实现 +func RegisterRocketProducer(endPoints []string, groupName string, retry int) (client MqProducer, err error) { rewriteLog() - var err error client, err = RegisterRocketMqProducer(endPoints, groupName, retry) if err != nil { - panic(err) + return } - return client + return } -// RegisterRocketConsumerMust 注册消费者 -func RegisterRocketConsumerMust(endPoints []string, groupName string) (client MqConsumer) { +// RegisterRocketConsumer 注册消费者 +func RegisterRocketConsumer(endPoints []string, groupName string) (client MqConsumer, err error) { rewriteLog() - var err error client, err = RegisterRocketMqConsumer(endPoints, groupName) if err != nil { - panic(err) + return } - return client + return } // SendMsg 按字符串类型生产数据 @@ -90,8 +87,7 @@ func (r *RocketMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg)) return errors.New("RocketMq consumer not register") } - err = r.consumerIns.Subscribe(topic, consumer.MessageSelector{}, func(ctx context.Context, - msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) { + err = r.consumerIns.Subscribe(topic, consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) { for _, item := range msgs { go receiveDo(MqMsg{ RunType: ReceiveMsg, diff --git a/server/internal/logic/admin/member.go b/server/internal/logic/admin/member.go index b71ad19..37cd965 100644 --- a/server/internal/logic/admin/member.go +++ b/server/internal/logic/admin/member.go @@ -9,25 +9,26 @@ package admin import ( "context" "github.com/gogf/gf/v2/crypto/gmd5" - "github.com/gogf/gf/v2/encoding/gbase64" + "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/grand" - "hotgo/api/backend/member" "hotgo/internal/consts" "hotgo/internal/dao" "hotgo/internal/library/contexts" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/library/hgorm/hook" "hotgo/internal/library/jwt" - "hotgo/internal/library/location" "hotgo/internal/model" "hotgo/internal/model/do" "hotgo/internal/model/entity" "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/sysin" "hotgo/internal/service" - "hotgo/utility/encrypt" + "hotgo/utility/simple" "hotgo/utility/tree" "hotgo/utility/validate" ) @@ -42,7 +43,148 @@ func init() { service.RegisterAdminMember(NewAdminMember()) } -// UpdateProfile 更新会员资料 +// UpdateCash 修改提现信息 +func (s *sAdminMember) UpdateCash(ctx context.Context, in adminin.MemberUpdateCashInp) (err error) { + memberId := contexts.Get(ctx).User.Id + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + var memberInfo entity.AdminMember + if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return + } + + if gmd5.MustEncryptString(in.Password+memberInfo.Salt) != memberInfo.PasswordHash { + err = gerror.New("登录密码不正确") + return + } + + _, err = dao.AdminMember.Ctx(ctx). + Where("id", memberId). + Data(g.Map{ + "cash": adminin.MemberCash{ + Name: in.Name, + Account: in.Account, + PayeeCode: in.PayeeCode, + }, + }). + Update() + + return +} + +// UpdateEmail 换绑邮箱 +func (s *sAdminMember) UpdateEmail(ctx context.Context, in adminin.MemberUpdateEmailInp) (err error) { + memberId := contexts.Get(ctx).User.Id + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return err + } + + var memberInfo *entity.AdminMember + if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + if memberInfo == nil { + err = gerror.New("用户信息不存在") + return err + } + + if memberInfo.Email == in.Email { + err = gerror.New("新旧邮箱不能一样") + return + } + + if !validate.IsEmail(in.Email) { + err = gerror.New("邮箱地址不正确") + return + } + + // 存在原绑定号码,需要进行验证 + if memberInfo.Email != "" { + err = service.SysEmsLog().VerifyCode(ctx, sysin.VerifyEmsCodeInp{ + Event: consts.EmsTemplateBind, + Email: memberInfo.Email, + Code: in.Code, + }) + if err != nil { + return err + } + } + + update := g.Map{ + dao.AdminMember.Columns().Email: in.Email, + } + + _, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return +} + +// UpdateMobile 换绑手机号 +func (s *sAdminMember) UpdateMobile(ctx context.Context, in adminin.MemberUpdateMobileInp) (err error) { + memberId := contexts.Get(ctx).User.Id + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return err + } + + var memberInfo *entity.AdminMember + if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + if memberInfo == nil { + err = gerror.New("用户信息不存在") + return err + } + + if memberInfo.Mobile == in.Mobile { + err = gerror.New("新旧手机号不能一样") + return + } + + if !validate.IsMobile(in.Mobile) { + err = gerror.New("手机号码不正确") + return + } + + // 存在原绑定号码,需要进行验证 + if memberInfo.Mobile != "" { + err = service.SysSmsLog().VerifyCode(ctx, sysin.VerifyCodeInp{ + Event: consts.SmsTemplateBind, + Mobile: memberInfo.Mobile, + Code: in.Code, + }) + if err != nil { + return err + } + } + + update := g.Map{ + dao.AdminMember.Columns().Mobile: in.Mobile, + } + + _, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return +} + +// UpdateProfile 更新用户资料 func (s *sAdminMember) UpdateProfile(ctx context.Context, in adminin.MemberUpdateProfileInp) (err error) { memberId := contexts.Get(ctx).User.Id if memberId <= 0 { @@ -50,21 +192,28 @@ func (s *sAdminMember) UpdateProfile(ctx context.Context, in adminin.MemberUpdat return err } - var memberInfo entity.AdminMember + var memberInfo *entity.AdminMember if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err } - _, err = dao.AdminMember.Ctx(ctx). - Where("id", memberId). - Data(g.Map{ - "mobile": in.Mobile, - "email": in.Email, - "real_name": in.Realname, - }). - Update() + if memberInfo == nil { + err = gerror.New("用户信息不存在") + return err + } + update := g.Map{ + dao.AdminMember.Columns().Avatar: in.Avatar, + dao.AdminMember.Columns().RealName: in.RealName, + dao.AdminMember.Columns().Qq: in.Qq, + dao.AdminMember.Columns().Birthday: in.Birthday, + dao.AdminMember.Columns().Sex: in.Sex, + dao.AdminMember.Columns().CityId: in.CityId, + dao.AdminMember.Columns().Address: in.Address, + } + + _, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err @@ -104,19 +253,25 @@ func (s *sAdminMember) UpdatePwd(ctx context.Context, in adminin.MemberUpdatePwd // ResetPwd 重置密码 func (s *sAdminMember) ResetPwd(ctx context.Context, in adminin.MemberResetPwdInp) (err error) { var ( - memberInfo entity.AdminMember + memberInfo *entity.AdminMember memberId = contexts.GetUserId(ctx) ) - if err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Scan(&memberInfo); err != nil { + if err = s.FilterAuthModel(ctx, memberId).Where("id", in.Id).Scan(&memberInfo); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err } + + if memberInfo == nil { + err = gerror.New("用户信息不存在") + return err + } + if memberInfo.Pid != memberId && !s.VerifySuperId(ctx, memberId) { err = gerror.New("操作非法") return err } - _, err = dao.AdminMember.Ctx(ctx). + _, err = s.FilterAuthModel(ctx, memberId). Where("id", in.Id). Data(g.Map{ "password_hash": gmd5.MustEncryptString(in.Password + memberInfo.Salt), @@ -192,7 +347,7 @@ func (s *sAdminMember) Delete(ctx context.Context, in adminin.MemberDeleteInp) e return gerror.New("获取用户信息失败!") } - _, err := dao.AdminMember.Ctx(ctx).Where("id", in.Id).Where("pid", memberId).Delete() + _, err := s.FilterAuthModel(ctx, memberId).Where("id", in.Id).Delete() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err @@ -246,11 +401,7 @@ func (s *sAdminMember) Edit(ctx context.Context, in adminin.MemberEditInp) (err } // 权限验证 - var mm = dao.AdminMember.Ctx(ctx).Where("id", in.Id) - if !s.VerifySuperId(ctx, opMemberId) { - mm = mm.Where("pid", opMemberId) - } - + var mm = s.FilterAuthModel(ctx, opMemberId).Where("id", in.Id) _, err = mm.Data(in).Update() if err != nil { return gerror.Wrap(err, consts.ErrorORM) @@ -307,7 +458,7 @@ func (s *sAdminMember) MaxSort(ctx context.Context, in adminin.MemberMaxSortInp) // View 获取信息 func (s *sAdminMember) View(ctx context.Context, in adminin.MemberViewInp) (res *adminin.MemberViewModel, err error) { - if err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil { + if err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).Hook(hook.MemberInfo).Where("id", in.Id).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return nil, err } @@ -317,10 +468,9 @@ func (s *sAdminMember) View(ctx context.Context, in adminin.MemberViewInp) (res // List 获取列表 func (s *sAdminMember) List(ctx context.Context, in adminin.MemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) { - g.Log().Printf(ctx, "in:%#v", in) - mod := dao.AdminMember.Ctx(ctx) - if in.Realname != "" { - mod = mod.WhereLike("real_name", "%"+in.Realname+"%") + mod := s.FilterAuthModel(ctx, contexts.GetUserId(ctx)) + if in.RealName != "" { + mod = mod.WhereLike("real_name", "%"+in.RealName+"%") } if in.Username != "" { mod = mod.WhereLike("username", "%"+in.Username+"%") @@ -349,32 +499,11 @@ func (s *sAdminMember) List(ctx context.Context, in adminin.MemberListInp) (list return list, totalCount, nil } - if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil { + if err = mod.Hook(hook.MemberInfo).Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil { return nil, 0, gerror.Wrap(err, consts.ErrorORM) } - // 重写树入参 for i := 0; i < len(list); i++ { - // 部门 - deptName, err := dao.AdminDept.Ctx(ctx). - Fields("name"). - Where("id", list[i].DeptId). - Value() - if err != nil { - return nil, 0, gerror.Wrap(err, consts.ErrorORM) - } - list[i].DeptName = deptName.String() - - // 角色 - roleName, err := dao.AdminRole.Ctx(ctx). - Fields("name"). - Where("id", list[i].RoleId). - Value() - if err != nil { - return nil, 0, gerror.Wrap(err, consts.ErrorORM) - } - list[i].RoleName = roleName.String() - // 岗位 posts, err := dao.AdminMemberPost.Ctx(ctx). Fields("post_id"). @@ -414,27 +543,43 @@ func (s *sAdminMember) genTree(ctx context.Context, pid int64) (level int, newTr } // LoginMemberInfo 获取登录用户信息 -func (s *sAdminMember) LoginMemberInfo(ctx context.Context, req *member.InfoReq) (res *adminin.MemberLoginModel, err error) { - identity := contexts.Get(ctx).User - if identity == nil { +func (s *sAdminMember) LoginMemberInfo(ctx context.Context) (res *adminin.LoginMemberInfoModel, err error) { + var memberId = contexts.GetUserId(ctx) + if memberId <= 0 { err = gerror.New("用户身份异常,请重新登录!") return } - permissions, err := service.AdminMenu().LoginPermissions(ctx, identity.Id) + err = dao.AdminMember.Ctx(ctx). + Hook(hook.MemberInfo). + Where("id", memberId). + Scan(&res) if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) return } - res = &adminin.MemberLoginModel{ - UserId: identity.Id, - Username: identity.Username, - RealName: identity.RealName, - Avatar: identity.Avatar, - Permissions: permissions, - Token: jwt.GetAuthorization(ghttp.RequestFromCtx(ctx)), + if res == nil { + err = gerror.New("用户不存在!") + return } + // 细粒度权限 + permissions, err := service.AdminMenu().LoginPermissions(ctx, memberId) + if err != nil { + return + } + res.Permissions = permissions + + // 登录统计 + stat, err := s.MemberLoginStat(ctx, adminin.MemberLoginStatInp{MemberId: memberId}) + if err != nil { + return nil, err + } + res.MemberLoginStatModel = stat + + res.Mobile = gstr.HideStr(res.Mobile, 40, `*`) + res.Email = gstr.HideStr(res.Email, 40, `*`) return } @@ -443,11 +588,7 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re var ( roleInfo *entity.AdminRole memberInfo *entity.AdminMember - identity *model.Identity - timestamp = gtime.Timestamp() expires = g.Cfg().MustGet(ctx, "jwt.expires", 1).Int64() - exp = gconv.Int64(timestamp) + expires - lastIp = location.GetClientIp(ghttp.RequestFromCtx(ctx)) ) err = dao.AdminMember.Ctx(ctx).Where("username", in.Username).Scan(&memberInfo) @@ -465,18 +606,13 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re return } - // 解密密码 - password, err := gbase64.Decode([]byte(in.Password)) + err = simple.CheckPassword(in.Password, memberInfo.Salt, memberInfo.PasswordHash) if err != nil { - return nil, err - } - password, err = encrypt.AesECBDecrypt(password, consts.RequestEncryptKey) - if err != nil { - return nil, err + return } - if memberInfo.PasswordHash != gmd5.MustEncryptString(string(password)+memberInfo.Salt) { - err = gerror.New("用户密码不正确") + if memberInfo.Status != consts.StatusEnabled { + err = gerror.New("账号已被禁用") return } @@ -494,27 +630,24 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re } if roleInfo.Status != consts.StatusEnabled { - err = gerror.New("角色权限已被禁用") + err = gerror.New("角色已被禁用") return } - identity = &model.Identity{ - Id: memberInfo.Id, - Pid: memberInfo.Pid, - DeptId: memberInfo.DeptId, - RoleId: roleInfo.Id, - RoleKey: roleInfo.Key, - Username: memberInfo.Username, - RealName: memberInfo.RealName, - Avatar: memberInfo.Avatar, - Email: memberInfo.Email, - Mobile: memberInfo.Mobile, - VisitCount: memberInfo.VisitCount, - LastTime: memberInfo.LastTime, - LastIp: lastIp, - Exp: exp, - Expires: expires, - App: consts.AppAdmin, + identity := &model.Identity{ + Id: memberInfo.Id, + Pid: memberInfo.Pid, + DeptId: memberInfo.DeptId, + RoleId: roleInfo.Id, + RoleKey: roleInfo.Key, + Username: memberInfo.Username, + RealName: memberInfo.RealName, + Avatar: memberInfo.Avatar, + Email: memberInfo.Email, + Mobile: memberInfo.Mobile, + Exp: gtime.Timestamp() + expires, + Expires: expires, + App: consts.AppAdmin, } token, err := jwt.GenerateLoginToken(ctx, identity, false) @@ -524,14 +657,10 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re } // 更新登录信息 - _, err = dao.AdminMember.Ctx(ctx).Data(do.AdminMember{ - AuthKey: gmd5.MustEncryptString(token), - VisitCount: memberInfo.VisitCount + 1, - LastTime: timestamp, - LastIp: lastIp, - }).Where(do.AdminMember{ - Id: memberInfo.Id, - }).Update() + _, err = dao.AdminMember.Ctx(ctx). + Data(do.AdminMember{AuthKey: gmd5.MustEncryptString(token)}). + Where(do.AdminMember{Id: memberInfo.Id}). + Update() if err != nil { err = gerror.New(err.Error()) @@ -539,17 +668,15 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re } res = &adminin.MemberLoginModel{ - UserId: identity.Id, - Username: identity.Username, - RealName: identity.RealName, - Avatar: identity.Avatar, - Token: token, + Id: identity.Id, + Token: token, + Expires: expires, } return res, nil } -// RoleMemberList 获取角色下的会员列表 +// RoleMemberList 获取角色下的用户列表 func (s *sAdminMember) RoleMemberList(ctx context.Context, in adminin.RoleMemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) { mod := dao.AdminMember.Ctx(ctx) if in.Role > 0 { @@ -594,7 +721,7 @@ func (s *sAdminMember) Status(ctx context.Context, in adminin.MemberStatusInp) ( // 修改 in.UpdatedAt = gtime.Now() - _, err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update() + _, err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).Where("id", in.Id).Data("status", in.Status).Update() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err @@ -603,7 +730,7 @@ func (s *sAdminMember) Status(ctx context.Context, in adminin.MemberStatusInp) ( return nil } -// GetIdByCode 通过邀请码获取会员ID +// GetIdByCode 通过邀请码获取用户ID func (s *sAdminMember) GetIdByCode(ctx context.Context, in adminin.GetIdByCodeInp) (res *adminin.GetIdByCodeModel, err error) { if err = dao.AdminMember.Ctx(ctx). Fields("invite_code"). @@ -615,3 +742,53 @@ func (s *sAdminMember) GetIdByCode(ctx context.Context, in adminin.GetIdByCodeIn return res, nil } + +// Select 获取可选的用户选项 +func (s *sAdminMember) Select(ctx context.Context, in adminin.MemberSelectInp) (res []*adminin.MemberSelectModel, err error) { + err = dao.AdminMember.Ctx(ctx). + Fields("id as value,real_name as label,username,avatar"). + Handler(handler.FilterAuthWithField("id")). + Scan(&res) + if err != nil { + return nil, gerror.Wrap(err, consts.ErrorORM) + } + return res, nil +} + +func (s *sAdminMember) FilterAuthModel(ctx context.Context, memberId int64) *gdb.Model { + m := dao.AdminMember.Ctx(ctx) + if !s.VerifySuperId(ctx, memberId) { + m = m.Where("id <> ?", memberId) + } + return m.Handler(handler.FilterAuthWithField("id")) +} + +// MemberLoginStat 用户登录统计 +func (s *sAdminMember) MemberLoginStat(ctx context.Context, in adminin.MemberLoginStatInp) (res *adminin.MemberLoginStatModel, err error) { + var models *entity.SysLoginLog + err = dao.SysLoginLog.Ctx(ctx). + Fields("login_at,login_ip"). + Where("member_id", in.MemberId). + Where("status", consts.StatusEnabled). + Scan(&models) + if err != nil { + return nil, err + } + + res = new(adminin.MemberLoginStatModel) + if models == nil { + return + } + + res.LastLoginAt = models.LoginAt + res.LastLoginIp = models.LoginIp + + res.LoginCount, err = dao.SysLoginLog.Ctx(ctx). + Where("member_id", in.MemberId). + Where("status", consts.StatusEnabled).Count() + if err != nil { + return nil, err + } + + return +} diff --git a/server/internal/logic/admin/member_post.go b/server/internal/logic/admin/member_post.go index ea4a81c..6f8f455 100644 --- a/server/internal/logic/admin/member_post.go +++ b/server/internal/logic/admin/member_post.go @@ -39,7 +39,7 @@ func (s *sAdminMemberPost) UpdatePostIds(ctx context.Context, member_id int64, p PostId: post_ids[i], }) if err != nil { - err = gerror.Wrap(err, "插入会员岗位失败") + err = gerror.Wrap(err, "插入用户岗位失败") return err } } @@ -47,7 +47,7 @@ func (s *sAdminMemberPost) UpdatePostIds(ctx context.Context, member_id int64, p return nil } -// GetMemberByIds 获取指定会员的岗位ids +// GetMemberByIds 获取指定用户的岗位ids func (s *sAdminMemberPost) GetMemberByIds(ctx context.Context, member_id int64) (post_ids []int64, err error) { var list []*entity.AdminMemberPost err = dao.AdminMemberPost.Ctx(ctx). diff --git a/server/internal/logic/admin/menu.go b/server/internal/logic/admin/menu.go index 73c3aba..7d817ca 100644 --- a/server/internal/logic/admin/menu.go +++ b/server/internal/logic/admin/menu.go @@ -23,6 +23,7 @@ import ( "hotgo/internal/model/entity" "hotgo/internal/model/input/adminin" "hotgo/internal/service" + "hotgo/utility/convert" "hotgo/utility/tree" ) @@ -369,13 +370,8 @@ func (s *sAdminMenu) GetMenuList(ctx context.Context, memberId int64) (lists rol return } -// LoginPermissions 获取登录成功后的细分权限 -func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (lists []*adminin.MemberLoginPermissions, err error) { - // 空跑 - lists = append(lists, &adminin.MemberLoginPermissions{ - Value: "value", - }) - +// LoginPermissions 获取登录成功后的细粒度权限 +func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (lists adminin.MemberLoginPermissions, err error) { type Permissions struct { Permissions string `json:"permissions"` } @@ -401,17 +397,18 @@ func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (list return lists, err } + // 无权限 if len(allPermissions) == 0 { + lists = append(lists, "value") return } for _, v := range allPermissions { for _, p := range gstr.Explode(`,`, v.Permissions) { - lists = append(lists, &adminin.MemberLoginPermissions{ - Value: p, - }) + lists = append(lists, p) } } + lists = convert.UniqueSliceString(lists) return } diff --git a/server/internal/logic/admin/notice.go b/server/internal/logic/admin/notice.go index 82e6692..07d2796 100644 --- a/server/internal/logic/admin/notice.go +++ b/server/internal/logic/admin/notice.go @@ -8,17 +8,22 @@ package admin import ( "context" + "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/consts" "hotgo/internal/dao" + "hotgo/internal/library/contexts" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/model/entity" "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" "hotgo/internal/service" "hotgo/internal/websocket" - "hotgo/utility/charset" "hotgo/utility/simple" "hotgo/utility/validate" - "strings" ) type sAdminNotice struct{} @@ -31,9 +36,14 @@ func init() { service.RegisterAdminNotice(NewAdminNotice()) } +// Model Orm模型 +func (s *sAdminNotice) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.AdminNotice.Ctx(ctx), option...) +} + // Delete 删除 func (s *sAdminNotice) Delete(ctx context.Context, in adminin.NoticeDeleteInp) error { - _, err := dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Delete() + _, err := s.Model(ctx).Where("id", in.Id).Delete() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err @@ -44,44 +54,64 @@ func (s *sAdminNotice) Delete(ctx context.Context, in adminin.NoticeDeleteInp) e // Edit 修改/新增 func (s *sAdminNotice) Edit(ctx context.Context, in adminin.NoticeEditInp) (err error) { + var member = contexts.Get(ctx).User + if member == nil { + err = gerror.New("获取用户信息失败!") + return + } + if in.Title == "" { err = gerror.New("标题不能为空") - return err + return + } + + if in.Type == consts.NoticeTypeLetter && len(in.Receiver) == 0 { + err = gerror.New("私信类型必须选择接收人") + return + } + + // 检查选项接收人是否合法 + if in.Type == consts.NoticeTypeLetter { + count, _ := dao.AdminMember.Ctx(ctx).Handler(handler.FilterAuthWithField("id")).WhereIn("id", in.Receiver).Count() + if count != len(in.Receiver) { + err = gerror.New("接收人不合法") + return + } + in.SenderAvatar = member.Avatar } // 修改 - in.UpdatedAt = gtime.Now() if in.Id > 0 { - _, err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Data(in).Update() + in.UpdatedBy = member.Id + _, err = s.Model(ctx).Where("id", in.Id).Data(in).Update() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err } - return nil } // 新增 + in.CreatedBy = member.Id in.CreatedAt = gtime.Now() - _, err = dao.AdminNotice.Ctx(ctx).Data(in).Insert() + in.Id, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).InsertAndGetId() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err } // 推送通知 - memberIds := charset.SplitMemberIds(in.Receiver, ",") response := &websocket.WResponse{ Event: "notice", Data: in, } simple.SafeGo(ctx, func(ctx context.Context) { - if len(memberIds) == 0 { - websocket.SendToAll(response) - } else { - for _, memberId := range memberIds { - websocket.SendToUser(memberId, response) + if in.Type == consts.NoticeTypeLetter { + for _, receiverId := range in.Receiver { + websocket.SendToUser(receiverId, response) } + } else { + websocket.SendToAll(response) } }) @@ -106,8 +136,7 @@ func (s *sAdminNotice) Status(ctx context.Context, in adminin.NoticeStatusInp) ( } // 修改 - in.UpdatedAt = gtime.Now() - _, err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update() + _, err = s.Model(ctx).Where("id", in.Id).Data("status", in.Status).Update() if err != nil { err = gerror.Wrap(err, consts.ErrorORM) return err @@ -119,19 +148,17 @@ func (s *sAdminNotice) Status(ctx context.Context, in adminin.NoticeStatusInp) ( // MaxSort 最大排序 func (s *sAdminNotice) MaxSort(ctx context.Context, in adminin.NoticeMaxSortInp) (*adminin.NoticeMaxSortModel, error) { var res adminin.NoticeMaxSortModel - if in.Id > 0 { - if err := dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err - } + if err := s.Model(ctx).Order("sort desc").Scan(&res); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return nil, err } - res.Sort = res.Sort + 10 + res.Sort = form.DefaultMaxSort(ctx, res.Sort) return &res, nil } // View 获取指定字典类型信息 func (s *sAdminNotice) View(ctx context.Context, in adminin.NoticeViewInp) (res *adminin.NoticeViewModel, err error) { - if err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil { + if err = s.Model(ctx).Where("id", in.Id).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return nil, err } @@ -141,19 +168,26 @@ func (s *sAdminNotice) View(ctx context.Context, in adminin.NoticeViewInp) (res // List 获取列表 func (s *sAdminNotice) List(ctx context.Context, in adminin.NoticeListInp) (list []*adminin.NoticeListModel, totalCount int, err error) { - mod := dao.AdminNotice.Ctx(ctx) + var memberId = contexts.GetUserId(ctx) + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + mod := s.Model(ctx) - // 访问路径 if in.Title != "" { mod = mod.WhereLike("title", "%"+in.Title+"%") } - // 模块 if in.Content != "" { mod = mod.WhereLike("content", "%"+in.Content+"%") } - // 请求方式 + if in.Type > 0 { + mod = mod.Where("type", in.Type) + } + if in.Status > 0 { mod = mod.Where("status", in.Status) } @@ -173,8 +207,291 @@ func (s *sAdminNotice) List(ctx context.Context, in adminin.NoticeListInp) (list return list, totalCount, err } - for k, v := range list { - list[k].ReceiveNum = len(strings.Split(v.Reader, ",")) + for _, v := range list { + // 接收人头像组 + if v.Type == consts.NoticeTypeLetter { + err = dao.AdminMember.Ctx(ctx). + Fields("real_name as name,avatar as src"). + WhereIn("id", v.Receiver.Var().Int64s()). + Scan(&v.ReceiverGroup) + if err != nil { + return + } + } + if v.ReceiverGroup == nil || len(v.ReceiverGroup) == 0 { + v.ReceiverGroup = make([]form.AvatarGroup, 0) + } + + // 阅读次数 + v.ReadCount, err = dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Sum("clicks") + if err != nil { + return + } + } + return list, totalCount, err +} + +// PullMessages 拉取未读消息列表 +func (s *sAdminNotice) PullMessages(ctx context.Context, in adminin.PullMessagesInp) (res *adminin.PullMessagesModel, err error) { + var memberId = contexts.GetUserId(ctx) + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + messageIds, err := s.messageIds(ctx, memberId) + if err != nil { + return + } + + res = new(adminin.PullMessagesModel) + unread, err := s.UnreadCount(ctx, adminin.NoticeUnreadCountInp{MemberId: memberId, MessageIds: messageIds}) + if err != nil { + return + } + + if unread != nil { + res.NoticeUnreadCountModel = unread + } + + if err = s.Model(ctx).WhereIn("id", messageIds).Limit(in.Limit).Order("id desc").Scan(&res.List); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return + } + + for _, v := range res.List { + count, _ := dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Where("member_id", memberId).Count() + if count > 0 { + v.IsRead = true + } + + if v.Type == consts.NoticeTypeLetter { + val, err := dao.AdminMember.Ctx(ctx).Fields("avatar").Where("id", v.CreatedBy).Value() + if err == nil { + v.SenderAvatar = val.String() + } + } + } + return +} + +// UnreadCount 获取所有类型消息的未读数量 +func (s *sAdminNotice) UnreadCount(ctx context.Context, in adminin.NoticeUnreadCountInp) (res *adminin.NoticeUnreadCountModel, err error) { + if in.MemberId <= 0 { + if in.MemberId = contexts.GetUserId(ctx); in.MemberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + } + + if len(in.MessageIds) == 0 { + in.MessageIds, err = s.messageIds(ctx, in.MemberId) + if err != nil { + return + } + + if len(in.MessageIds) == 0 { + return + } + } + + stat := func(t int) (count int) { + all, err := dao.AdminNotice.Ctx(ctx).As("nr"). + Where("type =? and id IN(?)", t, in.MessageIds). + Count() + if err != nil { + g.Log().Infof(ctx, "UnreadCount stat err:%+v", err) + return + } + + if all == 0 { + return + } + + read, err := dao.AdminNoticeRead.Ctx(ctx).As("nr"). + LeftJoin("admin_notice n", "nr.notice_id=n.id"). + Where("n.type = ? and n.id IN(?)", t, in.MessageIds). + Where("nr.member_id", in.MemberId). + Count() + if err != nil { + g.Log().Infof(ctx, "UnreadCount stat2 err:%+v", err) + return + } + count = all - read + return + } + + res = new(adminin.NoticeUnreadCountModel) + res.NotifyCount = stat(consts.NoticeTypeNotify) + res.NoticeCount = stat(consts.NoticeTypeNotice) + res.LetterCount = stat(consts.NoticeTypeLetter) + return +} + +// messageIds 获取我的消息所有的消息ID +func (s *sAdminNotice) messageIds(ctx context.Context, memberId int64) (ids []int64, err error) { + mod := s.Model(ctx, &handler.Option{FilterAuth: false}). + Fields("id"). + Where("status", consts.StatusEnabled). + Where("(`type` IN(?) OR (`type` = ? and JSON_CONTAINS(`receiver`,'"+gconv.String(memberId)+"')))", + []int{consts.NoticeTypeNotify, consts.NoticeTypeNotice}, consts.NoticeTypeLetter, + ) + + array, err := mod.Array() + if err != nil { + return nil, err + } + + for _, v := range array { + ids = append(ids, v.Int64()) + } + return +} + +// UpRead 更新已读 +func (s *sAdminNotice) UpRead(ctx context.Context, in adminin.NoticeUpReadInp) (err error) { + var ( + data *entity.AdminNotice + memberId = contexts.GetUserId(ctx) + ) + + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + if err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Scan(&data); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + if data == nil { + return gerror.New("公告不存在") + } + + return s.updatedReadClicks(ctx, in.Id, memberId) +} + +// ReadAll 已读全部 +func (s *sAdminNotice) ReadAll(ctx context.Context, in adminin.NoticeReadAllInp) (err error) { + var memberId = contexts.GetUserId(ctx) + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + allMessageIds, err := s.messageIds(ctx, memberId) + if err != nil { + return + } + + if len(allMessageIds) == 0 { + return + } + + array, err := dao.AdminNotice.Ctx(ctx). + Fields("id"). + Where("type = ? and id IN(?)", in.Type, allMessageIds). + Array() + if err != nil { + return + } + + var messageIds []int64 + for _, v := range array { + messageIds = append(messageIds, v.Int64()) + } + + array, err = dao.AdminNoticeRead.Ctx(ctx).As("nr"). + Fields("nr.notice_id"). + LeftJoin("admin_notice n", "nr.notice_id=n.id"). + Where("n.type = ? and n.id IN(?)", in.Type, messageIds). + Where("nr.member_id", memberId). + Array() + if err != nil { + return + } + + var readIds []int64 + for _, v := range array { + readIds = append(readIds, v.Int64()) + } + + for _, messageId := range messageIds { + if !validate.InSliceInt64(readIds, messageId) { + if err = s.updatedReadClicks(ctx, messageId, memberId); err != nil { + return + } + } + } + + return +} + +// updatedReadClicks 更新公告已读次数 +func (s *sAdminNotice) updatedReadClicks(ctx context.Context, noticeId, memberId int64) (err error) { + var ( + models *entity.AdminNoticeRead + ) + err = dao.AdminNoticeRead.Ctx(ctx). + Where(dao.AdminNoticeRead.Columns().NoticeId, noticeId). + Where(dao.AdminNoticeRead.Columns().MemberId, memberId). + Scan(&models) + if err != nil { + return + } + + if models == nil { + _, err = dao.AdminNoticeRead.Ctx(ctx).Data(entity.AdminNoticeRead{NoticeId: noticeId, MemberId: memberId}).Insert() + return + } + _, err = dao.AdminNoticeRead.Ctx(ctx).Where(dao.AdminNoticeRead.Columns().Id, models.Id).Increment("clicks", 1) + return +} + +// MessageList 我的消息列表 +func (s *sAdminNotice) MessageList(ctx context.Context, in adminin.NoticeMessageListInp) (list []*adminin.NoticeMessageListModel, totalCount int, err error) { + var memberId = contexts.GetUserId(ctx) + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + allMessageIds, err := s.messageIds(ctx, memberId) + if err != nil { + return + } + + if len(allMessageIds) == 0 { + return + } + + mod := s.Model(ctx, &handler.Option{FilterAuth: false}).WhereIn("id", allMessageIds).Where("type", in.Type) + totalCount, err = mod.Count() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return list, totalCount, err + } + + if totalCount == 0 { + return list, totalCount, nil + } + + if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return list, totalCount, err + } + + for _, v := range list { + count, _ := dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Where("member_id", memberId).Count() + if count > 0 { + v.IsRead = true + } + + if v.Type == consts.NoticeTypeLetter { + val, err := dao.AdminMember.Ctx(ctx).Fields("avatar").Where("id", v.CreatedBy).Value() + if err == nil { + v.SenderAvatar = val.String() + } + } } return list, totalCount, err } diff --git a/server/internal/logic/admin/role.go b/server/internal/logic/admin/role.go index 571db14..4d91621 100644 --- a/server/internal/logic/admin/role.go +++ b/server/internal/logic/admin/role.go @@ -27,6 +27,7 @@ import ( "hotgo/utility/convert" "hotgo/utility/tree" "sort" + "strconv" ) type sAdminRole struct{} @@ -60,7 +61,7 @@ func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool { } ok, err := casbin.Enforcer.Enforce(user.RoleKey, path, method) if err != nil { - g.Log().Warningf(ctx, "admin Verify Enforce err:%v", err) + g.Log().Warningf(ctx, "admin Verify Enforce err:%+v", err) return false } @@ -86,6 +87,12 @@ func (s *sAdminRole) List(ctx context.Context, in adminin.RoleListInp) (list []g return list, totalCount, err } + for _, v := range models { + v.Label = v.Name + v.Value = v.Id + v.Key = strconv.FormatInt(v.Id, 10) + } + return tree.GenTree(gconv.SliceMap(models)), totalCount, err } @@ -104,7 +111,7 @@ func (s *sAdminRole) GetName(ctx context.Context, RoleId int64) (name string, er return roleName.String(), nil } -// GetMemberList 获取指定会员的岗位列表 +// GetMemberList 获取指定用户的岗位列表 func (s *sAdminRole) GetMemberList(ctx context.Context, RoleId int64) (list []*adminin.RoleListModel, err error) { err = dao.AdminRole.Ctx(ctx). Where("id", RoleId). diff --git a/server/internal/logic/admin/test.go b/server/internal/logic/admin/test.go index 7b0eac7..a196878 100644 --- a/server/internal/logic/admin/test.go +++ b/server/internal/logic/admin/test.go @@ -18,6 +18,7 @@ import ( "hotgo/internal/dao" "hotgo/internal/library/contexts" "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model/input/adminin" "hotgo/internal/model/input/form" "hotgo/internal/service" @@ -37,13 +38,13 @@ func init() { } // Model Orm模型 -func (s *sAdminTest) Model(ctx context.Context) *gdb.Model { - return dao.Test.Ctx(ctx) +func (s *sAdminTest) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.Test.Ctx(ctx), option...) } // List 获取列表 func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []*adminin.TestListModel, totalCount int, err error) { - mod := dao.Test.Ctx(ctx) + mod := s.Model(ctx) if in.Title != "" { mod = mod.WhereLike(dao.Test.Columns().Title, "%"+in.Title+"%") @@ -98,11 +99,11 @@ func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []* totalCount, err = mod.Clone().Count(1) if err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err + return } if totalCount == 0 { - return list, totalCount, nil + return } ////关联表select @@ -113,28 +114,27 @@ func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []* fields, err := hgorm.GenSelect(ctx, adminin.TestListModel{}, dao.Test) if err != nil { - return nil, 0, err + return } - if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth, hgorm.HandlerForceCache).Page(in.Page, in.PerPage).OrderAsc(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Id).Scan(&list); err != nil { + if err = mod.Fields(fields).Handler(handler.FilterAuth, handler.ForceCache).Page(in.Page, in.PerPage).OrderAsc(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Id).Scan(&list); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err + return } - - return list, totalCount, err + return } // Export 导出 func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err error) { list, totalCount, err := s.List(ctx, in) if err != nil { - return err + return } // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} tags, err := convert.GetEntityDescTags(adminin.TestExportModel{}) if err != nil { - return err + return } var ( @@ -143,10 +143,10 @@ func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err er exports []adminin.TestExportModel ) - err = gconv.Scan(list, &exports) - if err != nil { - return err + if err = gconv.Scan(list, &exports); err != nil { + return } + if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil { return } @@ -156,70 +156,51 @@ func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err er // Edit 修改/新增 func (s *sAdminTest) Edit(ctx context.Context, in adminin.TestEditInp) (err error) { if err = hgorm.IsUnique(ctx, dao.Test, g.Map{dao.Test.Columns().Qq: in.Qq}, "QQ号码已存在,请换一个", in.Id); err != nil { - if err != nil { - return err - } + return } // 修改 if in.Id > 0 { in.UpdatedBy = contexts.GetUserId(ctx) - _, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in).Update() + return } // 新增 in.CreatedBy = contexts.GetUserId(ctx) - _, err = dao.Test.Ctx(ctx).Data(in).Insert() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).Insert() + return } // Delete 删除 func (s *sAdminTest) Delete(ctx context.Context, in adminin.TestDeleteInp) (err error) { - _, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Delete() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Delete() + return } // Status 更新状态 func (s *sAdminTest) Status(ctx context.Context, in adminin.TestStatusInp) (err error) { if in.Id <= 0 { err = gerror.New("ID不能为空") - return err + return } if in.Status <= 0 { err = gerror.New("状态不能为空") - return err + return } if !validate.InSliceInt(consts.StatusMap, in.Status) { err = gerror.New("状态不正确") - return err + return } // 修改 - _, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(dao.Test.Columns().Status, in.Status).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(g.Map{ + dao.Test.Columns().Status: in.Status, + dao.Test.Columns().UpdatedBy: contexts.GetUserId(ctx), + }).Update() + return } // Switch 更新开关状态 @@ -231,36 +212,34 @@ func (s *sAdminTest) Switch(ctx context.Context, in adminin.TestSwitchInp) (err if !validate.InSliceString(fields, in.Key) { err = gerror.New("开关键名不在白名单") - return err + return } // 修改 - _, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in.Key, in.Value).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(g.Map{ + in.Key: in.Value, + dao.Test.Columns().UpdatedBy: contexts.GetUserId(ctx), + }).Update() + return } // MaxSort 最大排序 func (s *sAdminTest) MaxSort(ctx context.Context, in adminin.TestMaxSortInp) (res *adminin.TestMaxSortModel, err error) { if err = dao.Test.Ctx(ctx).Fields(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Sort).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return nil, err + return } - res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int() - return res, nil + if res == nil { + res = new(adminin.TestMaxSortModel) + } + + res.Sort = form.DefaultMaxSort(ctx, res.Sort) + return } // View 获取指定字典类型信息 func (s *sAdminTest) View(ctx context.Context, in adminin.TestViewInp) (res *adminin.TestViewModel, err error) { - if err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err - } - - return res, nil + err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Scan(&res) + return } diff --git a/server/internal/logic/common/upload.go b/server/internal/logic/common/upload.go index c8c724b..f23453a 100644 --- a/server/internal/logic/common/upload.go +++ b/server/internal/logic/common/upload.go @@ -205,8 +205,6 @@ func (s *sCommonUpload) UploadUCloud(ctx context.Context, conf *model.UploadConf return nil, err } - g.Log().Warningf(ctx, "ras:%+v", string(req.LastResponseBody)) - attachment, err := service.SysAttachment().Add(ctx, meta, fullPath, consts.UploadDriveUCloud) if err != nil { return nil, err diff --git a/server/internal/logic/hook/global_log.go b/server/internal/logic/hook/access_log.go similarity index 85% rename from server/internal/logic/hook/global_log.go rename to server/internal/logic/hook/access_log.go index a27504b..252c974 100644 --- a/server/internal/logic/hook/global_log.go +++ b/server/internal/logic/hook/access_log.go @@ -14,8 +14,8 @@ import ( "hotgo/internal/service" ) -// GlobalLog 访问日志 -func (s *sHook) GlobalLog(r *ghttp.Request) { +// AccessLog 访问日志 +func (s *sHook) AccessLog(r *ghttp.Request) { var ( ctx = r.Context() ) @@ -31,7 +31,7 @@ func (s *sHook) GlobalLog(r *ghttp.Request) { go func() { if err := service.SysLog().AutoLog(ctx); err != nil { - g.Log().Info(ctx, "GlobalLog AutoLog err:", err) + g.Log().Info(ctx, "hook AccessLog err:", err) } }() } diff --git a/server/internal/logic/hook/last_active.go b/server/internal/logic/hook/last_active.go new file mode 100644 index 0000000..c3f9155 --- /dev/null +++ b/server/internal/logic/hook/last_active.go @@ -0,0 +1,80 @@ +package hook + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/os/gtimer" + "hotgo/internal/library/contexts" + "sync" + "time" +) + +type visitor struct { + lastSeen *gtime.Time +} + +var ( + visitors = make(map[int64]*visitor) + mtx sync.Mutex +) + +// Run a background goroutine to remove old entries from the visitors map. +func init() { + go cleanupVisitors() +} + +// Every minute check the map for visitors that haven't been seen for +// more than 3 minutes and delete the entries. +func cleanupVisitors() { + gtimer.AddSingleton(gctx.New(), time.Minute, func(ctx context.Context) { + mtx.Lock() + for memberId, v := range visitors { + if gtime.Now().Sub(v.lastSeen) > 3*time.Minute { + delete(visitors, memberId) + } + } + mtx.Unlock() + }) +} + +func allow(memberId int64) bool { + mtx.Lock() + defer mtx.Unlock() + v, exists := visitors[memberId] + if !exists { + visitors[memberId] = &visitor{gtime.Now()} + return true + } + + if gtime.Now().Sub(v.lastSeen) > time.Second*3 { + v.lastSeen = gtime.Now() + return true + } + + return false +} + +// LastActive 更新用户最后活跃 +func (s *sHook) LastActive(r *ghttp.Request) { + var ( + ctx = r.Context() + memberId = contexts.GetUserId(ctx) + ) + + if memberId == 0 { + return + } + + if allow(memberId) { + _, err := g.Model("admin_member").Ctx(ctx). + Where("id", memberId). + Data(g.Map{"last_active_at": gtime.Now()}). + Update() + if err != nil { + g.Log().Warningf(ctx, "hook LastActive err:%+v, memberId:%v", err, memberId) + } + } +} diff --git a/server/internal/logic/middleware/admin_auth.go b/server/internal/logic/middleware/admin_auth.go index ada1db1..fed977e 100644 --- a/server/internal/logic/middleware/admin_auth.go +++ b/server/internal/logic/middleware/admin_auth.go @@ -42,7 +42,7 @@ func (s *sMiddleware) AdminAuth(r *ghttp.Request) { // 验证路由访问权限 if !service.AdminRole().Verify(ctx, path, r.Method) { - g.Log().Warningf(ctx, "AdminAuth fail path:%+v, GetRoleKey:%+v, r.Method:%+v", path, contexts.GetRoleKey(ctx), r.Method) + g.Log().Debugf(ctx, "AdminAuth fail path:%+v, GetRoleKey:%+v, r.Method:%+v", path, contexts.GetRoleKey(ctx), r.Method) response.JsonExit(r, gcode.CodeSecurityReason.Code(), "你没有访问权限!") return } diff --git a/server/internal/logic/middleware/init.go b/server/internal/logic/middleware/init.go index 90bbb22..ade162b 100644 --- a/server/internal/logic/middleware/init.go +++ b/server/internal/logic/middleware/init.go @@ -151,22 +151,19 @@ func inspectAuth(r *ghttp.Request, appName string) error { // 保存到上下文 if user != nil { customCtx.User = &model.Identity{ - Id: user.Id, - Pid: user.Pid, - DeptId: user.DeptId, - RoleId: user.RoleId, - RoleKey: user.RoleKey, - Username: user.Username, - RealName: user.RealName, - Avatar: user.Avatar, - Email: user.Email, - Mobile: user.Mobile, - VisitCount: user.VisitCount, - LastTime: user.LastTime, - LastIp: user.LastIp, - Exp: user.Exp, - Expires: user.Expires, - App: user.App, + Id: user.Id, + Pid: user.Pid, + DeptId: user.DeptId, + RoleId: user.RoleId, + RoleKey: user.RoleKey, + Username: user.Username, + RealName: user.RealName, + Avatar: user.Avatar, + Email: user.Email, + Mobile: user.Mobile, + Exp: user.Exp, + Expires: user.Expires, + App: user.App, } } contexts.SetUser(ctx, customCtx.User) diff --git a/server/internal/logic/middleware/limit_develop.go b/server/internal/logic/middleware/limit_develop.go new file mode 100644 index 0000000..85b900d --- /dev/null +++ b/server/internal/logic/middleware/limit_develop.go @@ -0,0 +1,36 @@ +package middleware + +import ( + "fmt" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/text/gstr" + "hotgo/internal/library/location" + "hotgo/internal/library/response" +) + +// Develop 开发工具白名单过滤 +func (s *sMiddleware) Develop(r *ghttp.Request) { + ips := g.Cfg().MustGet(r.Context(), "hggen.allowedIPs").Strings() + if len(ips) == 0 { + response.JsonExit(r, gcode.CodeNotSupported.Code(), "请配置生成白名单!") + } + + if !gstr.InArray(ips, "*") { + cuIp := location.GetClientIp(r) + ok := false + for _, ip := range ips { + if ip == cuIp { + ok = true + break + } + } + + if !ok { + response.JsonExit(r, gcode.CodeNotSupported.Code(), fmt.Sprintf("当前IP[%s]没有配置生成白名单!", cuIp)) + } + } + + r.Middleware.Next() +} diff --git a/server/internal/logic/sys/config.go b/server/internal/logic/sys/config.go index f1d95c0..0ea6f25 100644 --- a/server/internal/logic/sys/config.go +++ b/server/internal/logic/sys/config.go @@ -96,6 +96,19 @@ func (s *sSysConfig) GetSmtp(ctx context.Context) (conf *model.EmailConfig, err return conf, nil } +// GetBasic 获取基础配置 +func (s *sSysConfig) GetBasic(ctx context.Context) (conf *model.BasicConfig, err error) { + models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "basic"}) + if err != nil { + return nil, err + } + if err = gconv.Struct(models.List, &conf); err != nil { + return nil, err + } + + return conf, nil +} + // GetLoadSSL 获取本地日志配置 func (s *sSysConfig) GetLoadSSL(ctx context.Context) (conf *model.SSLConfig, err error) { if err = g.Cfg().MustGet(ctx, "hotgo.ssl").Struct(&conf); err != nil { diff --git a/server/internal/logic/sys/cron.go b/server/internal/logic/sys/cron.go index 9e1e808..8378d2f 100644 --- a/server/internal/logic/sys/cron.go +++ b/server/internal/logic/sys/cron.go @@ -8,14 +8,15 @@ package sys import ( "context" + "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" - "github.com/gogf/gf/v2/os/gtime" "hotgo/internal/consts" "hotgo/internal/crons" "hotgo/internal/dao" "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" "hotgo/internal/service" "hotgo/utility/validate" @@ -33,10 +34,7 @@ func init() { } func (s *sSysCron) StartCron(ctx context.Context) { - var ( - list []*entity.SysCron - ) - + var list []*entity.SysCron if err := dao.SysCron.Ctx(ctx). Where("status", consts.StatusEnabled). Order("sort asc,id desc"). @@ -49,17 +47,30 @@ func (s *sSysCron) StartCron(ctx context.Context) { g.Log().Fatalf(ctx, "定时任务启动失败, err . %v", err) return } - } // Delete 删除 -func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) error { - _, err := dao.SysCron.Ctx(ctx).Where("id", in.Id).Delete() - if err != nil { +func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) (err error) { + var models *entity.SysCron + if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return err + return } + if models == nil { + err = gerror.New("定时任务不存在或已被删除") + return + } + + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Delete() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return crons.Delete(models) + }) return nil } @@ -67,34 +78,30 @@ func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) error { func (s *sSysCron) Edit(ctx context.Context, in sysin.CronEditInp) (err error) { if in.Name == "" { err = gerror.New("标题不能为空") - return err + return } // 修改 - in.UpdatedAt = gtime.Now() if in.Id > 0 { - _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data(in).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data(in).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } - return nil + return crons.RefreshStatus(&in.SysCron) + }) + return } // 新增 - in.CreatedAt = gtime.Now() _, err = dao.SysCron.Ctx(ctx).Data(in).Insert() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - return nil + return } // Status 更新部门状态 func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err error) { - if in.Id <= 0 { err = gerror.New("ID不能为空") return err @@ -110,36 +117,46 @@ func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err erro return err } - // 修改 - in.UpdatedAt = gtime.Now() - _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update() - if err != nil { + var models *entity.SysCron + if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return err + return } - return nil + if models == nil { + err = gerror.New("定时任务不存在") + return + } + + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + models.Status = in.Status + return crons.RefreshStatus(models) + }) + return } // MaxSort 最大排序 -func (s *sSysCron) MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (*sysin.CronMaxSortModel, error) { - var res sysin.CronMaxSortModel - - if in.Id > 0 { - if err := dao.SysCron.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err - } +func (s *sSysCron) MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (res *sysin.CronMaxSortModel, err error) { + if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return nil, err + } + if res == nil { + res = new(sysin.CronMaxSortModel) } - res.Sort = res.Sort + 10 - - return &res, nil + res.Sort = form.DefaultMaxSort(ctx, res.Sort) + return res, nil } // View 获取指定字典类型信息 func (s *sSysCron) View(ctx context.Context, in sysin.CronViewInp) (res *sysin.CronViewModel, err error) { - if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return nil, err @@ -152,12 +169,10 @@ func (s *sSysCron) View(ctx context.Context, in sysin.CronViewInp) (res *sysin.C func (s *sSysCron) List(ctx context.Context, in sysin.CronListInp) (list []*sysin.CronListModel, totalCount int, err error) { mod := dao.SysCron.Ctx(ctx) - // 访问路径 if in.Name != "" { mod = mod.WhereLike("name", "%"+in.Name+"%") } - // 请求方式 if in.Status > 0 { mod = mod.Where("status", in.Status) } @@ -180,7 +195,6 @@ func (s *sSysCron) List(ctx context.Context, in sysin.CronListInp) (list []*sysi for _, v := range list { v.GroupName, _ = dao.SysCronGroup.GetName(ctx, v.GroupId) } - return list, totalCount, err } @@ -197,6 +211,5 @@ func (s *sSysCron) OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err } newCtx := context.WithValue(gctx.New(), consts.ContextKeyCronArgs, strings.Split(data.Params, consts.CronSplitStr)) - return crons.Once(newCtx, data) } diff --git a/server/internal/logic/sys/curd_demo.go b/server/internal/logic/sys/curd_demo.go index a2a14db..a4ec769 100644 --- a/server/internal/logic/sys/curd_demo.go +++ b/server/internal/logic/sys/curd_demo.go @@ -3,8 +3,8 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.1.0 -// @AutoGenerate Date 2023-01-18 15:19:42 +// @AutoGenerate Version 2.1.2 +// @AutoGenerate Date 2023-02-08 17:47:32 // package sys @@ -15,6 +15,7 @@ import ( "hotgo/internal/dao" "hotgo/internal/library/contexts" "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" "hotgo/internal/service" @@ -39,14 +40,14 @@ func init() { service.RegisterSysCurdDemo(NewSysCurdDemo()) } -// Model 生成演示Orm模型 -func (s *sSysCurdDemo) Model(ctx context.Context) *gdb.Model { - return dao.SysGenCurdDemo.Ctx(ctx) +// Model 生成演示ORM模型 +func (s *sSysCurdDemo) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.SysGenCurdDemo.Ctx(ctx), option...) } // List 获取生成演示列表 func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) { - mod := dao.SysGenCurdDemo.Ctx(ctx) + mod := s.Model(ctx) // 查询ID if in.Id > 0 { @@ -77,36 +78,37 @@ func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list totalCount, err = mod.Clone().Count(1) if err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err + return } if totalCount == 0 { - return list, totalCount, nil + return } //关联表select fields, err := hgorm.GenJoinSelect(ctx, sysin.CurdDemoListModel{}, dao.SysGenCurdDemo, []*hgorm.Join{ {Dao: dao.TestCategory, Alias: "testCategory"}, }) - if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth).Page(in.Page, in.PerPage).OrderAsc(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Id).Scan(&list); err != nil { + + if err = mod.Fields(fields).Page(in.Page, in.PerPage).OrderAsc(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Id).Scan(&list); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err + return } - return list, totalCount, err + return } // Export 导出生成演示 func (s *sSysCurdDemo) Export(ctx context.Context, in sysin.CurdDemoListInp) (err error) { list, totalCount, err := s.List(ctx, in) if err != nil { - return err + return } // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} tags, err := convert.GetEntityDescTags(sysin.CurdDemoExportModel{}) if err != nil { - return err + return } var ( @@ -115,13 +117,11 @@ func (s *sSysCurdDemo) Export(ctx context.Context, in sysin.CurdDemoListInp) (er exports []sysin.CurdDemoExportModel ) - err = gconv.Scan(list, &exports) - if err != nil { - return err - } - if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil { + if err = gconv.Scan(list, &exports); err != nil { return } + + err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName) return } @@ -130,7 +130,7 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err // 修改 if in.Id > 0 { in.UpdatedBy = contexts.GetUserId(ctx) - _, err = dao.SysGenCurdDemo.Ctx(ctx). + _, err = s.Model(ctx). FieldsEx( dao.SysGenCurdDemo.Columns().Id, dao.SysGenCurdDemo.Columns().CreatedBy, @@ -138,85 +138,70 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err dao.SysGenCurdDemo.Columns().DeletedAt, ). Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(in).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - return nil + return } // 新增 in.CreatedBy = contexts.GetUserId(ctx) - _, err = dao.SysGenCurdDemo.Ctx(ctx). + _, err = s.Model(ctx, &handler.Option{FilterAuth: false}). FieldsEx( dao.SysGenCurdDemo.Columns().Id, dao.SysGenCurdDemo.Columns().UpdatedBy, dao.SysGenCurdDemo.Columns().DeletedAt, ). Data(in).Insert() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } return } // Delete 删除生成演示 func (s *sSysCurdDemo) Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error) { - _, err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Delete() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Delete() + return } // MaxSort 获取生成演示最大排序 func (s *sSysCurdDemo) MaxSort(ctx context.Context, in sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) { if err = dao.SysGenCurdDemo.Ctx(ctx).Fields(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Sort).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) - return nil, err + return } - res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int() - return res, nil + if res == nil { + res = new(sysin.CurdDemoMaxSortModel) + } + + res.Sort = form.DefaultMaxSort(ctx, res.Sort) + return } // View 获取生成演示指定信息 func (s *sSysCurdDemo) View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) { - if err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err - } - - return res, nil + err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Scan(&res) + return } // Status 更新生成演示状态 func (s *sSysCurdDemo) Status(ctx context.Context, in sysin.CurdDemoStatusInp) (err error) { if in.Id <= 0 { err = gerror.New("ID不能为空") - return err + return } if in.Status <= 0 { err = gerror.New("状态不能为空") - return err + return } if !validate.InSliceInt(consts.StatusMap, in.Status) { err = gerror.New("状态不正确") - return err + return } - _, err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(dao.SysGenCurdDemo.Columns().Status, in.Status).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(g.Map{ + dao.SysGenCurdDemo.Columns().Status: in.Status, + dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx), + }).Update() + return } // Switch 更新生成演示开关 @@ -229,14 +214,12 @@ func (s *sSysCurdDemo) Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) ( if !validate.InSliceString(fields, in.Key) { err = gerror.New("开关键名不在白名单") - return err + return } - _, err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(in.Key, in.Value).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(g.Map{ + in.Key: in.Value, + dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx), + }).Update() + return } diff --git a/server/internal/logic/sys/ems_log.go b/server/internal/logic/sys/ems_log.go new file mode 100644 index 0000000..177e04f --- /dev/null +++ b/server/internal/logic/sys/ems_log.go @@ -0,0 +1,443 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2022 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// +package sys + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/os/gview" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/grand" + "hotgo/internal/consts" + "hotgo/internal/dao" + "hotgo/internal/library/contexts" + "hotgo/internal/library/ems" + "hotgo/internal/library/location" + "hotgo/internal/model" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/sysin" + "hotgo/internal/service" + "hotgo/utility/charset" + "hotgo/utility/useragent" + "hotgo/utility/validate" + "time" +) + +type sSysEmsLog struct{} + +func NewSysEmsLog() *sSysEmsLog { + return &sSysEmsLog{} +} + +func init() { + service.RegisterSysEmsLog(NewSysEmsLog()) +} + +// Delete 删除 +func (s *sSysEmsLog) Delete(ctx context.Context, in sysin.EmsLogDeleteInp) error { + _, err := dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Delete() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return nil +} + +// Edit 修改/新增 +func (s *sSysEmsLog) Edit(ctx context.Context, in sysin.EmsLogEditInp) (err error) { + if in.Ip == "" { + err = gerror.New("ip不能为空") + return err + } + + // 修改 + if in.Id > 0 { + _, err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Data(in).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return nil + } + + // 新增 + _, err = dao.SysEmsLog.Ctx(ctx).Data(in).Insert() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + return nil +} + +// Status 更新部门状态 +func (s *sSysEmsLog) Status(ctx context.Context, in sysin.EmsLogStatusInp) (err error) { + if in.Id <= 0 { + err = gerror.New("ID不能为空") + return err + } + + if in.Status <= 0 { + err = gerror.New("状态不能为空") + return err + } + + if !validate.InSliceInt(consts.StatusMap, in.Status) { + err = gerror.New("状态不正确") + return err + } + + // 修改 + _, err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return nil +} + +// View 获取指定字典类型信息 +func (s *sSysEmsLog) View(ctx context.Context, in sysin.EmsLogViewInp) (res *sysin.EmsLogViewModel, err error) { + if err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return nil, err + } + return res, nil +} + +// List 获取列表 +func (s *sSysEmsLog) List(ctx context.Context, in sysin.EmsLogListInp) (list []*sysin.EmsLogListModel, totalCount int, err error) { + mod := dao.SysEmsLog.Ctx(ctx) + + if in.Status > 0 { + mod = mod.Where("status", in.Status) + } + + totalCount, err = mod.Count() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return list, totalCount, err + } + + if totalCount == 0 { + return list, totalCount, nil + } + + if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return list, totalCount, err + } + + return list, totalCount, err +} + +// Send 发送邮件 +func (s *sSysEmsLog) Send(ctx context.Context, in sysin.SendEmsInp) (err error) { + var models *entity.SysEmsLog + if err = dao.SysEmsLog.Ctx(ctx).Where("event", in.Event).Where("email", in.Email).Scan(&models); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + config, err := service.SysConfig().GetSmtp(ctx) + if err != nil { + return err + } + + in.Template, err = s.GetTemplate(ctx, in.Event, config) + if err != nil { + return err + } + + err = s.AllowSend(ctx, models, config) + if err != nil { + return err + } + + if consts.IsCodeEmsTemplate(in.Event) && in.Code == "" { + in.Code = grand.Digits(4) + } + + view, err := s.newView(ctx, in, config) + if err != nil { + return err + } + + if in.TplData == nil { + in.TplData = make(g.Map) + } + + switch in.Event { + // 富文本 + case consts.EmsTemplateText: + if in.Content == "" { + err = gerror.New("富文本类型邮件内容不能为空") + return + } + in.TplData["content"] = in.Content + in.Content, err = view.Parse(ctx, in.Template, in.TplData) + if err != nil { + return err + } + // 验证码、重置密码类 + default: + in.Content, err = view.Parse(ctx, in.Template, in.TplData) + if err != nil { + return err + } + } + + subject, ok := consts.EmsSubjectMap[in.Event] + if !ok { + subject = "HotGo" + } + + err = ems.Send(config, in.Email, subject, in.Content) + if err != nil { + return err + } + + var data = new(entity.SysEmsLog) + data.Event = in.Event + data.Email = in.Email + data.Content = in.Content + data.Code = in.Code + data.Ip = location.GetClientIp(ghttp.RequestFromCtx(ctx)) + data.Status = consts.EmsStatusNotUsed + data.CreatedAt = gtime.Now() + data.UpdatedAt = gtime.Now() + + _, err = dao.SysEmsLog.Ctx(ctx).Data(data).Insert() + if err != nil { + return err + } + + return nil +} + +func (s *sSysEmsLog) newView(ctx context.Context, in sysin.SendEmsInp, config *model.EmailConfig) (view *gview.View, err error) { + view = gview.New() + err = view.SetConfig(gview.Config{ + Delimiters: g.Cfg().MustGet(ctx, "viewer.delimiters").Strings(), + }) + if err != nil { + return + } + + // 富文本为自定义内容,可能不需要变量 + if in.Event == consts.EmsTemplateText { + return + } + var ( + username string + user = contexts.GetUser(ctx) + request = ghttp.RequestFromCtx(ctx) + ip = location.GetClientIp(request) + ) + + loc, err := location.GetLocation(ctx, ip) + if err != nil { + return + } + + if loc == nil { + loc = new(location.IpLocationData) + } + + cityLabel, err := location.ParseRegion(ctx, loc.ProvinceCode, loc.CityCode, 0) + if err != nil { + return + } + + basic, err := service.SysConfig().GetBasic(ctx) + if err != nil { + return + } + + if basic == nil { + basic = new(model.BasicConfig) + basic.Name = "HotGo" + basic.Domain = "https://hotgo.facms.cn" + basic.Logo = "http://bufanyun.cn-bj.ufileos.com/haoka/attachment/images/2023-02-04/cq9kf7s66jt7hkpvbh.png" + basic.SystemOpen = true + } + + if user != nil { + username = user.Username + } + + // 公共变量 + view.Assigns(gview.Params{ + "code": in.Code, // 验证码 + "expires": config.CodeExpire / 60, // 验证码有效期(分钟) + "username": username, // 发送者用户名 + "name": basic.Name, // 网站名称 + "logo": basic.Logo, // 网站logo + "domain": basic.Domain, // 网站域名 + "github": "https://github.com/bufanyun/hotgo", // github + "os": useragent.GetOs(request.Header.Get("User-Agent")), // 发送者操作系统 + "ip": gstr.HideStr(ip, 30, `*`), // 发送者IP + "cityLabel": cityLabel, // IP归属地 + }) + + // 重置密码 + if in.Event == consts.EmsTemplateResetPwd { + var ( + passwordResetLink string + resetToken = charset.RandomCreateBytes(32) + ) + if user != nil { + switch user.App { + // 后台用户 + case consts.AppAdmin: + _, err = g.Model("admin_member").Ctx(ctx).Where("id", user.Id).Data(g.Map{"password_reset_token": resetToken}).Update() + if err != nil { + return + } + passwordResetLink = fmt.Sprintf("%s/admin/passwordReset?token=%s", basic.Domain, resetToken) + // 前台用户 + case consts.AppApi: + // ... + } + } + view.Assign("passwordResetLink", passwordResetLink) + } + + return +} + +// GetTemplate 获取指定邮件模板 +func (s *sSysEmsLog) GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) { + if template == "" { + return "", gerror.New("模板不能为空") + } + if config == nil { + config, err = service.SysConfig().GetSmtp(ctx) + if err != nil { + return "", err + } + } + + if len(config.Template) == 0 { + return "", gerror.New("管理员还没有配置任何模板!") + } + + for _, v := range config.Template { + if v.Key == template { + return v.Value, nil + } + } + + return +} + +// AllowSend 是否允许发送 +func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) { + if models == nil { + return nil + } + + // 富文本事件不限制 + if models.Event == consts.EmsTemplateText { + return nil + } + + if config == nil { + config, err = service.SysConfig().GetSmtp(ctx) + if err != nil { + return err + } + } + + if gtime.Now().Before(models.CreatedAt.Add(time.Second * time.Duration(config.MinInterval))) { + return gerror.New("发送频繁,请稍后再试!") + } + + if config.MaxIpLimit > 0 { + count, err := dao.SysEmsLog.NowDayCount(ctx, models.Event, models.Email) + if err != nil { + return err + } + + if count >= config.MaxIpLimit { + return gerror.New("今天发送短信过多,请次日后再试!") + } + } + + return +} + +// VerifyCode 效验验证码 +func (s *sSysEmsLog) VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp) (err error) { + if in.Event == "" { + return gerror.New("事件不能为空") + } + if in.Email == "" { + return gerror.New("邮箱不能为空") + } + if in.Event == consts.EmsTemplateResetPwd || in.Event == consts.EmsTemplateText { + return gerror.Newf("事件类型无需验证:%v", in.Event) + } + + config, err := service.SysConfig().GetSmtp(ctx) + if err != nil { + return err + } + + var ( + models *entity.SysEmsLog + ) + if err = dao.SysEmsLog.Ctx(ctx).Where("event", in.Event).Where("email", in.Email).Order("id desc").Scan(&models); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + if models == nil { + return gerror.New("验证码错误") + } + + if models.Times >= 10 { + return gerror.New("验证码错误次数过多,请重新发送!") + } + + if in.Event != consts.EmsTemplateCode { + if models.Status == consts.EmsStatusUsed { + return gerror.New("验证码已使用,请重新发送!") + } + } + + if gtime.Now().After(models.CreatedAt.Add(time.Second * time.Duration(config.CodeExpire))) { + return gerror.New("验证码已过期,请重新发送") + } + + if models.Code != in.Code { + _, err = dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Increment("times", 1) + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + return gerror.New("验证码错误!") + } + + _, err = dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Data(g.Map{ + "times": models.Times + 1, + "status": consts.EmsStatusUsed, + "updated_at": gtime.Now(), + }).Update() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + + return +} diff --git a/server/internal/logic/sys/log.go b/server/internal/logic/sys/log.go index 7fff33c..15bb698 100644 --- a/server/internal/logic/sys/log.go +++ b/server/internal/logic/sys/log.go @@ -20,6 +20,7 @@ import ( "hotgo/internal/consts" "hotgo/internal/dao" "hotgo/internal/library/contexts" + "hotgo/internal/library/hgorm/hook" "hotgo/internal/library/location" "hotgo/internal/library/queue" "hotgo/internal/model/entity" @@ -54,7 +55,7 @@ func (s *sSysLog) Export(ctx context.Context, in sysin.LogListInp) (err error) { ReqId string `json:"req_id" description:"对外id"` TakeUpTime int64 `json:"take_up_time" description:"请求耗时"` CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` - MemberName string `json:"member_name"` + MemberName string `json:"memberName"` Region string `json:"region"` } @@ -222,7 +223,7 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog { // View 获取指定字典类型信息 func (s *sSysLog) View(ctx context.Context, in sysin.LogViewInp) (res *sysin.LogViewModel, err error) { - if err = dao.SysLog.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil { + if err = dao.SysLog.Ctx(ctx).Hook(hook.CityLabel).Where("id", in.Id).Scan(&res); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return nil, err } diff --git a/server/internal/logic/sys/login_log.go b/server/internal/logic/sys/login_log.go index 0a67727..b30c2c3 100644 --- a/server/internal/logic/sys/login_log.go +++ b/server/internal/logic/sys/login_log.go @@ -13,12 +13,16 @@ import ( "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/consts" "hotgo/internal/dao" "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/library/hgorm/hook" + "hotgo/internal/library/location" "hotgo/internal/library/queue" "hotgo/internal/model/entity" "hotgo/internal/model/input/form" @@ -89,18 +93,19 @@ func (s *sSysLoginLog) List(ctx context.Context, in sysin.LoginLogListInp) (list {Dao: dao.SysLog, Alias: "sysLog"}, }) - if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysLoginLog.Columns().Id).Scan(&list); err != nil { + if err = mod.Fields(fields).Hook(hook.CityLabel).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysLoginLog.Columns().Id).Scan(&list); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return list, totalCount, err } for _, v := range list { - // 获取省市编码对应的地区名称 - region, err := dao.SysProvinces.GetRegion(ctx, v.SysLogProvinceId, v.SysLogCityId) - if err != nil { - return list, totalCount, err - } - v.Region = region + g.DumpWithType(v) + //// 获取省市编码对应的地区名称 + //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) } @@ -162,9 +167,10 @@ func (s *sSysLoginLog) View(ctx context.Context, in sysin.LoginLogViewInp) (res func (s *sSysLoginLog) Push(ctx context.Context, in sysin.LoginLogPushInp) { var models entity.SysLoginLog models.ReqId = gctx.CtxId(ctx) - models.MemberId = in.Response.UserId + models.MemberId = in.Response.Id models.Username = in.Input.Username models.LoginAt = gtime.Now() + models.LoginIp = location.GetClientIp(ghttp.RequestFromCtx(ctx)) models.Status = consts.StatusEnabled if in.Err != nil { @@ -173,7 +179,7 @@ func (s *sSysLoginLog) Push(ctx context.Context, in sysin.LoginLogPushInp) { } models.Response = gjson.New(consts.NilJsonToString) - if in.Response != nil && in.Response.UserId > 0 { + if in.Response != nil && in.Response.Id > 0 { models.Response = gjson.New(in.Response) } diff --git a/server/internal/logic/sys/provinces.go b/server/internal/logic/sys/provinces.go index f9f9e56..7b7156b 100644 --- a/server/internal/logic/sys/provinces.go +++ b/server/internal/logic/sys/provinces.go @@ -16,6 +16,7 @@ import ( "hotgo/internal/dao" "hotgo/internal/library/hgorm" "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" "hotgo/internal/service" "hotgo/utility/tree" @@ -165,7 +166,7 @@ func (s *sSysProvinces) MaxSort(ctx context.Context, in sysin.ProvincesMaxSortIn return nil, err } - res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int() + res.Sort = form.DefaultMaxSort(ctx, res.Sort) return res, nil } @@ -258,3 +259,34 @@ func (s *sSysProvinces) UniqueId(ctx context.Context, in sysin.ProvincesUniqueId return res, nil } + +// Select 省市区选项 +func (s *sSysProvinces) Select(ctx context.Context, in sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error) { + res = new(sysin.ProvincesSelectModel) + mod := dao.SysProvinces.Ctx(ctx). + Fields("id as value, title as label, level"). + Where("pid", in.Value) + + if err = mod.Order("sort asc,id asc").Scan(&res.List); err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return + } + + for _, v := range res.List { + if in.DataType == "p" { + v.IsLeaf = true + continue + } + if in.DataType == "pc" && v.Level >= 2 { + v.IsLeaf = true + continue + } + + if in.DataType == "pca" && v.Level >= 3 { + v.IsLeaf = true + continue + } + } + + return +} diff --git a/server/internal/logic/sys/serve_log.go b/server/internal/logic/sys/serve_log.go index 2cfc17c..4e8d1fc 100644 --- a/server/internal/logic/sys/serve_log.go +++ b/server/internal/logic/sys/serve_log.go @@ -16,6 +16,7 @@ import ( "hotgo/internal/consts" "hotgo/internal/dao" "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model/entity" "hotgo/internal/model/input/form" "hotgo/internal/model/input/sysin" @@ -83,7 +84,7 @@ func (s *sSysServeLog) List(ctx context.Context, in sysin.ServeLogListInp) (list fields, err := hgorm.GenJoinSelect(ctx, sysin.ServeLogListModel{}, dao.SysServeLog, []*hgorm.Join{ {Dao: dao.SysLog, Alias: "sysLog"}, }) - if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list); err != nil { + if err = mod.Fields(fields).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return list, totalCount, err } diff --git a/server/internal/logic/sys/sms_log.go b/server/internal/logic/sys/sms_log.go index 911bc6f..18f59e3 100644 --- a/server/internal/logic/sys/sms_log.go +++ b/server/internal/logic/sys/sms_log.go @@ -143,7 +143,7 @@ func (s *sSysSmsLog) List(ctx context.Context, in sysin.SmsLogListInp) (list []* return list, totalCount, nil } - if err = mod.Page(int(in.Page), int(in.PerPage)).Order("id desc").Scan(&list); err != nil { + if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil { err = gerror.Wrap(err, consts.ErrorORM) return list, totalCount, err } diff --git a/server/internal/model/config.go b/server/internal/model/config.go index 142bcec..7893809 100644 --- a/server/internal/model/config.go +++ b/server/internal/model/config.go @@ -1,14 +1,37 @@ package model +// BasicConfig 基础配置 +type BasicConfig struct { + CaptchaSwitch int `json:"basicCaptchaSwitch"` + CloseText string `json:"basicCloseText"` + Copyright string `json:"basicCopyright"` + IcpCode string `json:"basicIcpCode"` + Logo string `json:"basicLogo"` + Name string `json:"basicName"` + Domain string `json:"basicDomain"` + RegisterSwitch int `json:"basicRegisterSwitch"` + SystemOpen bool `json:"basicSystemOpen"` +} + +// EmailTemplate 邮件模板 +type EmailTemplate struct { + Key string `json:"key"` + Value string `json:"value"` +} + // EmailConfig 邮箱配置 type EmailConfig struct { - User string `json:"smtpUser"` - Password string `json:"smtpPass"` - Addr string `json:"smtpAddr"` - Host string `json:"smtpHost"` - Port int64 `json:"smtpPort"` - SendName string `json:"smtpSendName"` - AdminMailbox string `json:"smtpAdminMailbox"` + User string `json:"smtpUser"` + Password string `json:"smtpPass"` + Addr string `json:"smtpAddr"` + Host string `json:"smtpHost"` + Port int64 `json:"smtpPort"` + SendName string `json:"smtpSendName"` + AdminMailbox string `json:"smtpAdminMailbox"` + MinInterval int `json:"smtpMinInterval"` + MaxIpLimit int `json:"smtpMaxIpLimit"` + CodeExpire int `json:"smtpCodeExpire"` + Template []*EmailTemplate `json:"smtpTemplate"` } // CashConfig 提现配置 @@ -92,6 +115,7 @@ type ServeLogConfig struct { // GenerateAppCrudTemplate curd模板 type GenerateAppCrudTemplate struct { Group string `json:"group"` + MasterPackage string `json:"masterPackage"` TemplatePath string `json:"templatePath"` ApiPath string `json:"apiPath"` InputPath string `json:"inputPath"` diff --git a/server/internal/model/context.go b/server/internal/model/context.go index 05b2d70..ac59e2e 100644 --- a/server/internal/model/context.go +++ b/server/internal/model/context.go @@ -21,20 +21,17 @@ type Context struct { // Identity 通用身份模型 type Identity struct { - Id int64 `json:"id" description:"会员ID"` - Pid int64 `json:"pid" description:"上级ID"` - DeptId int64 `json:"deptId" description:"部门ID"` - RoleId int64 `json:"roleId" description:"角色ID"` - RoleKey string `json:"roleKey" description:"角色唯一标识符"` - Username string `json:"username" description:"用户名"` - RealName string `json:"realName" description:"昵称"` - Avatar string `json:"avatar" description:"头像"` - Email string `json:"email" description:"邮箱"` - Mobile string `json:"mobile" description:"手机号码"` - VisitCount uint `json:"visitCount" description:"访问次数"` - LastTime int `json:"lastTime" description:"最后一次登录时间"` - LastIp string `json:"lastIp" description:"最后一次登录ip"` - Exp int64 `json:"exp" description:"登录有效期截止时间戳"` - Expires int64 `json:"expires" description:"登录有效期"` - App string `json:"app" description:"登录应用"` + Id int64 `json:"id" description:"用户ID"` + Pid int64 `json:"pid" description:"上级ID"` + DeptId int64 `json:"deptId" description:"部门ID"` + RoleId int64 `json:"roleId" description:"角色ID"` + RoleKey string `json:"roleKey" description:"角色唯一标识符"` + Username string `json:"username" description:"用户名"` + RealName string `json:"realName" description:"姓名"` + Avatar string `json:"avatar" description:"头像"` + Email string `json:"email" description:"邮箱"` + Mobile string `json:"mobile" description:"手机号码"` + Exp int64 `json:"exp" description:"登录有效期截止时间戳"` + Expires int64 `json:"expires" description:"登录有效期"` + App string `json:"app" description:"登录应用"` } diff --git a/server/internal/model/do/admin_member.go b/server/internal/model/do/admin_member.go index 2470091..8314e6b 100644 --- a/server/internal/model/do/admin_member.go +++ b/server/internal/model/do/admin_member.go @@ -5,6 +5,7 @@ package do import ( + "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" ) @@ -21,22 +22,20 @@ type AdminMember struct { Salt interface{} // 密码盐 AuthKey interface{} // 授权令牌 PasswordResetToken interface{} // 密码重置令牌 + Balance interface{} // 余额 Avatar interface{} // 头像 Sex interface{} // 性别 Qq interface{} // qq Email interface{} // 邮箱 Mobile interface{} // 手机号码 Birthday *gtime.Time // 生日 - ProvinceId interface{} // 省编码 CityId interface{} // 城市编码 - CountyId interface{} // 区域编码 Address interface{} // 联系地址 - VisitCount interface{} // 访问次数 - LastTime interface{} // 最后一次登录时间 - LastIp interface{} // 最后一次登录ip Pid interface{} // 上级管理员ID Level interface{} // 关系树等级 Tree interface{} // 关系树 + Cash *gjson.Json // 提现配置 + LastActiveAt *gtime.Time // 最后活跃时间 Remark interface{} // 备注 Status interface{} // 状态 CreatedAt *gtime.Time // 创建时间 diff --git a/server/internal/model/do/admin_notice.go b/server/internal/model/do/admin_notice.go index da86c70..cb6e97f 100644 --- a/server/internal/model/do/admin_notice.go +++ b/server/internal/model/do/admin_notice.go @@ -5,6 +5,7 @@ package do import ( + "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" ) @@ -15,12 +16,15 @@ type AdminNotice struct { Id interface{} // 公告ID Title interface{} // 公告标题 Type interface{} // 公告类型 + Tag interface{} // 标签 Content interface{} // 公告内容 - Receiver interface{} // 接收者 - Reader interface{} // 已读人 + Receiver *gjson.Json // 接收者 Remark interface{} // 备注 Sort interface{} // 排序 Status interface{} // 公告状态 + CreatedBy interface{} // 发送人 + UpdatedBy interface{} // 修改人 CreatedAt *gtime.Time // 创建时间 UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 } diff --git a/server/internal/model/do/admin_notice_read.go b/server/internal/model/do/admin_notice_read.go new file mode 100644 index 0000000..f8d204a --- /dev/null +++ b/server/internal/model/do/admin_notice_read.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AdminNoticeRead is the golang structure of table hg_admin_notice_read for DAO operations like Where/Data. +type AdminNoticeRead struct { + g.Meta `orm:"table:hg_admin_notice_read, do:true"` + Id interface{} // 记录ID + NoticeId interface{} // 公告ID + MemberId interface{} // 会员ID + Clicks interface{} // 已读次数 + UpdatedAt *gtime.Time // 更新时间 + CreatedAt *gtime.Time // 阅读时间 +} diff --git a/server/internal/model/do/sys_ems_log.go b/server/internal/model/do/sys_ems_log.go new file mode 100644 index 0000000..4829920 --- /dev/null +++ b/server/internal/model/do/sys_ems_log.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysEmsLog is the golang structure of table hg_sys_ems_log for DAO operations like Where/Data. +type SysEmsLog struct { + g.Meta `orm:"table:hg_sys_ems_log, do:true"` + Id interface{} // 主键 + Event interface{} // 事件 + Email interface{} // 邮箱地址,多个用;隔开 + Code interface{} // 验证码 + Times interface{} // 验证次数 + Content interface{} // 邮件内容 + Ip interface{} // ip地址 + Status interface{} // 状态(1未验证,2已验证) + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 +} diff --git a/server/internal/model/do/sys_gen_codes.go b/server/internal/model/do/sys_gen_codes.go index 014d999..0c2debf 100644 --- a/server/internal/model/do/sys_gen_codes.go +++ b/server/internal/model/do/sys_gen_codes.go @@ -15,6 +15,7 @@ type SysGenCodes struct { g.Meta `orm:"table:hg_sys_gen_codes, do:true"` Id interface{} // 生成ID GenType interface{} // 生成类型 + GenTemplate interface{} // 生成模板 VarName interface{} // 实体命名 Options *gjson.Json // 配置选项 DbName interface{} // 数据库名称 diff --git a/server/internal/model/do/sys_gen_curd_demo.go b/server/internal/model/do/sys_gen_curd_demo.go index 39692e2..82b6644 100644 --- a/server/internal/model/do/sys_gen_curd_demo.go +++ b/server/internal/model/do/sys_gen_curd_demo.go @@ -19,6 +19,7 @@ type SysGenCurdDemo struct { Content interface{} // 内容 Image interface{} // 单图 Attachfile interface{} // 附件 + CityId interface{} // 所在城市 Switch interface{} // 显示开关 Sort interface{} // 排序 Status interface{} // 状态 diff --git a/server/internal/model/do/sys_login_log.go b/server/internal/model/do/sys_login_log.go index 25898d3..30aeef7 100644 --- a/server/internal/model/do/sys_login_log.go +++ b/server/internal/model/do/sys_login_log.go @@ -19,6 +19,7 @@ type SysLoginLog struct { Username interface{} // 用户名 Response *gjson.Json // 响应数据 LoginAt *gtime.Time // 登录时间 + LoginIp interface{} // 登录IP ErrMsg interface{} // 错误提示 Status interface{} // 状态 CreatedAt *gtime.Time // 创建时间 diff --git a/server/internal/model/do/test.go b/server/internal/model/do/test.go index 82b15e2..5a34e64 100644 --- a/server/internal/model/do/test.go +++ b/server/internal/model/do/test.go @@ -39,6 +39,7 @@ type Test struct { Mobile interface{} // 手机号码 Hobby *gjson.Json // 爱好 Channel interface{} // 渠道 + CityId interface{} // 所在城市 Pid interface{} // 上级ID Level interface{} // 树等级 Tree interface{} // 关系树 diff --git a/server/internal/model/entity/admin_member.go b/server/internal/model/entity/admin_member.go index fd3518e..3147f40 100644 --- a/server/internal/model/entity/admin_member.go +++ b/server/internal/model/entity/admin_member.go @@ -5,6 +5,7 @@ package entity import ( + "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/os/gtime" ) @@ -19,22 +20,20 @@ type AdminMember struct { Salt string `json:"salt" description:"密码盐"` AuthKey string `json:"authKey" description:"授权令牌"` PasswordResetToken string `json:"passwordResetToken" description:"密码重置令牌"` + Balance float64 `json:"balance" description:"余额"` Avatar string `json:"avatar" description:"头像"` Sex int `json:"sex" description:"性别"` Qq string `json:"qq" description:"qq"` Email string `json:"email" description:"邮箱"` Mobile string `json:"mobile" description:"手机号码"` Birthday *gtime.Time `json:"birthday" description:"生日"` - ProvinceId int64 `json:"provinceId" description:"省编码"` CityId int64 `json:"cityId" description:"城市编码"` - CountyId int64 `json:"countyId" description:"区域编码"` Address string `json:"address" description:"联系地址"` - VisitCount uint `json:"visitCount" description:"访问次数"` - LastTime int `json:"lastTime" description:"最后一次登录时间"` - LastIp string `json:"lastIp" description:"最后一次登录ip"` Pid int64 `json:"pid" description:"上级管理员ID"` Level int `json:"level" description:"关系树等级"` Tree string `json:"tree" description:"关系树"` + Cash *gjson.Json `json:"cash" description:"提现配置"` + LastActiveAt *gtime.Time `json:"lastActiveAt" description:"最后活跃时间"` Remark string `json:"remark" description:"备注"` Status int `json:"status" description:"状态"` CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` diff --git a/server/internal/model/entity/admin_notice.go b/server/internal/model/entity/admin_notice.go index 00a2622..59486d8 100644 --- a/server/internal/model/entity/admin_notice.go +++ b/server/internal/model/entity/admin_notice.go @@ -5,6 +5,7 @@ package entity import ( + "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/os/gtime" ) @@ -13,12 +14,15 @@ type AdminNotice struct { Id int64 `json:"id" description:"公告ID"` Title string `json:"title" description:"公告标题"` Type int64 `json:"type" description:"公告类型"` + Tag int `json:"tag" description:"标签"` Content string `json:"content" description:"公告内容"` - Receiver string `json:"receiver" description:"接收者"` - Reader string `json:"reader" description:"已读人"` + Receiver *gjson.Json `json:"receiver" description:"接收者"` Remark string `json:"remark" description:"备注"` Sort int `json:"sort" description:"排序"` Status int `json:"status" description:"公告状态"` + CreatedBy int64 `json:"createdBy" description:"发送人"` + UpdatedBy int64 `json:"updatedBy" description:"修改人"` CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"` + DeletedAt *gtime.Time `json:"deletedAt" description:"删除时间"` } diff --git a/server/internal/model/entity/admin_notice_read.go b/server/internal/model/entity/admin_notice_read.go new file mode 100644 index 0000000..4bfb40e --- /dev/null +++ b/server/internal/model/entity/admin_notice_read.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AdminNoticeRead is the golang structure for table admin_notice_read. +type AdminNoticeRead struct { + Id int64 `json:"id" description:"记录ID"` + NoticeId int64 `json:"noticeId" description:"公告ID"` + MemberId int64 `json:"memberId" description:"会员ID"` + Clicks int `json:"clicks" description:"已读次数"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"` + CreatedAt *gtime.Time `json:"createdAt" description:"阅读时间"` +} diff --git a/server/internal/model/entity/sys_ems_log.go b/server/internal/model/entity/sys_ems_log.go new file mode 100644 index 0000000..79734de --- /dev/null +++ b/server/internal/model/entity/sys_ems_log.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysEmsLog is the golang structure for table sys_ems_log. +type SysEmsLog struct { + Id int64 `json:"id" description:"主键"` + Event string `json:"event" description:"事件"` + Email string `json:"email" description:"邮箱地址,多个用;隔开"` + Code string `json:"code" description:"验证码"` + Times int64 `json:"times" description:"验证次数"` + Content string `json:"content" description:"邮件内容"` + Ip string `json:"ip" description:"ip地址"` + Status int `json:"status" description:"状态(1未验证,2已验证)"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"` +} diff --git a/server/internal/model/entity/sys_gen_codes.go b/server/internal/model/entity/sys_gen_codes.go index 19563e6..8356ebb 100644 --- a/server/internal/model/entity/sys_gen_codes.go +++ b/server/internal/model/entity/sys_gen_codes.go @@ -13,6 +13,7 @@ import ( type SysGenCodes struct { Id int64 `json:"id" description:"生成ID"` GenType uint `json:"genType" description:"生成类型"` + GenTemplate int `json:"genTemplate" description:"生成模板"` VarName string `json:"varName" description:"实体命名"` Options *gjson.Json `json:"options" description:"配置选项"` DbName string `json:"dbName" description:"数据库名称"` diff --git a/server/internal/model/entity/sys_gen_curd_demo.go b/server/internal/model/entity/sys_gen_curd_demo.go index 7c9395a..27c737a 100644 --- a/server/internal/model/entity/sys_gen_curd_demo.go +++ b/server/internal/model/entity/sys_gen_curd_demo.go @@ -17,6 +17,7 @@ type SysGenCurdDemo struct { Content string `json:"content" description:"内容"` Image string `json:"image" description:"单图"` Attachfile string `json:"attachfile" description:"附件"` + CityId int64 `json:"cityId" description:"所在城市"` Switch int `json:"switch" description:"显示开关"` Sort int `json:"sort" description:"排序"` Status int `json:"status" description:"状态"` diff --git a/server/internal/model/entity/sys_login_log.go b/server/internal/model/entity/sys_login_log.go index e6baad8..f652464 100644 --- a/server/internal/model/entity/sys_login_log.go +++ b/server/internal/model/entity/sys_login_log.go @@ -17,6 +17,7 @@ type SysLoginLog struct { Username string `json:"username" description:"用户名"` Response *gjson.Json `json:"response" description:"响应数据"` LoginAt *gtime.Time `json:"loginAt" description:"登录时间"` + LoginIp string `json:"loginIp" description:"登录IP"` ErrMsg string `json:"errMsg" description:"错误提示"` Status int `json:"status" description:"状态"` CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` diff --git a/server/internal/model/entity/test.go b/server/internal/model/entity/test.go index f7dbe4a..97345d7 100644 --- a/server/internal/model/entity/test.go +++ b/server/internal/model/entity/test.go @@ -37,6 +37,7 @@ type Test struct { Mobile string `json:"mobile" description:"手机号码"` Hobby *gjson.Json `json:"hobby" description:"爱好"` Channel int `json:"channel" description:"渠道"` + CityId int64 `json:"cityId" description:"所在城市"` Pid int64 `json:"pid" description:"上级ID"` Level int `json:"level" description:"树等级"` Tree string `json:"tree" description:"关系树"` diff --git a/server/internal/model/input/adminin/member.go b/server/internal/model/input/adminin/member.go index 09c1713..16c4f57 100644 --- a/server/internal/model/input/adminin/member.go +++ b/server/internal/model/input/adminin/member.go @@ -12,15 +12,34 @@ import ( "hotgo/internal/model/input/form" ) -// GetIdByCodeInp 通过邀请码获取会员ID +// MemberUpdateCashInp 更新会员提现信息 +type MemberUpdateCashInp struct { + Name string `json:"name" v:"required#支付宝姓名不能为空" dc:"支付宝姓名"` + PayeeCode string `json:"payeeCode" v:"required#支付宝收款码不能为空" dc:"支付宝收款码"` + Account string `json:"account" v:"required#支付宝账号不能为空" dc:"支付宝账号"` + Password string `json:"password" v:"required#密码不能为空" dc:"密码"` +} + +type MemberUpdateEmailInp struct { + Email string `json:"email" v:"required#换绑邮箱不能为空" dc:"换绑邮箱"` + Code string `json:"code" dc:"原邮箱验证码"` +} + +// MemberUpdateMobileInp 换绑手机号 +type MemberUpdateMobileInp struct { + Mobile string `json:"mobile" v:"required#换绑手机号不能为空" dc:"换绑手机号"` + Code string `json:"code" dc:"原号码短信验证码"` +} + +// GetIdByCodeInp 通过邀请码获取用户ID type GetIdByCodeInp struct { - Code string `json:"code""` + Code string `json:"code"` } type GetIdByCodeModel struct { Id int64 } -// MemberProfileInp 获取指定会员资料 +// MemberProfileInp 获取指定用户资料 type MemberProfileInp struct { Id int64 } @@ -34,30 +53,34 @@ type MemberProfileModel struct { RoleIds int64 `json:"roleIds" description:"当前角色"` } -// MemberUpdateProfileInp 更新会员资料 +// MemberUpdateProfileInp 更新用户资料 type MemberUpdateProfileInp struct { - Mobile int - Email string - Realname string + Avatar string `json:"avatar" v:"required#头像不能为空" dc:"头像"` + RealName string `json:"realName" v:"required#真实姓名不能为空" dc:"真实姓名"` + Qq string `json:"qq" dc:"QQ"` + Birthday *gtime.Time `json:"birthday" dc:"生日"` + Sex int `json:"sex" dc:"性别"` + Address string `json:"address" dc:"联系地址"` + CityId int64 `json:"cityId" dc:"城市编码"` } // MemberUpdatePwdInp 修改登录密码 type MemberUpdatePwdInp struct { Id int64 - OldPassword string - NewPassword string + OldPassword string `json:"oldPassword" v:"required#原密码不能为空" dc:"原密码"` + NewPassword string `json:"newPassword" v:"required|length:6,16#新密码不能为空#新密码需在6~16之间" dc:"新密码"` } // MemberResetPwdInp 重置密码 type MemberResetPwdInp struct { - Password string - Id int64 + Password string `json:"password" v:"required#密码不能为空" dc:"密码"` + Id int64 `json:"id" dc:"用户ID"` } // MemberEmailUniqueInp 邮箱是否唯一 type MemberEmailUniqueInp struct { - Email string - Id int64 + Email string `json:"email" v:"required#邮箱不能为空" dc:"邮箱"` + Id int64 `json:"id" dc:"用户ID"` } type MemberEmailUniqueModel struct { @@ -66,8 +89,8 @@ type MemberEmailUniqueModel struct { // MemberMobileUniqueInp 手机号是否唯一 type MemberMobileUniqueInp struct { - Mobile string - Id int64 + Mobile string `json:"mobile" v:"required#手机号不能为空" dc:"手机号"` + Id int64 `json:"id" dc:"用户ID"` } type MemberMobileUniqueModel struct { @@ -76,8 +99,8 @@ type MemberMobileUniqueModel struct { // MemberNameUniqueInp 名称是否唯一 type MemberNameUniqueInp struct { - Username string - Id int64 + Username string `json:"username" v:"required#用户名称不能为空" dc:"用户名称"` + Id int64 `json:"id" dc:"用户ID"` } type MemberNameUniqueModel struct { @@ -86,7 +109,7 @@ type MemberNameUniqueModel struct { // MemberMaxSortInp 最大排序 type MemberMaxSortInp struct { - Id int64 + Id int64 `json:"id" dc:"用户ID"` } type MemberMaxSortModel struct { @@ -101,7 +124,7 @@ type MemberEditInp struct { DeptId int64 `json:"deptId" v:"required#部门不能为空" description:"部门ID"` Username string `json:"username" v:"required#账号不能为空" description:"帐号"` Password string `json:"password" description:"密码"` - Realname string `json:"realName" description:"真实姓名"` + RealName string `json:"realName" description:"真实姓名"` Avatar string `json:"avatar" description:"头像"` Sex string `json:"sex" description:"性别"` Qq string `json:"qq" description:"qq"` @@ -120,8 +143,8 @@ type MemberEditInp struct { type MemberAddInp struct { MemberEditInp - PasswordHash string `json:"passwordHash" description:"密码hash"` - Salt string `json:"salt" description:"密码盐"` + PasswordHash string `json:"passwordHash" description:"密码hash"` + Salt string `json:"salt" description:"密码盐"` Pid int64 `json:"pid" description:"上级ID"` Level int `json:"level" description:"等级"` Tree string `json:"tree" description:"关系树"` @@ -131,17 +154,19 @@ type MemberEditModel struct{} // MemberDeleteInp 删除字典类型 type MemberDeleteInp struct { - Id interface{} + Id interface{} `json:"id" v:"required#用户ID不能为空" dc:"用户ID"` } type MemberDeleteModel struct{} // MemberViewInp 获取信息 type MemberViewInp struct { - Id int64 + Id int64 `json:"id" dc:"用户ID"` } type MemberViewModel struct { entity.AdminMember + DeptName string `json:"deptName" description:"所属部门"` + RoleName string `json:"roleName" description:"所属角色"` } // MemberListInp 获取列表 @@ -149,21 +174,21 @@ type MemberListInp struct { form.PageReq form.RangeDateReq form.StatusReq - Name string - Code string - DeptId int - Mobile int - Username string - Realname string - CreatedAt []int64 + DeptId int `json:"deptId" dc:"部门ID"` + Mobile int `json:"mobile" dc:"手机号"` + Username string `json:"username" dc:"用户名"` + RealName string `json:"realName" dc:"真实姓名"` + Name string `json:"name" dc:"岗位名称"` + Code string `json:"code" dc:"岗位编码"` + CreatedAt []int64 `json:"createdAt" dc:"创建时间"` } type MemberListModel struct { entity.AdminMember - DeptName string `json:"deptName"` - RoleName string `json:"roleName"` - PostIds []int64 `json:"postIds"` - DeptId int64 `json:"deptId" description:"部门ID"` + DeptName string `json:"deptName" description:"所属部门"` + RoleName string `json:"roleName" description:"所属角色"` + PostIds []int64 `json:"postIds" description:"岗位"` + DeptId int64 `json:"deptId" description:"部门ID"` } // MemberLoginInp 登录 @@ -172,18 +197,42 @@ type MemberLoginInp struct { Password string } type MemberLoginModel struct { - UserId int64 `json:"userId" description:"会员ID"` - Username string `json:"username" description:"用户名"` - RealName string `json:"realName" description:"昵称"` - Avatar string `json:"avatar" description:"头像"` - Token string `json:"token" v:"" description:"登录token"` - Permissions []*MemberLoginPermissions `json:"permissions" description:"角色信息"` + Id int64 `json:"id" description:"用户ID"` + Token string `json:"token" description:"登录token"` + Expires int64 `json:"expires" description:"登录有效期"` +} + +type LoginMemberInfoModel struct { + Id int64 `json:"id" description:"用户ID"` + DeptName string `json:"deptName" description:"所属部门"` + RoleName string `json:"roleName" description:"所属角色"` + Permissions []string `json:"permissions" description:"角色信息"` + DeptId int64 `json:"-" description:"部门ID"` + RoleId int64 `json:"-" description:"角色ID"` + Username string `json:"username" description:"用户名"` + RealName string `json:"realName" description:"姓名"` + Avatar string `json:"avatar" description:"头像"` + Balance float64 `json:"balance" description:"余额"` + Sex int `json:"sex" description:"性别"` + Qq string `json:"qq" description:"qq"` + Email string `json:"email" description:"邮箱"` + Mobile string `json:"mobile" description:"手机号码"` + Birthday *gtime.Time `json:"birthday" description:"生日"` + CityId int64 `json:"cityId" description:"城市编码"` + Address string `json:"address" description:"联系地址"` + Cash *MemberCash `json:"cash" description:"收款信息"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + *MemberLoginStatModel } // MemberLoginPermissions 登录用户角色信息 -type MemberLoginPermissions struct { - Label string `json:"label" description:"标签"` - Value string `json:"value" description:"值"` +type MemberLoginPermissions []string + +// MemberCash 用户提现配置 +type MemberCash struct { + Name string `json:"name" dc:"收款人姓名"` + Account string `json:"account" dc:"收款账户"` + PayeeCode string `json:"payeeCode" dc:"收款码"` } // MemberStatusInp 更新状态 @@ -191,3 +240,25 @@ type MemberStatusInp struct { entity.AdminPost } type MemberStatusModel struct{} + +// MemberSelectInp 获取可选的后台用户选项 +type MemberSelectInp struct { +} + +type MemberSelectModel struct { + Value int64 `json:"value" dc:"用户ID"` + Label string `json:"label" dc:"真实姓名"` + Username string `json:"username" dc:"用户名"` + Avatar string `json:"avatar" dc:"头像"` +} + +// MemberLoginStatInp 用户登录统计 +type MemberLoginStatInp struct { + MemberId int64 +} + +type MemberLoginStatModel struct { + LoginCount int `json:"loginCount" dc:"登录次数"` + LastLoginAt *gtime.Time `json:"lastLoginAt" dc:"最后登录时间"` + LastLoginIp string `json:"lastLoginIp" dc:"最后登录IP"` +} diff --git a/server/internal/model/input/adminin/menu.go b/server/internal/model/input/adminin/menu.go index 5ef03e7..8113f29 100644 --- a/server/internal/model/input/adminin/menu.go +++ b/server/internal/model/input/adminin/menu.go @@ -15,7 +15,7 @@ import ( // MenuMaxSortReq 菜单最大排序 type MenuMaxSortReq struct { - g.Meta `path:"/menu/max_sort" method:"get" tags:"菜单" summary:"菜单最大排序"` + g.Meta `path:"/menu/maxSort" method:"get" tags:"菜单" summary:"菜单最大排序"` Id int64 `json:"id" dc:"菜单ID"` } type MenuMaxSortRes struct { diff --git a/server/internal/model/input/adminin/notice.go b/server/internal/model/input/adminin/notice.go index 64ce8c1..ca09a53 100644 --- a/server/internal/model/input/adminin/notice.go +++ b/server/internal/model/input/adminin/notice.go @@ -7,6 +7,7 @@ package adminin import ( + "github.com/gogf/gf/v2/os/gtime" "hotgo/internal/model/entity" "hotgo/internal/model/input/form" ) @@ -20,23 +21,23 @@ type NoticeMaxSortModel struct { Sort int } -// NoticeEditInp 修改/新增字典数据 +// NoticeEditInp 修改/新增 type NoticeEditInp struct { entity.AdminNotice - Receiver string `json:"receiver" description:"接收者"` - Reader string `json:"reader" description:"已读人"` + Receiver []int64 `json:"receiver" dc:"接收者"` + SenderAvatar string `json:"senderAvatar" dc:"发送者头像"` } type NoticeEditModel struct{} // NoticeDeleteInp 删除字典类型 type NoticeDeleteInp struct { - Id interface{} + Id interface{} `json:"id" v:"required#公告ID不能为空" dc:"公告ID"` } type NoticeDeleteModel struct{} // NoticeViewInp 获取信息 type NoticeViewInp struct { - Id int64 + Id int64 `json:"id" v:"required#公告ID不能为空" dc:"公告ID"` } type NoticeViewModel struct { @@ -50,11 +51,13 @@ type NoticeListInp struct { form.StatusReq Title string Content string + Type int64 } type NoticeListModel struct { entity.AdminNotice - ReceiveNum int `json:"receiveNum"` + ReadCount float64 `json:"readCount" dc:"阅读次数"` + ReceiverGroup []form.AvatarGroup `json:"receiverGroup" dc:"接收人头像组"` } // NoticeStatusInp 更新状态 @@ -62,3 +65,66 @@ type NoticeStatusInp struct { entity.AdminNotice } type NoticeStatusModel struct{} + +// NoticeUpReadInp 更新已读 +type NoticeUpReadInp struct { + Id int64 `json:"id" v:"required#公告ID不能为空" dc:"公告ID"` +} + +// NoticeReadAllInp 全部已读 +type NoticeReadAllInp struct { + Type int64 `json:"type" v:"required#公告类型不能为空" dc:"公告类型"` +} + +// PullMessagesInp 获取列表 +type PullMessagesInp struct { + Limit int `json:"limit" dc:"拉取最大数量限制"` +} + +type PullMessagesRow struct { + Id int64 `json:"id" dc:"消息ID"` + Type int64 `json:"type" dc:"消息类型"` + Title string `json:"title" dc:"消息标题"` + Content string `json:"content" dc:"消息内容"` + Tag int64 `json:"tag" dc:"标签"` + Sort int64 `json:"sort" dc:"排序"` + CreatedBy int64 `json:"createdBy" dc:"发送人"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + SenderAvatar string `json:"senderAvatar" dc:"发送者头像"` + IsRead bool `json:"isRead" dc:"是否已读"` +} + +type PullMessagesModel struct { + List []*PullMessagesRow `json:"list" dc:"消息列表"` + *NoticeUnreadCountModel +} + +type NoticeUnreadCountInp struct { + MemberId int64 + MessageIds []int64 +} + +type NoticeUnreadCountModel struct { + NotifyCount int `json:"notifyCount" dc:"未读通知数量"` + NoticeCount int `json:"noticeCount" dc:"未读公告数量"` + LetterCount int `json:"letterCount" dc:"未读私信数量"` +} + +// NoticeMessageListInp 我的消息列表 +type NoticeMessageListInp struct { + form.PageReq + Type int64 `json:"type" v:"required#公告类型不能为空" dc:"公告类型"` +} + +type NoticeMessageListModel struct { + Id int64 `json:"id" dc:"消息ID"` + Type int64 `json:"type" dc:"消息类型"` + Title string `json:"title" dc:"消息标题"` + Content string `json:"content" dc:"消息内容"` + Tag int64 `json:"tag" dc:"标签"` + Sort int64 `json:"sort" dc:"排序"` + CreatedBy int64 `json:"createdBy" dc:"发送人"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + SenderAvatar string `json:"senderAvatar" dc:"发送者头像"` + IsRead bool `json:"isRead" dc:"是否已读"` +} diff --git a/server/internal/model/input/adminin/role.go b/server/internal/model/input/adminin/role.go index 53f582f..6c6d64a 100644 --- a/server/internal/model/input/adminin/role.go +++ b/server/internal/model/input/adminin/role.go @@ -19,6 +19,8 @@ type RoleListInp struct { type RoleListModel struct { entity.AdminRole + Label string `json:"label" dc:"标签"` + Value int64 `json:"value" dc:"键值"` } // RoleMemberListInp 查询列表 diff --git a/server/internal/model/input/form/base.go b/server/internal/model/input/form/base.go index e4cb0b7..fa48293 100644 --- a/server/internal/model/input/form/base.go +++ b/server/internal/model/input/form/base.go @@ -115,3 +115,14 @@ type SelectInt64 struct { Label string `json:"label"` Name string `json:"name"` } + +// DefaultMaxSort 默认最大排序 +func DefaultMaxSort(ctx context.Context, baseSort int) int { + return baseSort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement", 10).Int() +} + +// AvatarGroup 头像组 +type AvatarGroup struct { + Name string `json:"name" dc:"姓名"` + Src string `json:"src" dc:"头像地址"` +} diff --git a/server/internal/model/input/sysin/curd_demo.go b/server/internal/model/input/sysin/curd_demo.go index 18a9c33..2c88741 100644 --- a/server/internal/model/input/sysin/curd_demo.go +++ b/server/internal/model/input/sysin/curd_demo.go @@ -3,8 +3,8 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.1.0 -// @AutoGenerate Date 2023-01-18 15:19:42 +// @AutoGenerate Version 2.1.2 +// @AutoGenerate Date 2023-02-08 17:47:32 // package sysin @@ -32,6 +32,10 @@ type CurdDemoDeleteInp struct { Id interface{} `json:"id" v:"required#ID不能为空" dc:"ID"` } +func (in *CurdDemoDeleteInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoDeleteModel struct{} // CurdDemoViewInp 获取指定生成演示信息 @@ -39,6 +43,10 @@ type CurdDemoViewInp struct { Id int64 `json:"id" v:"required#ID不能为空" dc:"ID"` } +func (in *CurdDemoViewInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoViewModel struct { entity.Test } @@ -52,6 +60,10 @@ type CurdDemoListInp struct { TestCategoryName string `json:"testCategoryName" dc:"分类名称"` } +func (in *CurdDemoListInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoListModel struct { Id int64 `json:"id" dc:"ID"` CategoryId int64 `json:"categoryId" dc:"分类ID"` @@ -63,13 +75,10 @@ type CurdDemoListModel struct { Sort int `json:"sort" dc:"排序"` Status int `json:"status" dc:"状态"` CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"修改时间"` TestCategoryName string `json:"testCategoryName" dc:"分类名称"` } -func (in *CurdDemoListInp) Filter(ctx context.Context) (err error) { - return -} - // CurdDemoExportModel 导出生成演示 type CurdDemoExportModel struct { Id int64 `json:"id" dc:"ID"` @@ -81,13 +90,20 @@ type CurdDemoExportModel struct { Switch int `json:"switch" dc:"显示开关"` Sort int `json:"sort" dc:"排序"` Status int `json:"status" dc:"状态"` + CreatedBy int64 `json:"createdBy" dc:"创建者"` + UpdatedBy int64 `json:"updatedBy" dc:"更新者"` CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"修改时间"` TestCategoryName string `json:"testCategoryName" dc:"分类名称"` } // CurdDemoMaxSortInp 获取生成演示最大排序 type CurdDemoMaxSortInp struct{} +func (in *CurdDemoMaxSortInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoMaxSortModel struct { Sort int `json:"sort" description:"排序"` } @@ -98,6 +114,10 @@ type CurdDemoStatusInp struct { Status int `json:"status" dc:"状态"` } +func (in *CurdDemoStatusInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoStatusModel struct{} // CurdDemoSwitchInp 更新生成演示开关状态 @@ -106,4 +126,8 @@ type CurdDemoSwitchInp struct { Id int64 `json:"id" v:"required#ID不能为空" dc:"ID"` } +func (in *CurdDemoSwitchInp) Filter(ctx context.Context) (err error) { + return +} + type CurdDemoSwitchModel struct{} diff --git a/server/internal/model/input/sysin/ems_log.go b/server/internal/model/input/sysin/ems_log.go new file mode 100644 index 0000000..b127a8a --- /dev/null +++ b/server/internal/model/input/sysin/ems_log.go @@ -0,0 +1,70 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2022 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// +package sysin + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" +) + +// EmsLogEditInp 修改/新增数据 +type EmsLogEditInp struct { + entity.SysEmsLog +} +type EmsLogEditModel struct{} + +// EmsLogDeleteInp 删除 +type EmsLogDeleteInp struct { + Id interface{} `json:"id" v:"required#邮件记录ID不能为空" dc:"邮件记录ID"` +} +type EmsLogDeleteModel struct{} + +// EmsLogViewInp 获取信息 +type EmsLogViewInp struct { + Id int64 `json:"id" v:"required#邮件记录ID不能为空" dc:"邮件记录ID"` +} + +type EmsLogViewModel struct { + entity.SysEmsLog +} + +// EmsLogListInp 获取列表 +type EmsLogListInp struct { + form.PageReq + form.RangeDateReq + form.StatusReq + Title string `json:"title"` + Content string `json:"content"` +} + +type EmsLogListModel struct { + entity.SysEmsLog +} + +// EmsLogStatusInp 更新状态 +type EmsLogStatusInp struct { + entity.SysSmsLog +} +type EmsLogStatusModel struct{} + +// SendEmsInp 发送邮件 +type SendEmsInp struct { + Event string `json:"event" v:"required#邮件事件不能为空" description:"事件"` + Email string `json:"email" v:"required#邮箱地址不能为空" description:"邮箱地址"` + Code string `json:"code" description:"验证码或短信内容"` + Content string `json:"content" description:"邮件内容"` + Template string `json:"-" description:"发信模板"` + TplData g.Map `json:"-" description:"模板变量"` +} + +// VerifyEmsCodeInp 效验验证码 +type VerifyEmsCodeInp struct { + Event string `json:"event" v:"required#邮件事件不能为空" description:"事件"` + Email string `json:"email" v:"required#邮箱地址不能为空" description:"邮箱地址"` + Code string `json:"code" description:"验证码"` +} diff --git a/server/internal/model/input/sysin/gen_codes.go b/server/internal/model/input/sysin/gen_codes.go index 873bd2e..58fac9d 100644 --- a/server/internal/model/input/sysin/gen_codes.go +++ b/server/internal/model/input/sysin/gen_codes.go @@ -7,6 +7,7 @@ package sysin import ( + "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/model" "hotgo/internal/model/entity" "hotgo/internal/model/input/form" @@ -67,11 +68,11 @@ type GenCodesStatusModel struct{} type GenCodesSelectsInp struct { } type GenCodesSelectsModel struct { - GenType form.Selects `json:"genType" dc:"生成类型"` - Db form.Selects `json:"db" dc:"数据库选项"` - Status form.Selects `json:"status" dc:"生成状态"` - LinkMode form.Selects `json:"linkMode" dc:"关联表方式"` - BuildMeth form.Selects `json:"buildMeth" dc:"生成方式"` + GenType GenTypeSelects `json:"genType" dc:"生成类型"` + Db form.Selects `json:"db" dc:"数据库选项"` + Status form.Selects `json:"status" dc:"生成状态"` + LinkMode form.Selects `json:"linkMode" dc:"关联表方式"` + BuildMeth form.Selects `json:"buildMeth" dc:"生成方式"` // 字段表格选项 FormMode form.Selects `json:"formMode" dc:"表单组件"` FormRole form.Selects `json:"formRole" dc:"表单验证"` @@ -79,6 +80,25 @@ type GenCodesSelectsModel struct { WhereMode form.Selects `json:"whereMode" dc:"查询条件"` } +type GenTypeSelects []*GenTypeSelect + +type GenTypeSelect struct { + Value int `json:"value"` + Label string `json:"label"` + Name string `json:"name"` + Templates form.Selects `json:"templates"` +} + +func (p GenTypeSelects) Len() int { + return len(p) +} +func (p GenTypeSelects) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p GenTypeSelects) Less(i, j int) bool { + return gconv.Int64(p[j].Value) > gconv.Int64(p[i].Value) +} + // GenCodesTableSelectInp 数据库表选项 type GenCodesTableSelectInp struct { Name string `json:"name" dc:"数据库配置名称"` diff --git a/server/internal/model/input/sysin/log.go b/server/internal/model/input/sysin/log.go index 615f640..4a85101 100644 --- a/server/internal/model/input/sysin/log.go +++ b/server/internal/model/input/sysin/log.go @@ -30,7 +30,7 @@ type LogListInp struct { type LogListModel struct { entity.SysLog - MemberName string `json:"member_name"` + MemberName string `json:"memberName"` Region string `json:"region"` } @@ -41,6 +41,7 @@ type LogViewInp struct { type LogViewModel struct { entity.SysLog + CityLabel string `json:"cityLabel" description:"城市标签"` } // LogDeleteInp 删除 diff --git a/server/internal/model/input/sysin/login_log.go b/server/internal/model/input/sysin/login_log.go index 9f48e88..37dcb1e 100644 --- a/server/internal/model/input/sysin/login_log.go +++ b/server/internal/model/input/sysin/login_log.go @@ -49,15 +49,15 @@ type LoginLogListModel struct { Status int `json:"status" dc:"状态"` CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` UpdatedAt *gtime.Time `json:"updatedAt" dc:"修改时间"` - SysLogId int64 `json:"sysLogId" dc:"日志ID"` + SysLogId int64 `json:"sysLogId" dc:"日志ID"` SysLogIp string `json:"sysLogIp" dc:"IP地址"` SysLogProvinceId int64 `json:"sysLogProvinceId" dc:"省编码"` SysLogCityId int64 `json:"sysLogCityId" dc:"市编码"` SysLogErrorCode int `json:"sysLogErrorCode" dc:"报错code"` SysLogUserAgent string `json:"sysLogUserAgent" dc:"UA信息"` - Region string `json:"region" dc:"地区"` - Os string `json:"os" dc:"系统信息"` - Browser string `json:"browser" dc:"浏览器信息"` + CityLabel string `json:"cityLabel" dc:"城市标签"` + Os string `json:"os" dc:"系统信息"` + Browser string `json:"browser" dc:"浏览器信息"` } func (in *LoginLogListInp) Filter(ctx context.Context) (err error) { diff --git a/server/internal/model/input/sysin/provinces.go b/server/internal/model/input/sysin/provinces.go index 9eafc81..3eac931 100644 --- a/server/internal/model/input/sysin/provinces.go +++ b/server/internal/model/input/sysin/provinces.go @@ -81,3 +81,27 @@ type ProvincesUniqueIdInp struct { type ProvincesUniqueIdModel struct { IsUnique bool `json:"unique" dc:"是否唯一"` } + +type ProvincesSelectInp struct { + DataType string `json:"dataType" v:"required#数据类型不能为空" dc:"数据类型"` + Value int64 `json:"value" dc:"上级ID"` +} + +type ProvincesSelectModel struct { + List []*ProvincesSelectData `json:"list" dc:"数据列表"` +} + +type ProvincesSelectData struct { + Label string `json:"label" description:"地区名称"` + Value int64 `json:"value" description:"地区ID"` + Level int `json:"level" description:"地区等级"` + IsLeaf bool `json:"isLeaf" description:"是否还有下一级"` +} + +// ProvincesCityLabelInp 获取指定城市标签 +type ProvincesCityLabelInp struct { + Id int64 `json:"oldId" dc:"城市ID"` + Spilt string `json:"spilt" dc:"分隔符"` +} + +type ProvincesCityLabelModel string diff --git a/server/internal/router/admin.go b/server/internal/router/admin.go index 904bedf..885b41e 100644 --- a/server/internal/router/admin.go +++ b/server/internal/router/admin.go @@ -40,7 +40,6 @@ func Admin(ctx context.Context, group *ghttp.RouterGroup) { sys.Cron, // 定时任务 sys.CronGroup, // 定时任务分组 sys.Blacklist, // 黑名单 - sys.GenCodes, // 生成代码 sys.Log, // 访问日志 sys.LoginLog, // 登录日志 sys.ServeLog, // 服务日志 @@ -54,6 +53,9 @@ func Admin(ctx context.Context, group *ghttp.RouterGroup) { admin.Post, // 岗位 admin.Test, // 测试 ) + + group.Middleware(service.Middleware().Develop) + group.Bind(sys.GenCodes) // 生成代码 }) // 注册生成路由 diff --git a/server/internal/router/genrouter/curd_demo.go b/server/internal/router/genrouter/curd_demo.go index 882ca54..70e5965 100644 --- a/server/internal/router/genrouter/curd_demo.go +++ b/server/internal/router/genrouter/curd_demo.go @@ -3,8 +3,8 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.1.0 -// @AutoGenerate Date 2023-01-18 15:19:42 +// @AutoGenerate Version 2.1.2 +// @AutoGenerate Date 2023-02-08 17:47:32 // package genrouter diff --git a/server/internal/service/admin.go b/server/internal/service/admin.go index d6958ff..f223c32 100644 --- a/server/internal/service/admin.go +++ b/server/internal/service/admin.go @@ -7,9 +7,9 @@ package service import ( "context" - "hotgo/api/backend/member" "hotgo/api/backend/menu" "hotgo/api/backend/role" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model/input/adminin" "hotgo/internal/model/input/form" @@ -18,6 +18,10 @@ import ( ) type ( + IAdminMemberPost interface { + UpdatePostIds(ctx context.Context, member_id int64, post_ids []int64) (err error) + GetMemberByIds(ctx context.Context, member_id int64) (post_ids []int64, err error) + } IAdminMenu interface { RoleList(ctx context.Context, in adminin.MenuRoleListInp) (*adminin.MenuRoleListModel, error) SearchList(ctx context.Context, req *menu.SearchListReq) (*menu.SearchListRes, error) @@ -29,15 +33,21 @@ type ( View(ctx context.Context, req *menu.ViewReq) (res *menu.ViewRes, err error) List(ctx context.Context, req *menu.ListReq) (lists []map[string]interface{}, err error) GetMenuList(ctx context.Context, memberId int64) (lists role.DynamicRes, err error) - LoginPermissions(ctx context.Context, memberId int64) (lists []*adminin.MemberLoginPermissions, err error) + LoginPermissions(ctx context.Context, memberId int64) (lists adminin.MemberLoginPermissions, err error) } IAdminNotice interface { + Model(ctx context.Context, option ...*handler.Option) *gdb.Model Delete(ctx context.Context, in adminin.NoticeDeleteInp) error Edit(ctx context.Context, in adminin.NoticeEditInp) (err error) Status(ctx context.Context, in adminin.NoticeStatusInp) (err error) MaxSort(ctx context.Context, in adminin.NoticeMaxSortInp) (*adminin.NoticeMaxSortModel, error) View(ctx context.Context, in adminin.NoticeViewInp) (res *adminin.NoticeViewModel, err error) List(ctx context.Context, in adminin.NoticeListInp) (list []*adminin.NoticeListModel, totalCount int, err error) + PullMessages(ctx context.Context, in adminin.PullMessagesInp) (res *adminin.PullMessagesModel, err error) + UnreadCount(ctx context.Context, in adminin.NoticeUnreadCountInp) (res *adminin.NoticeUnreadCountModel, err error) + UpRead(ctx context.Context, in adminin.NoticeUpReadInp) (err error) + ReadAll(ctx context.Context, in adminin.NoticeReadAllInp) (err error) + MessageList(ctx context.Context, in adminin.NoticeMessageListInp) (list []*adminin.NoticeMessageListModel, totalCount int, err error) } IAdminPost interface { Delete(ctx context.Context, in adminin.PostDeleteInp) error @@ -63,7 +73,7 @@ type ( DataScopeEdit(ctx context.Context, in *adminin.DataScopeEditInp) (err error) } IAdminTest interface { - Model(ctx context.Context) *gdb.Model + Model(ctx context.Context, option ...*handler.Option) *gdb.Model List(ctx context.Context, in adminin.TestListInp) (list []*adminin.TestListModel, totalCount int, err error) Export(ctx context.Context, in adminin.TestListInp) (err error) Edit(ctx context.Context, in adminin.TestEditInp) (err error) @@ -75,7 +85,7 @@ type ( } IAdminDept interface { NameUnique(ctx context.Context, in adminin.DeptNameUniqueInp) (*adminin.DeptNameUniqueModel, error) - Delete(ctx context.Context, in adminin.DeptDeleteInp) error + Delete(ctx context.Context, in adminin.DeptDeleteInp) (err error) Edit(ctx context.Context, in adminin.DeptEditInp) (err error) Status(ctx context.Context, in adminin.DeptStatusInp) (err error) MaxSort(ctx context.Context, in adminin.DeptMaxSortInp) (*adminin.DeptMaxSortModel, error) @@ -85,6 +95,9 @@ type ( GetName(ctx context.Context, id int64) (name string, err error) } IAdminMember interface { + UpdateCash(ctx context.Context, in adminin.MemberUpdateCashInp) (err error) + UpdateEmail(ctx context.Context, in adminin.MemberUpdateEmailInp) (err error) + UpdateMobile(ctx context.Context, in adminin.MemberUpdateMobileInp) (err error) UpdateProfile(ctx context.Context, in adminin.MemberUpdateProfileInp) (err error) UpdatePwd(ctx context.Context, in adminin.MemberUpdatePwdInp) (err error) ResetPwd(ctx context.Context, in adminin.MemberResetPwdInp) (err error) @@ -97,20 +110,18 @@ type ( MaxSort(ctx context.Context, in adminin.MemberMaxSortInp) (*adminin.MemberMaxSortModel, error) View(ctx context.Context, in adminin.MemberViewInp) (res *adminin.MemberViewModel, err error) List(ctx context.Context, in adminin.MemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) - LoginMemberInfo(ctx context.Context, req *member.InfoReq) (res *adminin.MemberLoginModel, err error) + LoginMemberInfo(ctx context.Context) (res *adminin.LoginMemberInfoModel, err error) Login(ctx context.Context, in adminin.MemberLoginInp) (res *adminin.MemberLoginModel, err error) RoleMemberList(ctx context.Context, in adminin.RoleMemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) Status(ctx context.Context, in adminin.MemberStatusInp) (err error) GetIdByCode(ctx context.Context, in adminin.GetIdByCodeInp) (res *adminin.GetIdByCodeModel, err error) - } - IAdminMemberPost interface { - UpdatePostIds(ctx context.Context, member_id int64, post_ids []int64) (err error) - GetMemberByIds(ctx context.Context, member_id int64) (post_ids []int64, err error) + Select(ctx context.Context, in adminin.MemberSelectInp) (res []*adminin.MemberSelectModel, err error) + FilterAuthModel(ctx context.Context, memberId int64) *gdb.Model + MemberLoginStat(ctx context.Context, in adminin.MemberLoginStatInp) (res *adminin.MemberLoginStatModel, err error) } ) var ( - localAdminMemberPost IAdminMemberPost localAdminMenu IAdminMenu localAdminNotice IAdminNotice localAdminPost IAdminPost @@ -118,8 +129,20 @@ var ( localAdminTest IAdminTest localAdminDept IAdminDept localAdminMember IAdminMember + localAdminMemberPost IAdminMemberPost ) +func AdminMemberPost() IAdminMemberPost { + if localAdminMemberPost == nil { + panic("implement not found for interface IAdminMemberPost, forgot register?") + } + return localAdminMemberPost +} + +func RegisterAdminMemberPost(i IAdminMemberPost) { + localAdminMemberPost = i +} + func AdminMenu() IAdminMenu { if localAdminMenu == nil { panic("implement not found for interface IAdminMenu, forgot register?") @@ -196,14 +219,3 @@ func AdminMember() IAdminMember { func RegisterAdminMember(i IAdminMember) { localAdminMember = i } - -func AdminMemberPost() IAdminMemberPost { - if localAdminMemberPost == nil { - panic("implement not found for interface IAdminMemberPost, forgot register?") - } - return localAdminMemberPost -} - -func RegisterAdminMemberPost(i IAdminMemberPost) { - localAdminMemberPost = i -} diff --git a/server/internal/service/hook.go b/server/internal/service/hook.go index 0dd87ac..3e6d1b6 100644 --- a/server/internal/service/hook.go +++ b/server/internal/service/hook.go @@ -11,7 +11,8 @@ import ( type ( IHook interface { - GlobalLog(r *ghttp.Request) + AccessLog(r *ghttp.Request) + LastActive(r *ghttp.Request) } ) diff --git a/server/internal/service/middleware.go b/server/internal/service/middleware.go index bfb4348..92352ea 100644 --- a/server/internal/service/middleware.go +++ b/server/internal/service/middleware.go @@ -17,6 +17,7 @@ type ( CORS(r *ghttp.Request) DemoLimit(r *ghttp.Request) Blacklist(r *ghttp.Request) + Develop(r *ghttp.Request) ResponseHandler(r *ghttp.Request) WebSocketToken(r *ghttp.Request) } diff --git a/server/internal/service/sys.go b/server/internal/service/sys.go index 44d89e5..2d2f568 100644 --- a/server/internal/service/sys.go +++ b/server/internal/service/sys.go @@ -7,6 +7,7 @@ package service import ( "context" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model" "hotgo/internal/model/entity" "hotgo/internal/model/input/sysin" @@ -16,14 +17,78 @@ import ( ) type ( - ISysAttachment interface { - Delete(ctx context.Context, in sysin.AttachmentDeleteInp) error - Edit(ctx context.Context, in sysin.AttachmentEditInp) (err error) - Status(ctx context.Context, in sysin.AttachmentStatusInp) (err error) - MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (*sysin.AttachmentMaxSortModel, error) - View(ctx context.Context, in sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error) - List(ctx context.Context, in sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) - Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (data *entity.SysAttachment, err error) + ISysSmsLog interface { + Delete(ctx context.Context, in sysin.SmsLogDeleteInp) error + Edit(ctx context.Context, in sysin.SmsLogEditInp) (err error) + Status(ctx context.Context, in sysin.SmsLogStatusInp) (err error) + MaxSort(ctx context.Context, in sysin.SmsLogMaxSortInp) (*sysin.SmsLogMaxSortModel, error) + View(ctx context.Context, in sysin.SmsLogViewInp) (res *sysin.SmsLogViewModel, err error) + List(ctx context.Context, in sysin.SmsLogListInp) (list []*sysin.SmsLogListModel, totalCount int, err error) + SendCode(ctx context.Context, in sysin.SendCodeInp) (err error) + GetTemplate(ctx context.Context, template string, config *model.SmsConfig) (val string, err error) + AllowSend(ctx context.Context, models *entity.SysSmsLog, config *model.SmsConfig) (err error) + VerifyCode(ctx context.Context, in sysin.VerifyCodeInp) (err error) + } + ISysCron interface { + StartCron(ctx context.Context) + Delete(ctx context.Context, in sysin.CronDeleteInp) (err error) + Edit(ctx context.Context, in sysin.CronEditInp) (err error) + Status(ctx context.Context, in sysin.CronStatusInp) (err error) + MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (res *sysin.CronMaxSortModel, err error) + View(ctx context.Context, in sysin.CronViewInp) (res *sysin.CronViewModel, err error) + List(ctx context.Context, in sysin.CronListInp) (list []*sysin.CronListModel, totalCount int, err error) + OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err error) + } + ISysEmsLog interface { + Delete(ctx context.Context, in sysin.EmsLogDeleteInp) error + Edit(ctx context.Context, in sysin.EmsLogEditInp) (err error) + Status(ctx context.Context, in sysin.EmsLogStatusInp) (err error) + View(ctx context.Context, in sysin.EmsLogViewInp) (res *sysin.EmsLogViewModel, err error) + List(ctx context.Context, in sysin.EmsLogListInp) (list []*sysin.EmsLogListModel, totalCount int, err error) + Send(ctx context.Context, in sysin.SendEmsInp) (err error) + GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) + AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) + VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp) (err error) + } + ISysLog interface { + Export(ctx context.Context, in sysin.LogListInp) (err error) + RealWrite(ctx context.Context, commonLog entity.SysLog) (err error) + AutoLog(ctx context.Context) (err error) + AnalysisLog(ctx context.Context) entity.SysLog + View(ctx context.Context, in sysin.LogViewInp) (res *sysin.LogViewModel, err error) + Delete(ctx context.Context, in sysin.LogDeleteInp) error + List(ctx context.Context, in sysin.LogListInp) (list []*sysin.LogListModel, totalCount int, err error) + } + ISysDictData interface { + Delete(ctx context.Context, in sysin.DictDataDeleteInp) error + Edit(ctx context.Context, in sysin.DictDataEditInp) (err error) + List(ctx context.Context, in sysin.DictDataListInp) (list []*sysin.DictDataListModel, totalCount int, err error) + Select(ctx context.Context, in sysin.DataSelectInp) (list sysin.DataSelectModel, err error) + } + ISysDictType interface { + Tree(ctx context.Context) (list []g.Map, err error) + Delete(ctx context.Context, in sysin.DictTypeDeleteInp) error + Edit(ctx context.Context, in sysin.DictTypeEditInp) (err error) + Select(ctx context.Context, in sysin.DictTypeSelectInp) (list sysin.DictTypeSelectModel, err error) + TreeSelect(ctx context.Context, in sysin.DictTreeSelectInp) (list sysin.DictTreeSelectModel, err error) + } + ISysServeLog interface { + Model(ctx context.Context) *gdb.Model + List(ctx context.Context, in sysin.ServeLogListInp) (list []*sysin.ServeLogListModel, totalCount int, err error) + Export(ctx context.Context, in sysin.ServeLogListInp) (err error) + Delete(ctx context.Context, in sysin.ServeLogDeleteInp) (err error) + View(ctx context.Context, in sysin.ServeLogViewInp) (res *sysin.ServeLogViewModel, err error) + RealWrite(ctx context.Context, models entity.SysServeLog) (err error) + } + ISysBlacklist interface { + Delete(ctx context.Context, in sysin.BlacklistDeleteInp) (err error) + Edit(ctx context.Context, in sysin.BlacklistEditInp) (err error) + Status(ctx context.Context, in sysin.BlacklistStatusInp) (err error) + MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (*sysin.BlacklistMaxSortModel, error) + View(ctx context.Context, in sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error) + List(ctx context.Context, in sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error) + VariableLoad(ctx context.Context, err error) + Load(ctx context.Context) } ISysLoginLog interface { Model(ctx context.Context) *gdb.Model @@ -44,16 +109,41 @@ type ( List(ctx context.Context, in sysin.ProvincesListInp) (list []*sysin.ProvincesListModel, totalCount int, err error) ChildrenList(ctx context.Context, in sysin.ProvincesChildrenListInp) (list []*sysin.ProvincesChildrenListModel, totalCount int, err error) UniqueId(ctx context.Context, in sysin.ProvincesUniqueIdInp) (res *sysin.ProvincesUniqueIdModel, err error) + Select(ctx context.Context, in sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error) } - ISysBlacklist interface { - Delete(ctx context.Context, in sysin.BlacklistDeleteInp) (err error) - Edit(ctx context.Context, in sysin.BlacklistEditInp) (err error) - Status(ctx context.Context, in sysin.BlacklistStatusInp) (err error) - MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (*sysin.BlacklistMaxSortModel, error) - View(ctx context.Context, in sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error) - List(ctx context.Context, in sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error) - VariableLoad(ctx context.Context, err error) - Load(ctx context.Context) + ISysCurdDemo interface { + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) + Export(ctx context.Context, in sysin.CurdDemoListInp) (err error) + Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err error) + Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error) + MaxSort(ctx context.Context, in sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) + View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) + Status(ctx context.Context, in sysin.CurdDemoStatusInp) (err error) + Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) (err error) + } + ISysGenCodes interface { + Delete(ctx context.Context, in sysin.GenCodesDeleteInp) error + Edit(ctx context.Context, in sysin.GenCodesEditInp) (res *sysin.GenCodesEditModel, err error) + Status(ctx context.Context, in sysin.GenCodesStatusInp) (err error) + MaxSort(ctx context.Context, in sysin.GenCodesMaxSortInp) (*sysin.GenCodesMaxSortModel, error) + View(ctx context.Context, in sysin.GenCodesViewInp) (res *sysin.GenCodesViewModel, err error) + List(ctx context.Context, in sysin.GenCodesListInp) (list []*sysin.GenCodesListModel, totalCount int, err error) + Selects(ctx context.Context, in sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) + TableSelect(ctx context.Context, in sysin.GenCodesTableSelectInp) (res []*sysin.GenCodesTableSelectModel, err error) + ColumnSelect(ctx context.Context, in sysin.GenCodesColumnSelectInp) (res []*sysin.GenCodesColumnSelectModel, err error) + ColumnList(ctx context.Context, in sysin.GenCodesColumnListInp) (res []*sysin.GenCodesColumnListModel, err error) + Preview(ctx context.Context, in sysin.GenCodesPreviewInp) (res *sysin.GenCodesPreviewModel, err error) + Build(ctx context.Context, in sysin.GenCodesBuildInp) (err error) + } + ISysAttachment interface { + Delete(ctx context.Context, in sysin.AttachmentDeleteInp) error + Edit(ctx context.Context, in sysin.AttachmentEditInp) (err error) + Status(ctx context.Context, in sysin.AttachmentStatusInp) (err error) + MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (*sysin.AttachmentMaxSortModel, error) + View(ctx context.Context, in sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error) + List(ctx context.Context, in sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) + Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (data *entity.SysAttachment, err error) } ISysConfig interface { GetLoadGenerate(ctx context.Context) (conf *model.GenerateConfig, err error) @@ -61,6 +151,7 @@ type ( GetGeo(ctx context.Context) (conf *model.GeoConfig, err error) GetUpload(ctx context.Context) (conf *model.UploadConfig, err error) GetSmtp(ctx context.Context) (conf *model.EmailConfig, err error) + GetBasic(ctx context.Context) (conf *model.BasicConfig, err error) GetLoadSSL(ctx context.Context) (conf *model.SSLConfig, err error) GetLoadLog(ctx context.Context) (conf *model.LogConfig, err error) GetLoadServeLog(ctx context.Context) (conf *model.ServeLogConfig, err error) @@ -77,102 +168,37 @@ type ( List(ctx context.Context, in sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error) Select(ctx context.Context, in sysin.CronGroupSelectInp) (list sysin.CronGroupSelectModel, err error) } - ISysCurdDemo interface { - Model(ctx context.Context) *gdb.Model - List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) - Export(ctx context.Context, in sysin.CurdDemoListInp) (err error) - Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err error) - Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error) - MaxSort(ctx context.Context, in sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) - View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) - Status(ctx context.Context, in sysin.CurdDemoStatusInp) (err error) - Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) (err error) - } - ISysDictData interface { - Delete(ctx context.Context, in sysin.DictDataDeleteInp) error - Edit(ctx context.Context, in sysin.DictDataEditInp) (err error) - List(ctx context.Context, in sysin.DictDataListInp) (list []*sysin.DictDataListModel, totalCount int, err error) - Select(ctx context.Context, in sysin.DataSelectInp) (list sysin.DataSelectModel, err error) - } - ISysLog interface { - Export(ctx context.Context, in sysin.LogListInp) (err error) - RealWrite(ctx context.Context, commonLog entity.SysLog) (err error) - AutoLog(ctx context.Context) (err error) - AnalysisLog(ctx context.Context) entity.SysLog - View(ctx context.Context, in sysin.LogViewInp) (res *sysin.LogViewModel, err error) - Delete(ctx context.Context, in sysin.LogDeleteInp) error - List(ctx context.Context, in sysin.LogListInp) (list []*sysin.LogListModel, totalCount int, err error) - } - ISysServeLog interface { - Model(ctx context.Context) *gdb.Model - List(ctx context.Context, in sysin.ServeLogListInp) (list []*sysin.ServeLogListModel, totalCount int, err error) - Export(ctx context.Context, in sysin.ServeLogListInp) (err error) - Delete(ctx context.Context, in sysin.ServeLogDeleteInp) (err error) - View(ctx context.Context, in sysin.ServeLogViewInp) (res *sysin.ServeLogViewModel, err error) - RealWrite(ctx context.Context, models entity.SysServeLog) (err error) - } - ISysSmsLog interface { - Delete(ctx context.Context, in sysin.SmsLogDeleteInp) error - Edit(ctx context.Context, in sysin.SmsLogEditInp) (err error) - Status(ctx context.Context, in sysin.SmsLogStatusInp) (err error) - MaxSort(ctx context.Context, in sysin.SmsLogMaxSortInp) (*sysin.SmsLogMaxSortModel, error) - View(ctx context.Context, in sysin.SmsLogViewInp) (res *sysin.SmsLogViewModel, err error) - List(ctx context.Context, in sysin.SmsLogListInp) (list []*sysin.SmsLogListModel, totalCount int, err error) - SendCode(ctx context.Context, in sysin.SendCodeInp) (err error) - GetTemplate(ctx context.Context, template string, config *model.SmsConfig) (val string, err error) - AllowSend(ctx context.Context, models *entity.SysSmsLog, config *model.SmsConfig) (err error) - VerifyCode(ctx context.Context, in sysin.VerifyCodeInp) (err error) - } - ISysCron interface { - StartCron(ctx context.Context) - Delete(ctx context.Context, in sysin.CronDeleteInp) error - Edit(ctx context.Context, in sysin.CronEditInp) (err error) - Status(ctx context.Context, in sysin.CronStatusInp) (err error) - MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (*sysin.CronMaxSortModel, error) - View(ctx context.Context, in sysin.CronViewInp) (res *sysin.CronViewModel, err error) - List(ctx context.Context, in sysin.CronListInp) (list []*sysin.CronListModel, totalCount int, err error) - OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err error) - } - ISysDictType interface { - Tree(ctx context.Context) (list []g.Map, err error) - Delete(ctx context.Context, in sysin.DictTypeDeleteInp) error - Edit(ctx context.Context, in sysin.DictTypeEditInp) (err error) - Select(ctx context.Context, in sysin.DictTypeSelectInp) (list sysin.DictTypeSelectModel, err error) - TreeSelect(ctx context.Context, in sysin.DictTreeSelectInp) (list sysin.DictTreeSelectModel, err error) - } - ISysGenCodes interface { - Delete(ctx context.Context, in sysin.GenCodesDeleteInp) error - Edit(ctx context.Context, in sysin.GenCodesEditInp) (res *sysin.GenCodesEditModel, err error) - Status(ctx context.Context, in sysin.GenCodesStatusInp) (err error) - MaxSort(ctx context.Context, in sysin.GenCodesMaxSortInp) (*sysin.GenCodesMaxSortModel, error) - View(ctx context.Context, in sysin.GenCodesViewInp) (res *sysin.GenCodesViewModel, err error) - List(ctx context.Context, in sysin.GenCodesListInp) (list []*sysin.GenCodesListModel, totalCount int, err error) - Selects(ctx context.Context, in sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) - TableSelect(ctx context.Context, in sysin.GenCodesTableSelectInp) (res []*sysin.GenCodesTableSelectModel, err error) - ColumnSelect(ctx context.Context, in sysin.GenCodesColumnSelectInp) (res []*sysin.GenCodesColumnSelectModel, err error) - ColumnList(ctx context.Context, in sysin.GenCodesColumnListInp) (res []*sysin.GenCodesColumnListModel, err error) - Preview(ctx context.Context, in sysin.GenCodesPreviewInp) (res *sysin.GenCodesPreviewModel, err error) - Build(ctx context.Context, in sysin.GenCodesBuildInp) (err error) - } ) var ( - localSysCronGroup ISysCronGroup - localSysBlacklist ISysBlacklist - localSysConfig ISysConfig - localSysCurdDemo ISysCurdDemo - localSysDictData ISysDictData - localSysGenCodes ISysGenCodes - localSysLog ISysLog - localSysServeLog ISysServeLog - localSysSmsLog ISysSmsLog - localSysCron ISysCron - localSysDictType ISysDictType - localSysProvinces ISysProvinces localSysAttachment ISysAttachment + localSysConfig ISysConfig + localSysCronGroup ISysCronGroup + localSysCurdDemo ISysCurdDemo + localSysGenCodes ISysGenCodes + localSysCron ISysCron + localSysEmsLog ISysEmsLog + localSysLog ISysLog + localSysSmsLog ISysSmsLog + localSysDictData ISysDictData + localSysDictType ISysDictType + localSysServeLog ISysServeLog + localSysBlacklist ISysBlacklist localSysLoginLog ISysLoginLog + localSysProvinces ISysProvinces ) +func SysDictData() ISysDictData { + if localSysDictData == nil { + panic("implement not found for interface ISysDictData, forgot register?") + } + return localSysDictData +} + +func RegisterSysDictData(i ISysDictData) { + localSysDictData = i +} + func SysDictType() ISysDictType { if localSysDictType == nil { panic("implement not found for interface ISysDictType, forgot register?") @@ -184,28 +210,6 @@ func RegisterSysDictType(i ISysDictType) { localSysDictType = i } -func SysGenCodes() ISysGenCodes { - if localSysGenCodes == nil { - panic("implement not found for interface ISysGenCodes, forgot register?") - } - return localSysGenCodes -} - -func RegisterSysGenCodes(i ISysGenCodes) { - localSysGenCodes = i -} - -func SysLog() ISysLog { - if localSysLog == nil { - panic("implement not found for interface ISysLog, forgot register?") - } - return localSysLog -} - -func RegisterSysLog(i ISysLog) { - localSysLog = i -} - func SysServeLog() ISysServeLog { if localSysServeLog == nil { panic("implement not found for interface ISysServeLog, forgot register?") @@ -217,26 +221,15 @@ func RegisterSysServeLog(i ISysServeLog) { localSysServeLog = i } -func SysSmsLog() ISysSmsLog { - if localSysSmsLog == nil { - panic("implement not found for interface ISysSmsLog, forgot register?") +func SysBlacklist() ISysBlacklist { + if localSysBlacklist == nil { + panic("implement not found for interface ISysBlacklist, forgot register?") } - return localSysSmsLog + return localSysBlacklist } -func RegisterSysSmsLog(i ISysSmsLog) { - localSysSmsLog = i -} - -func SysCron() ISysCron { - if localSysCron == nil { - panic("implement not found for interface ISysCron, forgot register?") - } - return localSysCron -} - -func RegisterSysCron(i ISysCron) { - localSysCron = i +func RegisterSysBlacklist(i ISysBlacklist) { + localSysBlacklist = i } func SysLoginLog() ISysLoginLog { @@ -261,6 +254,17 @@ func RegisterSysProvinces(i ISysProvinces) { localSysProvinces = i } +func SysGenCodes() ISysGenCodes { + if localSysGenCodes == nil { + panic("implement not found for interface ISysGenCodes, forgot register?") + } + return localSysGenCodes +} + +func RegisterSysGenCodes(i ISysGenCodes) { + localSysGenCodes = i +} + func SysAttachment() ISysAttachment { if localSysAttachment == nil { panic("implement not found for interface ISysAttachment, forgot register?") @@ -294,28 +298,6 @@ func RegisterSysCronGroup(i ISysCronGroup) { localSysCronGroup = i } -func SysBlacklist() ISysBlacklist { - if localSysBlacklist == nil { - panic("implement not found for interface ISysBlacklist, forgot register?") - } - return localSysBlacklist -} - -func RegisterSysBlacklist(i ISysBlacklist) { - localSysBlacklist = i -} - -func SysDictData() ISysDictData { - if localSysDictData == nil { - panic("implement not found for interface ISysDictData, forgot register?") - } - return localSysDictData -} - -func RegisterSysDictData(i ISysDictData) { - localSysDictData = i -} - func SysCurdDemo() ISysCurdDemo { if localSysCurdDemo == nil { panic("implement not found for interface ISysCurdDemo, forgot register?") @@ -326,3 +308,47 @@ func SysCurdDemo() ISysCurdDemo { func RegisterSysCurdDemo(i ISysCurdDemo) { localSysCurdDemo = i } + +func SysCron() ISysCron { + if localSysCron == nil { + panic("implement not found for interface ISysCron, forgot register?") + } + return localSysCron +} + +func RegisterSysCron(i ISysCron) { + localSysCron = i +} + +func SysEmsLog() ISysEmsLog { + if localSysEmsLog == nil { + panic("implement not found for interface ISysEmsLog, forgot register?") + } + return localSysEmsLog +} + +func RegisterSysEmsLog(i ISysEmsLog) { + localSysEmsLog = i +} + +func SysLog() ISysLog { + if localSysLog == nil { + panic("implement not found for interface ISysLog, forgot register?") + } + return localSysLog +} + +func RegisterSysLog(i ISysLog) { + localSysLog = i +} + +func SysSmsLog() ISysSmsLog { + if localSysSmsLog == nil { + panic("implement not found for interface ISysSmsLog, forgot register?") + } + return localSysSmsLog +} + +func RegisterSysSmsLog(i ISysSmsLog) { + localSysSmsLog = i +} diff --git a/server/manifest/config/config.example.yaml b/server/manifest/config/config.example.yaml index c36c71c..9d0f316 100644 --- a/server/manifest/config/config.example.yaml +++ b/server/manifest/config/config.example.yaml @@ -98,9 +98,9 @@ router: "/member/info", # 登录用户信息 "/role/dynamic", # 获取动态路由 "/site/config", # 获取后台配置 - "/notice/pullUnreadList", # 获取未读公告 - "/notice/readAll", # 设置全部已读公告 - "/notice/upRead", # 更新已读公告 + "/notice/pullMessages", # 拉取我的消息 + "/notice/readAll", # 设置全部已读消息 + "/notice/upRead", # 更新已读消息 "/dictData/option", # 数据字典 "/dictData/options", # 多个数据字典 ] diff --git a/server/resource/data/hotgo.sql b/server/resource/data/hotgo.sql index b1dbb7a..d9d9721 100644 --- a/server/resource/data/hotgo.sql +++ b/server/resource/data/hotgo.sql @@ -3,7 +3,7 @@ -- https://www.phpmyadmin.net/ -- -- 主机: localhost:3306 --- 生成日期: 2023-01-25 11:46:29 +-- 生成日期: 2023-02-08 20:28:57 -- 服务器版本: 5.7.38-log -- PHP 版本: 5.6.40 @@ -51,7 +51,7 @@ CREATE TABLE `hg_admin_dept` ( INSERT INTO `hg_admin_dept` (`id`, `pid`, `name`, `code`, `type`, `leader`, `phone`, `email`, `level`, `tree`, `sort`, `status`, `created_at`, `updated_at`) VALUES (100, 0, 'hotgo', 'hotgo', '', 'hotgo', '15303830571', '133814250@qq.com', 1, NULL, 0, 1, '2022-01-04 09:54:52', '2023-01-24 21:10:05'), -(101, 100, '深圳总公司', 'shenzhen', 'company', 'hotgo', '15888888888', 'hotgo@qq.com', 2, 'tr_100 ', 1, 1, '2022-01-04 17:54:52', '2023-01-24 21:17:17'), +(101, 100, '深圳总公司', 'shenzhen', 'company', 'hotgo', '15888888888', 'hotgo@qq.com', 2, 'tr_100 ', 1, 1, '2022-01-04 17:54:52', '2023-02-08 17:54:10'), (102, 100, '长沙分公司', 'chansgha', '', 'hotgo', '15888888888', 'hotgo@qq.com', 2, 'tr_100 ', 2, 1, '2022-01-04 01:54:52', '2023-01-24 21:17:56'), (103, 101, '研发部门', 'science', 'dept', 'hotgo', '15888888888', 'hotgo@qq.com', 3, 'tr_100 tr_101 ', 1, 1, '2022-01-04 17:54:52', '2023-01-24 21:17:38'), (105, 101, '测试部门', 'test', 'dept', 'hotgo', '15888888888', 'hotgo@qq.com', 3, 'tr_100 tr_101 ', 3, 1, '2022-01-04 17:54:52', '2023-01-24 21:17:31'), @@ -76,22 +76,20 @@ CREATE TABLE `hg_admin_member` ( `salt` char(16) NOT NULL COMMENT '密码盐', `auth_key` char(32) NOT NULL DEFAULT '' COMMENT '授权令牌', `password_reset_token` varchar(150) DEFAULT '' COMMENT '密码重置令牌', + `balance` decimal(10,2) UNSIGNED DEFAULT '0.00' COMMENT '余额', `avatar` char(150) DEFAULT '' COMMENT '头像', `sex` tinyint(1) DEFAULT '1' COMMENT '性别', `qq` varchar(20) DEFAULT '' COMMENT 'qq', `email` varchar(60) DEFAULT '' COMMENT '邮箱', `mobile` varchar(20) DEFAULT '' COMMENT '手机号码', `birthday` date DEFAULT NULL COMMENT '生日', - `province_id` bigint(20) DEFAULT '0' COMMENT '省编码', `city_id` bigint(20) DEFAULT '0' COMMENT '城市编码', - `county_id` bigint(20) DEFAULT '0' COMMENT '区域编码', `address` varchar(100) DEFAULT '' COMMENT '联系地址', - `visit_count` smallint(5) UNSIGNED DEFAULT '0' COMMENT '访问次数', - `last_time` int(11) DEFAULT '0' COMMENT '最后一次登录时间', - `last_ip` varchar(64) DEFAULT '' COMMENT '最后一次登录ip', `pid` bigint(20) NOT NULL COMMENT '上级管理员ID', `level` int(11) DEFAULT '1' COMMENT '关系树等级', `tree` varchar(512) NOT NULL COMMENT '关系树', + `cash` json DEFAULT NULL COMMENT '提现配置', + `last_active_at` datetime DEFAULT NULL COMMENT '最后活跃时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `status` tinyint(1) DEFAULT '1' COMMENT '状态', `created_at` datetime DEFAULT NULL COMMENT '创建时间', @@ -102,10 +100,10 @@ CREATE TABLE `hg_admin_member` ( -- 转存表中的数据 `hg_admin_member` -- -INSERT INTO `hg_admin_member` (`id`, `dept_id`, `role_id`, `real_name`, `username`, `password_hash`, `salt`, `auth_key`, `password_reset_token`, `avatar`, `sex`, `qq`, `email`, `mobile`, `birthday`, `province_id`, `city_id`, `county_id`, `address`, `visit_count`, `last_time`, `last_ip`, `pid`, `level`, `tree`, `remark`, `status`, `created_at`, `updated_at`) VALUES -(1, 100, 1, '孟帅', 'admin', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', 'db7fca2361674fa543d400299c1cbe51', '', 'http://alioss.qvnidaye.com//images/2021/03/12/image_1615529198_vMK4kwq2.jpg', 1, '133814250', '133814250@qq.com', '15303830571', '2016-04-16', 370000, 371100, 371102, '大潮街道666号', 414, 1674556635, '127.0.0.1', 0, 1, '', NULL, 1, '2002-02-12 17:59:45', '2023-01-24 18:37:15'), -(3, 100, 2, '测试账号', 'test', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', '2c7db9eca4ed02a718e794ba4c904f56', '', 'http://alioss.qvnidaye.com//images/2021/03/12/image_1615529198_vMK4kwq2.jpg', 1, '', 'c@qq.cc', '15303888888', '2016-04-13', 370000, 371100, 371102, '大潮街道666号', 292, 1673340420, '127.0.0.1', 1, 2, 'tr_1 ', '', 1, '2022-02-11 17:59:45', '2023-01-10 16:47:00'), -(7, 105, 2, '阿萌', 'ameng', '359bc24aab1b4d91ca4e6c02f07d9161', 'slyKlt', 'b86a60ab51b8f2c10de02fb506a6542a', '', '', 1, '', '', '', NULL, 0, 0, 0, '', 6, 1674610520, '127.0.0.1', 1, 2, 'tr_1 ', '', 1, '2023-01-10 16:48:21', '2023-01-25 09:35:20'); +INSERT INTO `hg_admin_member` (`id`, `dept_id`, `role_id`, `real_name`, `username`, `password_hash`, `salt`, `auth_key`, `password_reset_token`, `balance`, `avatar`, `sex`, `qq`, `email`, `mobile`, `birthday`, `city_id`, `address`, `pid`, `level`, `tree`, `cash`, `last_active_at`, `remark`, `status`, `created_at`, `updated_at`) VALUES +(1, 100, 1, '孟帅', 'admin', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', 'f7e66e4bfb42b906b26edbefba915976', '', '0.00', 'http://localhost:8000/attachment/2023-01-18/cpv6fmqmwfq8zobctz.png', 1, '133814250', '133814250@qq.com', '15303830571', '2016-04-16', 140971, '大潮街道666号', 0, 1, '', '{\"name\": \"孟帅\", \"account\": \"15303830571\", \"payeeCode\": \"http://localhost:8000/attachment/2023-01-18/cpv6dx10bq0cejq5an.png\"}', '2023-02-08 20:28:26', NULL, 1, '2021-02-12 17:59:45', '2023-02-08 20:28:25'), +(3, 100, 2, '测试账号', 'test', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', '2c7db9eca4ed02a718e794ba4c904f56', '', '0.00', 'http://alioss.qvnidaye.com//images/2021/03/12/image_1615529198_vMK4kwq2.jpg', 1, '', 'c@qq.cc', '15303888888', '2016-04-13', 371100, '大潮街道666号', 1, 2, 'tr_1 ', NULL, NULL, '', 1, '2022-02-11 17:59:45', '2023-01-10 16:47:00'), +(8, 105, 206, 'ameng', 'ameng', '382df3b083a27886edb94e669a857c33', 'hfuUEb', '936cbef93c8b9e879122604cea5ba5e6', '', '0.00', '', 1, '', '', '', NULL, 0, '', 1, 2, 'tr_1 ', NULL, '2023-02-06 16:44:22', '', 1, '2023-02-03 17:34:31', '2023-02-08 20:26:59'); -- -------------------------------------------------------- @@ -126,7 +124,8 @@ INSERT INTO `hg_admin_member_post` (`member_id`, `post_id`) VALUES (1, 1), (3, 4), (7, 3), -(7, 4); +(7, 4), +(8, 2); -- -------------------------------------------------------- @@ -203,7 +202,7 @@ INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type (2070, 2068, '字典管理', 'system_dict', 'dict', '', 2, '', '', '', '/system/dict/index', 1, '', 0, 0, '', 0, 0, 0, 2, '', 20, '', 1, '2022-09-16 17:33:05', '2022-09-16 17:33:05'), (2071, 2068, '定时任务', 'system_cron', 'cron', '', 2, '', '', '', '/system/cron/index', 1, '', 0, 0, '', 0, 0, 0, 2, '', 30, '', 1, '2022-09-16 17:33:34', '2022-09-16 17:33:34'), (2072, 2068, '黑名单', 'system_blacklist', 'blacklist', '', 2, '', '', '', '/system/blacklist/index', 1, '', 0, 0, '', 0, 0, 0, 2, '', 40, '', 1, '2022-09-16 17:34:01', '2022-09-16 17:34:01'), -(2073, 2068, '个人设置', 'setting_account', 'account', '', 2, '', '', '', '/setting/account/account', 1, '', 0, 0, '', 0, 0, 0, 2, '', 50, '', 1, '2022-09-16 17:34:35', '2022-09-16 17:34:35'), +(2073, 2219, '个人设置', 'home_account', 'account', '', 2, '', '', '', '/home/account/account', 1, '', 0, 0, '', 0, 0, 0, 2, '', 10, '', 1, '2022-09-16 17:34:35', '2023-02-01 15:05:57'), (2074, 0, '日志管理', 'Logs', '/log', 'UnorderedListOutlined', 1, '', '', '', 'LAYOUT', 1, '', 0, 0, '', 0, 0, 0, 1, '', 60, '', 1, '2022-09-16 01:38:32', '2023-01-10 17:19:46'), (2075, 2074, '访问日志', 'log', 'log', '', 1, '/log/log/index', '', '', 'ParentLayout', 0, '', 0, 0, '', 0, 0, 0, 2, '', 10, '', 1, '2022-09-09 17:39:16', '2023-01-20 23:08:41'), (2076, 2074, '登录日志', 'login_log', 'login', '', 1, '/log/login/index', '', '', 'ParentLayout', 0, '', 0, 0, '', 0, 0, 0, 2, '', 20, '', 1, '2022-09-15 20:04:20', '2023-01-20 23:08:43'), @@ -258,7 +257,23 @@ INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type (2207, 2083, '删除登录日志', 'loginLogDelete', '', '', 3, '', '/loginLog/delete', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-19 21:06:45', '2023-01-19 21:06:45'), (2208, 2083, '导出登录日志', 'loginLogExport', '', '', 3, '', '/loginLog/export', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-19 21:06:45', '2023-01-19 21:06:45'), (2209, 2087, '删除服务日志', 'serveLogDelete', '', '', 3, '', '/serveLog/delete', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-20 18:37:50', '2023-01-20 18:37:50'), -(2210, 2087, '导出服务日志', 'serveLogExport', '', '', 3, '', '/serveLog/export', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-20 18:37:50', '2023-01-20 18:37:50'); +(2210, 2087, '导出服务日志', 'serveLogExport', '', '', 3, '', '/serveLog/export', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-20 18:37:50', '2023-01-20 18:37:50'), +(2211, 2094, '获取公告最大排序', 'noticeMaxSort', '', '', 3, '', '/notice/maxSort', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2212, 2094, '删除公告', 'noticeDelete', '', '', 3, '', '/notice/delete', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2213, 2094, '修改公告状态', 'noticeStatus', '', '', 3, '', '/notice/status', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2214, 2094, '操作公告开关', 'noticeSwitch', '', '', 3, '', '/notice/switch', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2215, 2094, '发送/编辑通知', 'noticeEditNotify', '', '', 3, '', '/notice/editNotify', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2216, 2094, '发送/编辑公告', 'noticeEditNotice', '', '', 3, '', '/notice/editNotice', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2217, 2094, '发送/编辑私信', 'noticeEditLetter', '', '', 3, '', '/notice/editLetter', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2218, 2094, '编辑公告', 'noticeEdit', '', '', 3, '', '/notice/edit', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2219, 0, '个人中心', 'home', '/home', 'UserOutlined', 1, '', '', '', 'LAYOUT', 1, '', 0, 2, '', 0, 0, 0, 1, '', 150, '', 1, '2023-02-01 14:59:40', '2023-02-01 15:01:56'), +(2220, 2219, '我的消息', 'home_message', 'message', '', 2, '', '', '', '/home/message/message', 1, '', 0, 2, '', 0, 0, 0, 2, '', 20, '', 1, '2023-02-01 15:05:17', '2023-02-01 15:05:17'), +(2221, 2122, '获取最大排序', 'testMaxSort', '/test/maxSort', '', 3, '', '/test/maxSort', '', '', 1, '', 0, 2, '', 0, 0, 0, 3, '', 10, '', 1, '2023-02-06 14:29:42', '2023-02-06 14:29:42'), +(2222, 2122, '导出测试', 'testExport', '', '', 3, '', '/test/export', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-20 18:37:50', '2023-01-20 18:37:50'), +(2223, 2122, '删除测试', 'testDelete', '', '', 3, '', '/test/delete', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2224, 2122, '修改测试状态', 'testStatus', '', '', 3, '', '/test/status', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2225, 2122, '操作测试开关', 'testSwitch', '', '', 3, '', '/test/switch', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'), +(2226, 2122, '编辑测试', 'testEdit', '', '', 3, '', '/test/edit', '', '', 1, '', 0, 0, '', 0, 0, 0, 3, '', 10, '', 1, '2023-01-18 15:19:43', '2023-01-18 15:19:43'); -- -------------------------------------------------------- @@ -270,26 +285,79 @@ CREATE TABLE `hg_admin_notice` ( `id` bigint(20) NOT NULL COMMENT '公告ID', `title` varchar(64) NOT NULL COMMENT '公告标题', `type` bigint(20) NOT NULL COMMENT '公告类型', + `tag` int(11) DEFAULT NULL COMMENT '标签', `content` longtext NOT NULL COMMENT '公告内容', - `receiver` text COMMENT '接收者', - `reader` text COMMENT '已读人', + `receiver` json DEFAULT NULL COMMENT '接收者', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `status` tinyint(1) DEFAULT '1' COMMENT '公告状态', + `created_by` bigint(20) DEFAULT NULL COMMENT '发送人', + `updated_by` bigint(20) DEFAULT '0' COMMENT '修改人', `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间' + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台_通知公告'; -- -- 转存表中的数据 `hg_admin_notice` -- -INSERT INTO `hg_admin_notice` (`id`, `title`, `type`, `content`, `receiver`, `reader`, `remark`, `sort`, `status`, `created_at`, `updated_at`) VALUES -(1, '温馨提醒:2021-07-01 新版本发布啦', 2, '新版本内容', '', '', '管理员', 1, 1, '2022-01-04 01:54:53', '2022-10-06 11:53:13'), -(2, '维护通知:2021-07-01 系统凌晨维护', 1, '维护内容\n\n进行了如下更新:\n1...\n2...', '', '[123, 456]', '管理员', 5, 1, '2022-01-01 01:54:53', '2022-10-06 11:53:10'), -(6, '测试公告', 2, '这是一条测试公告\n哈哈\n哈哈哈哈!', '1,2,3', '', '测试', 10, 1, '2022-09-25 02:38:59', '2022-10-07 10:03:25'), -(7, '测试', 1, '在下载学习中', '', '', '', 0, 1, '2022-12-30 16:47:22', '2022-12-30 16:47:22'), -(8, '1221', 1, '2121212112', '', '', '', 0, 1, '2023-01-19 18:13:56', '2023-01-19 18:13:56'); +INSERT INTO `hg_admin_notice` (`id`, `title`, `type`, `tag`, `content`, `receiver`, `remark`, `sort`, `status`, `created_by`, `updated_by`, `created_at`, `updated_at`, `deleted_at`) VALUES +(9, '12', 1, 0, '', '[2]', '', 0, 1, 0, 0, '2023-01-26 21:18:49', '2023-01-26 21:26:58', '2023-01-30 16:37:45'), +(10, '测试私信', 3, 3, '

1111

', '[1, 2, 7]', '', 0, 1, 0, 0, '2023-01-26 21:36:59', '2023-01-26 21:45:36', NULL), +(11, '测试公告', 2, 2, '

!测试公告测试公告测试公告测试公告测试公告测试公告!

', '[]', '', 10, 1, 0, 0, '2023-01-26 23:23:39', '2023-01-30 16:35:44', NULL), +(12, '5661', 1, 0, '616', '[]', '651', 516, 1, 0, 0, '2023-01-30 17:37:06', '2023-01-30 17:37:06', NULL), +(13, '公告', 2, 0, '

公告!!!!!!

', '[]', '', 10, 1, 0, 0, '2023-01-30 17:37:19', '2023-01-30 17:37:19', NULL), +(14, '私信', 3, 0, '

私信私信私信私信!

', '[3, 1]', '', 10, 1, 0, 0, '2023-01-30 17:37:34', '2023-01-31 19:35:19', NULL), +(15, '私信2', 3, 0, '

私信私信私信私信!

', '[3, 2]', '', 10, 1, 0, 0, '2023-01-30 17:37:34', '2023-01-31 19:35:19', NULL), +(16, '65', 1, 0, '161', 'null', '', 56, 1, 1, 0, '2023-02-01 11:16:19', '2023-02-01 11:16:19', NULL), +(17, '标签', 1, 0, '64', 'null', '', 61, 1, 1, 0, '2023-02-01 11:20:16', '2023-02-01 11:20:16', NULL), +(18, '1', 1, 0, '2', 'null', '', 526, 1, 1, 0, '2023-02-01 11:21:10', '2023-02-01 11:21:10', NULL), +(19, '11', 1, 0, '22', 'null', '', 536, 1, 1, 0, '2023-02-01 11:21:47', '2023-02-01 11:21:47', NULL), +(20, '564651', 1, 0, '561', 'null', '', 546, 1, 1, 0, '2023-02-01 11:52:42', '2023-02-01 11:52:42', NULL), +(21, '标题', 1, 1, '内容', 'null', '', 556, 1, 1, 0, '2023-02-01 12:31:52', '2023-02-01 12:31:52', NULL), +(22, '111', 1, 3, '222', 'null', '', 566, 1, 1, 0, '2023-02-01 12:33:45', '2023-02-01 12:33:45', NULL), +(23, '标题', 1, 2, '内容!!!!!!!!!!', 'null', '', 576, 1, 1, 0, '2023-02-01 12:35:44', '2023-02-01 12:35:44', NULL), +(24, '测试公告', 2, 0, '

这是一个测试公告

', 'null', '', 586, 1, 1, 0, '2023-02-01 13:53:10', '2023-02-01 13:53:10', NULL), +(25, '这是私信', 3, 3, '

amengamengamengamengamengamengamengamengamengamengameng

', '[1]', '', 596, 1, 1, 0, '2023-02-01 13:57:12', '2023-02-01 13:57:12', NULL), +(26, '私信', 3, 1, '

46xz6xz561615xz61

', '[1, 7]', '', 606, 1, 1, 0, '2023-02-01 14:11:30', '2023-02-01 14:11:30', NULL), +(27, 'xzz66', 3, 2, '

ds5a4s61as

', '[1]', '', 616, 1, 1, 0, '2023-02-01 14:15:10', '2023-02-01 14:15:10', NULL), +(28, '小程序', 3, 0, '

616165

', '[1]', '', 626, 1, 1, 0, '2023-02-01 14:15:59', '2023-02-01 14:15:59', NULL); + +-- -------------------------------------------------------- + +-- +-- 表的结构 `hg_admin_notice_read` +-- + +CREATE TABLE `hg_admin_notice_read` ( + `id` bigint(20) NOT NULL COMMENT '记录ID', + `notice_id` bigint(20) NOT NULL COMMENT '公告ID', + `member_id` bigint(20) NOT NULL COMMENT '会员ID', + `clicks` int(11) DEFAULT '1' COMMENT '已读次数', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `created_at` datetime DEFAULT NULL COMMENT '阅读时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台_公告已读记录'; + +-- +-- 转存表中的数据 `hg_admin_notice_read` +-- + +INSERT INTO `hg_admin_notice_read` (`id`, `notice_id`, `member_id`, `clicks`, `updated_at`, `created_at`) VALUES +(1, 10, 1, 3, '2022-01-24 11:33:16', '2022-01-24 11:33:16'), +(2, 28, 1, 7, '2023-02-04 17:57:08', '2023-02-01 17:11:09'), +(3, 11, 1, 2, '2023-02-01 20:19:18', '2023-02-01 17:21:19'), +(4, 13, 1, 1, '2023-02-01 20:19:17', '2023-02-01 17:21:19'), +(5, 24, 1, 2, '2023-02-01 20:19:20', '2023-02-01 17:21:19'), +(6, 27, 1, 5, '2023-02-02 12:37:44', '2023-02-01 17:21:35'), +(7, 23, 1, 59, '2023-02-02 13:44:52', '2023-02-01 19:22:30'), +(8, 22, 1, 22, '2023-02-06 14:14:47', '2023-02-01 20:05:11'), +(9, 21, 1, 20, '2023-02-06 14:14:47', '2023-02-01 20:05:33'), +(10, 20, 1, 16, '2023-02-06 14:14:47', '2023-02-01 20:06:16'), +(11, 19, 1, 7, '2023-02-06 14:14:46', '2023-02-01 20:07:24'), +(12, 25, 1, 11, '2023-02-02 12:37:43', '2023-02-01 20:10:36'), +(13, 14, 1, 5, '2023-02-02 12:34:12', '2023-02-01 20:11:35'), +(14, 26, 1, 3, '2023-02-02 12:37:44', '2023-02-01 20:11:36'); -- -------------------------------------------------------- @@ -378,50 +446,110 @@ CREATE TABLE `hg_admin_role_casbin` ( -- INSERT INTO `hg_admin_role_casbin` (`id`, `p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES -(3336, 'p', 'norm', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3337, 'p', 'norm', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3338, 'p', 'norm', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3339, 'p', 'norm', '/dept/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3340, 'p', 'norm', '/post/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3341, 'p', 'norm', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3342, 'p', 'norm', '/member/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3343, 'p', 'norm', '/menu/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3344, 'p', 'norm', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3345, 'p', 'norm', '/log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3346, 'p', 'norm', '/log/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3347, 'p', 'norm', '/loginLog/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3348, 'p', 'norm', '/serve_log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3349, 'p', 'norm', '/notice/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3350, 'p', 'norm', '/attachment/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3351, 'p', 'norm', '/provinces/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3352, 'p', 'norm', '/member/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3353, 'p', 'norm', '/member/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3354, 'p', 'norm', '/member/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3355, 'p', 'norm', '/dept/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3356, 'p', 'norm', '/dept/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3357, 'p', 'norm', '/dept/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3358, 'p', 'norm', '/post/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3359, 'p', 'norm', '/post/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3360, 'p', 'norm', '/post/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3361, 'p', 'norm', '/upload/image', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3362, 'p', 'norm', '/test/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3363, 'p', 'test', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3364, 'p', 'test', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3365, 'p', 'test', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3366, 'p', 'test', '/dept/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3367, 'p', 'test', '/post/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3368, 'p', 'test', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3369, 'p', 'test', '/member/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3370, 'p', 'test', '/member/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3371, 'p', 'test', '/member/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3372, 'p', 'test', '/member/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3373, 'p', 'test', '/dept/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3374, 'p', 'test', '/dept/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3375, 'p', 'test', '/dept/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3376, 'p', 'test', '/post/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3377, 'p', 'test', '/post/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3378, 'p', 'test', '/post/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), -(3379, 'p', 'test', '/test/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''); +(4607, 'p', 'norm', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4608, 'p', 'norm', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4609, 'p', 'norm', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4610, 'p', 'norm', '/dept/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4611, 'p', 'norm', '/post/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4612, 'p', 'norm', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4613, 'p', 'norm', '/member/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4614, 'p', 'norm', '/menu/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4615, 'p', 'norm', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4616, 'p', 'norm', '/log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4617, 'p', 'norm', '/log/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4618, 'p', 'norm', '/loginLog/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4619, 'p', 'norm', '/serve_log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4620, 'p', 'norm', '/notice/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4621, 'p', 'norm', '/attachment/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4622, 'p', 'norm', '/provinces/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4623, 'p', 'norm', '/member/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4624, 'p', 'norm', '/member/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4625, 'p', 'norm', '/member/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4626, 'p', 'norm', '/dept/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4627, 'p', 'norm', '/dept/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4628, 'p', 'norm', '/dept/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4629, 'p', 'norm', '/post/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4630, 'p', 'norm', '/post/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4631, 'p', 'norm', '/post/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4632, 'p', 'norm', '/upload/image', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4633, 'p', 'norm', '/test/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4634, 'p', 'test', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4635, 'p', 'test', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4636, 'p', 'test', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4637, 'p', 'test', '/dept/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4638, 'p', 'test', '/post/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4639, 'p', 'test', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4640, 'p', 'test', '/member/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4641, 'p', 'test', '/member/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4642, 'p', 'test', '/member/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4643, 'p', 'test', '/member/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4644, 'p', 'test', '/dept/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4645, 'p', 'test', '/dept/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4646, 'p', 'test', '/dept/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4647, 'p', 'test', '/post/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4648, 'p', 'test', '/post/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4649, 'p', 'test', '/post/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4650, 'p', 'test', '/test/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4651, 'p', 'gold_agent', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4652, 'p', 'gold_agent', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4653, 'p', 'gold_agent', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4654, 'p', 'silver_agent', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4655, 'p', 'silver_agent', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4656, 'p', 'silver_agent', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4657, 'p', 'copper_agent', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4658, 'p', 'copper_agent', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4659, 'p', 'copper_agent', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4660, 'p', 'finance', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4661, 'p', 'finance', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4662, 'p', 'finance', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4663, 'p', 'finance', '/dept/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4664, 'p', 'finance', '/post/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4665, 'p', 'finance', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4666, 'p', 'finance', '/member/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4667, 'p', 'finance', '/menu/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4668, 'p', 'finance', '/role/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4669, 'p', 'finance', '/log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4670, 'p', 'finance', '/log/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4671, 'p', 'finance', '/loginLog/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4672, 'p', 'finance', '/serve_log/view', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4673, 'p', 'finance', '/notice/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4674, 'p', 'finance', '/attachment/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4675, 'p', 'finance', '/provinces/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4676, 'p', 'finance', '/member/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4677, 'p', 'finance', '/member/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4678, 'p', 'finance', '/member/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4679, 'p', 'finance', '/dept/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4680, 'p', 'finance', '/dept/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4681, 'p', 'finance', '/dept/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4682, 'p', 'finance', '/post/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4683, 'p', 'finance', '/post/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4684, 'p', 'finance', '/post/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4685, 'p', 'finance', '/upload/image', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4686, 'p', 'finance', '/test/list', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4687, 'p', 'finance', '/loginLog/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4688, 'p', 'finance', '/loginLog/export', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4689, 'p', 'finance', '/serveLog/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4690, 'p', 'finance', '/serveLog/export', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4691, 'p', 'finance', '/notice/maxSort', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4692, 'p', 'finance', '/notice/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4693, 'p', 'finance', '/notice/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4694, 'p', 'finance', '/notice/switch', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4695, 'p', 'finance', '/notice/editNotify', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4696, 'p', 'finance', '/notice/editNotice', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4697, 'p', 'finance', '/notice/editLetter', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4698, 'p', 'finance', '/notice/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4699, 'p', 'finance', '/test/maxSort', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4700, 'p', 'finance', '/test/export', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4701, 'p', 'finance', '/test/delete', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4702, 'p', 'finance', '/test/status', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4703, 'p', 'finance', '/test/switch', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4704, 'p', 'finance', '/test/edit', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4705, 'p', 'business', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4706, 'p', 'business', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4707, 'p', 'business', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4708, 'p', 'science', 'dashboard', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4709, 'p', 'science', '/console/stat', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''), +(4710, 'p', 'science', 'dashboard_workplace', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''); -- -------------------------------------------------------- @@ -524,7 +652,93 @@ INSERT INTO `hg_admin_role_menu` (`role_id`, `menu_id`) VALUES (100, 2117), (100, 2121), (100, 2122), -(100, 2124); +(100, 2124), +(200, 2047), +(200, 2048), +(200, 2049), +(200, 2050), +(201, 2047), +(201, 2048), +(201, 2049), +(201, 2050), +(202, 2047), +(202, 2048), +(202, 2049), +(202, 2050), +(206, 2047), +(206, 2048), +(206, 2049), +(206, 2050), +(206, 2061), +(206, 2062), +(206, 2063), +(206, 2064), +(206, 2065), +(206, 2066), +(206, 2067), +(206, 2068), +(206, 2069), +(206, 2070), +(206, 2071), +(206, 2072), +(206, 2074), +(206, 2075), +(206, 2076), +(206, 2077), +(206, 2078), +(206, 2082), +(206, 2083), +(206, 2084), +(206, 2086), +(206, 2087), +(206, 2088), +(206, 2089), +(206, 2090), +(206, 2091), +(206, 2092), +(206, 2093), +(206, 2094), +(206, 2095), +(206, 2096), +(206, 2109), +(206, 2110), +(206, 2111), +(206, 2112), +(206, 2113), +(206, 2114), +(206, 2115), +(206, 2116), +(206, 2117), +(206, 2118), +(206, 2121), +(206, 2122), +(206, 2124), +(206, 2207), +(206, 2208), +(206, 2209), +(206, 2210), +(206, 2211), +(206, 2212), +(206, 2213), +(206, 2214), +(206, 2215), +(206, 2216), +(206, 2217), +(206, 2218), +(206, 2221), +(206, 2222), +(206, 2223), +(206, 2224), +(206, 2225), +(206, 2226), +(207, 2047), +(207, 2048), +(207, 2049), +(207, 2050), +(208, 2047), +(208, 2048), +(208, 2049), +(208, 2050); -- -------------------------------------------------------- @@ -557,10 +771,16 @@ CREATE TABLE `hg_sys_attachment` ( -- INSERT INTO `hg_sys_attachment` (`id`, `app_id`, `member_id`, `cate_id`, `drive`, `name`, `kind`, `meta_type`, `naive_type`, `path`, `file_url`, `size`, `ext`, `md5`, `status`, `created_at`, `updated_at`) VALUES -(26, 'admin', 1, 0, 'local', '68747470733a2f2f627566616e79756e2e636e2d626a2e7566696c656f732e636f6d2f686f74676f2f686f74676f3171756e2e706e67.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpv6dx10bq0cejq5an.png', 'attachment/2023-01-18/cpv6dx10bq0cejq5an.png', 210216, 'png', '4b26a0f8dc468f0aa0a7d4013cb62420', 1, '2023-01-18 16:33:03', '2023-01-18 16:33:03'), -(27, 'admin', 1, 0, 'local', '测试1.doc', 'document', 'application/msword', 'text/plain', 'attachment/2023-01-18/cpv6fjqvrad0sep6ri.doc', 'attachment/2023-01-18/cpv6fjqvrad0sep6ri.doc', 9216, 'doc', '7b82c3bdd93f2bd53dbb6bdb8220428a', 1, '2023-01-18 16:35:10', '2023-01-18 16:35:10'), -(28, 'admin', 1, 0, 'local', 'logo.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpv6fmqmwfq8zobctz.png', 'attachment/2023-01-18/cpv6fmqmwfq8zobctz.png', 38601, 'png', '492c0e0f0eb8e7e6c7b6901d32854d19', 1, '2023-01-18 16:35:17', '2023-01-18 16:35:17'), -(29, 'admin', 1, 0, 'local', '1111.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpve2nuuj6o4mqmcvd.png', 'attachment/2023-01-18/cpve2nuuj6o4mqmcvd.png', 4249, 'png', '9a60b2fc4bf3ea9d88eaf9cc528eb8e8', 1, '2023-01-18 22:34:29', '2023-01-18 22:34:29'); +(26, 'admin', 1, 0, 'local', '68747470733a2f2f627566616e79756e2e636e2d626a2e7566696c656f732e636f6d2f686f74676f2f686f74676f3171756e2e706e67.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpv6dx10bq0cejq5an.png', 'attachment/2023-01-18/cpv6dx10bq0cejq5an.png', 210216, 'png', '4b26a0f8dc468f0aa0a7d4013cb62420', 1, '2023-01-18 16:33:03', '2023-02-04 17:14:23'), +(27, 'admin', 1, 0, 'local', '测试1.doc', 'document', 'application/msword', 'text/plain', 'attachment/2023-01-18/cpv6fjqvrad0sep6ri.doc', 'attachment/2023-01-18/cpv6fjqvrad0sep6ri.doc', 9216, 'doc', '7b82c3bdd93f2bd53dbb6bdb8220428a', 1, '2023-01-18 16:35:10', '2023-02-08 11:33:28'), +(28, 'admin', 1, 0, 'local', 'logo.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpv6fmqmwfq8zobctz.png', 'attachment/2023-01-18/cpv6fmqmwfq8zobctz.png', 38601, 'png', '492c0e0f0eb8e7e6c7b6901d32854d19', 1, '2023-01-18 16:35:17', '2023-02-08 11:07:48'), +(29, 'admin', 1, 0, 'local', '1111.png', 'images', 'image/png', '', 'attachment/2023-01-18/cpve2nuuj6o4mqmcvd.png', 'attachment/2023-01-18/cpve2nuuj6o4mqmcvd.png', 4249, 'png', '9a60b2fc4bf3ea9d88eaf9cc528eb8e8', 1, '2023-01-18 22:34:29', '2023-01-18 22:34:29'), +(30, 'admin', 1, 0, 'local', 'p8.itc.webp', 'images', 'image/webp', '', 'attachment/2023-02-03/cq8jw376n7n4h1ttmc.webp', 'attachment/2023-02-03/cq8jw376n7n4h1ttmc.webp', 78100, 'webp', 'f38a6aefccaa6c6aff6a8d73bce108e2', 1, '2023-02-03 09:52:40', '2023-02-08 11:22:50'), +(31, 'admin', 1, 0, 'local', 'f9dcd100baa1cd11d3d39ced8c66dcf4c2ce2d16.jpeg', 'images', 'image/jpeg', '', 'attachment/2023-02-03/cq8vhqv4qxv0gn1xhr.jpeg', 'attachment/2023-02-03/cq8vhqv4qxv0gn1xhr.jpeg', 64239, 'jpeg', 'd5f74ac9e8e96cbf12401f8e254d2652', 1, '2023-02-03 18:58:10', '2023-02-03 18:58:10'), +(32, 'admin', 1, 0, 'local', 'pic4.zhimg.jpg', 'images', 'image/jpeg', '', 'attachment/2023-02-04/cq9nr49euxd0acm3en.jpg', 'attachment/2023-02-04/cq9nr49euxd0acm3en.jpg', 59608, 'jpg', '4f7b441436d8f18d848c83df3d5fd77c', 1, '2023-02-04 17:06:55', '2023-02-04 17:10:15'), +(33, 'admin', 1, 0, 'local', 'image.png', 'images', 'image/png', '', 'attachment/2023-02-08/cqcunl3rdi14suhmtf.png', 'attachment/2023-02-08/cqcunl3rdi14suhmtf.png', 61205, 'png', 'f3c58edb2a10a9826a9ee73d43c50bb0', 1, '2023-02-08 11:09:26', '2023-02-08 11:09:26'), +(34, 'admin', 1, 0, 'local', '测试2.xlsx', 'document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/plain', 'attachment/2023-02-08/cqcuonk03dw0tdzayr.xlsx', 'attachment/2023-02-08/cqcuonk03dw0tdzayr.xlsx', 9800, 'xlsx', 'df3457614fd455a6486a0c1dcf6e0603', 1, '2023-02-08 11:10:50', '2023-02-08 11:10:50'), +(35, 'admin', 1, 0, 'local', 'image.png', 'images', 'image/png', '', 'attachment/2023-02-08/cqd2ro0nalr0gh6y2q.png', 'attachment/2023-02-08/cqd2ro0nalr0gh6y2q.png', 34086, 'png', 'ef046b17b78a9ad3421239ea6f98d791', 1, '2023-02-08 17:30:55', '2023-02-08 17:30:55'); -- -------------------------------------------------------- @@ -619,20 +839,20 @@ INSERT INTO `hg_sys_config` (`id`, `group`, `name`, `type`, `key`, `value`, `def (1, 'theme', '默认主题', 'string', 'themeDarkTheme', 'dark', 'dark', 50, '', 1, 1, '2021-01-30 13:27:43', '2022-09-05 20:29:05'), (2, 'theme', '默认系统主题', 'string', 'themeAppTheme', '#2d8cf0', '#2d8cf0', 60, '', 1, 1, '2021-01-30 13:27:43', '2022-09-05 20:29:05'), (3, 'theme', '默认侧边栏风格', 'string', 'themeNavTheme', 'light', 'dark', 70, '', 1, 1, '2021-01-30 13:27:43', '2022-09-05 20:29:05'), -(4, 'basic', '用户是否可注册开关', 'int', 'basicRegisterSwitch', '1', '1', 80, '', 1, 1, '2021-09-29 23:51:21', '2022-11-24 16:18:31'), -(5, 'basic', '验证码开关', 'int', 'basicCaptchaSwitch', '1', '1', 90, '', 1, 1, '2021-09-29 23:51:21', '2022-11-24 16:18:31'), -(6, 'basic', '网站名称', 'string', 'basicName', 'HotGo', 'HotGo!', 10, '', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(7, 'basic', '网站logo', 'string', 'basicLogo', 'https://hotgo.facms.cn/attachment/2022-10-07/cnf9tml2ikirr1i6ss.png', '', 20, '首页使用', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(8, 'basic', '网站备案号', 'string', 'basicIcpCode', '豫ICP备16035288号', '', 30, '', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(9, 'basic', '网站开启访问', 'bool', 'basicSystemOpen', '1', 'true', 50, '', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(10, 'basic', '网站关闭提示', 'string', 'basicCloseText', '网站维护中,暂时无法访问!本网站正在进行系统维护和技术升级,网站暂时无法访问,敬请谅解!', '网站维护中,暂时无法访问!本网站正在进行系统维护和技术升级,网站暂时无法访问,敬请谅解!', 60, '', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(11, 'basic', '版权所有', 'string', 'basicCopyright', '© 2019 - 2023 HotGo All Rights Reserved.', '© 2021 - 2023 HotGo All Rights Reserved.', 40, '', 1, 1, '2021-01-30 13:27:43', '2022-11-24 16:18:31'), -(12, 'smtp', 'SMTP服务器', 'string', 'smtpHost', 'smtpdm.aliyun.com', 'smtpdm.aliyun.com', 50, '错误的配置发送邮件会导致服务器超时', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), -(13, 'smtp', 'SMTP端口', 'int', 'smtpPort', '25', '25', 100, '(不加密默认25,SSL默认465,TLS默认587)', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), -(14, 'smtp', 'SMTP用户名', 'string', 'smtpUser', 'ali@mail.qvnidaye.com', '', 110, '填写完整用户名', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), -(15, 'smtp', 'SMTP密码', 'string', 'smtpPass', '', '', 120, '填写您的密码', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), -(16, 'smtp', '发件人名称', 'string', 'smtpSendName', 'HotGo', 'HotGo', 130, '', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), -(17, 'smtp', '管理员邮箱', 'string', 'smtpAdminMailbox', '133814250@qq.com', '133814250@qq.com', 140, '', 1, 1, '2021-01-30 13:27:43', '2022-09-05 23:05:40'), +(4, 'basic', '用户是否可注册开关', 'int', 'basicRegisterSwitch', '1', '1', 80, '', 1, 1, '2021-09-29 23:51:21', '2023-02-04 15:06:52'), +(5, 'basic', '验证码开关', 'int', 'basicCaptchaSwitch', '1', '1', 90, '', 1, 1, '2021-09-29 23:51:21', '2023-02-04 15:06:52'), +(6, 'basic', '网站名称', 'string', 'basicName', 'HotGo', 'HotGo!', 10, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(7, 'basic', '网站logo', 'string', 'basicLogo', 'https://hotgo.facms.cn/attachment/2022-10-07/cnf9tml2ikirr1i6ss.png', '', 20, '首页使用', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(8, 'basic', '网站备案号', 'string', 'basicIcpCode', '豫ICP备16035288号', '', 30, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(9, 'basic', '网站开启访问', 'bool', 'basicSystemOpen', '1', 'true', 50, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(10, 'basic', '网站关闭提示', 'string', 'basicCloseText', '网站维护中,暂时无法访问!本网站正在进行系统维护和技术升级,网站暂时无法访问,敬请谅解!', '网站维护中,暂时无法访问!本网站正在进行系统维护和技术升级,网站暂时无法访问,敬请谅解!', 60, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(11, 'basic', '版权所有', 'string', 'basicCopyright', '© 2019 - 2023 HotGo All Rights Reserved.', '© 2021 - 2023 HotGo All Rights Reserved.', 40, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'), +(12, 'smtp', 'SMTP服务器', 'string', 'smtpHost', 'smtpdm.aliyun.com', 'smtpdm.aliyun.com', 50, '错误的配置发送邮件会导致服务器超时', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(13, 'smtp', 'SMTP端口', 'int', 'smtpPort', '25', '25', 100, '(不加密默认25,SSL默认465,TLS默认587)', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(14, 'smtp', 'SMTP用户名', 'string', 'smtpUser', 'ali@mail.qvnidaye.com', '', 110, '填写完整用户名', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(15, 'smtp', 'SMTP密码', 'string', 'smtpPass', '', '', 120, '填写您的密码', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(16, 'smtp', '发件人名称', 'string', 'smtpSendName', 'HotGo', 'HotGo', 130, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(17, 'smtp', '管理员邮箱', 'string', 'smtpAdminMailbox', '133814250@qq.com', '133814250@qq.com', 140, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), (28, 'upload', '上传驱动', 'string', 'uploadDrive', 'local', '', 300, 'local:本地;ucloud:ucloud', 1, 1, '2021-01-30 13:27:43', '2022-12-30 15:31:33'), (29, 'upload', '上传图片大小限制', 'int', 'uploadImageSize', '2', '2', 310, '单位:MB', 1, 1, '2021-01-30 13:27:43', '2022-12-30 15:31:33'), (30, 'upload', '上传图片类型限制', 'string', 'uploadImageType', 'jpg,jpeg,gif,npm,png,svg', 'jpg,jpeg,gif,npm,png,svg', 320, '图片上传后缀类型限制', 1, 1, '2021-01-30 13:27:43', '2022-12-30 15:31:33'), @@ -654,7 +874,12 @@ INSERT INTO `hg_sys_config` (`id`, `group`, `name`, `type`, `key`, `value`, `def (46, 'sms', '阿里云短信模板', 'string', 'smsAliyunTemplate', '[{\"key\":\"login\",\"value\":\"SMS_198921686\"},{\"key\":\"register\",\"value\":\"SMS_198921686\"},{\"key\":\"code\",\"value\":\"SMS_198921686\"},{\"key\":\"resetPwd\",\"value\":\"SMS_198921686\"},{\"key\":\"bind\",\"value\":\"SMS_198921686\"},{\"key\":\"cash\",\"value\":\"SMS_198921686\"}]', '', 640, '', 1, 1, '2021-01-30 13:27:43', '2023-01-21 21:30:05'), (47, 'sms', '最小发送间隔', 'int', 'smsMinInterval', '60', '', 600, '同号码', 1, 1, '2021-01-30 13:27:43', '2023-01-21 21:30:05'), (48, 'sms', 'IP最大发送次数', 'int', 'smsMaxIpLimit', '10', '', 610, '同IP每天最大允许发送次数', 1, 1, '2021-01-30 13:27:43', '2023-01-21 21:30:05'), -(49, 'sms', '验证码有效期', 'int', 'smsCodeExpire', '600', '', 610, '单位:秒', 1, 1, '2021-01-30 13:27:43', '2023-01-21 21:30:05'); +(49, 'sms', '验证码有效期', 'int', 'smsCodeExpire', '600', '', 610, '单位:秒', 1, 1, '2021-01-30 13:27:43', '2023-01-21 21:30:05'), +(50, 'smtp', '邮件模板', 'string', 'smtpTemplate', '[{\"key\":\"text\",\"value\":\"./resource/template/email/text.html\"},{\"key\":\"login\",\"value\":\"./resource/template/email/code.html\"},{\"key\":\"register\",\"value\":\"./resource/template/email/code.html\"},{\"key\":\"code\",\"value\":\"./resource/template/email/code.html\"},{\"key\":\"resetPwd\",\"value\":\"./resource/template/email/resetPwd.html\"},{\"key\":\"bind\",\"value\":\"./resource/template/email/code.html\"},{\"key\":\"cash\",\"value\":\"./resource/template/email/code.html\"}]', '', 190, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(51, 'smtp', '最小发送间隔', 'int', 'smtpMinInterval', '60', '', 150, '同地址', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(52, 'smtp', 'IP最大发送次数', 'int', 'smtpMaxIpLimit', '10', '', 160, '同IP每天最大允许发送次数', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(53, 'smtp', '验证码有效期', 'int', 'smtpCodeExpire', '600', '', 170, '单位:秒', 1, 1, '2021-01-30 13:27:43', '2023-02-04 16:59:13'), +(54, 'basic', '网站域名', 'string', 'basicDomain', 'https://hotgo.facms.cn', 'https://hotgo.facms.cn', 45, '', 1, 1, '2021-01-30 13:27:43', '2023-02-04 15:06:52'); -- -------------------------------------------------------- @@ -682,9 +907,9 @@ CREATE TABLE `hg_sys_cron` ( -- INSERT INTO `hg_sys_cron` (`id`, `group_id`, `name`, `params`, `pattern`, `policy`, `count`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES -(1, 1, 'test', '', '* * * * * *', 1, 0, 10, '测试无参数任务', 2, '2022-10-01 22:02:09', '2022-10-01 22:39:23'), -(2, 1, 'test2', 'hotGo,3,欢迎使用hotGo!', '* * * * * *', 1, 0, 10, '测试有参数任务', 2, '2022-10-01 06:02:09', '2022-10-07 19:57:37'), -(3, 1, 'monitor', '', '@every 1s', 1, 0, 30, '监控任务,统计实时网速', 1, '2022-10-01 22:02:09', '2023-01-20 19:33:40'); +(1, 1, 'test', '', '* * * * * *', 1, 0, 10, '测试无参数任务', 2, '2022-10-01 22:02:09', '2023-02-04 17:40:46'), +(2, 1, 'test2', 'hotGo,3,欢迎使用hotGo!', '* * * * * *', 1, 0, 10, '测试有参数任务', 2, '2022-10-01 06:02:09', '2023-02-04 17:39:53'), +(3, 1, 'monitor', '', '@every 1s', 1, 0, 30, '监控任务,统计实时网速', 1, '2022-10-01 22:02:09', '2023-02-04 17:29:14'); -- -------------------------------------------------------- @@ -739,8 +964,8 @@ CREATE TABLE `hg_sys_dict_data` ( INSERT INTO `hg_sys_dict_data` (`id`, `label`, `value`, `value_type`, `type`, `list_class`, `is_default`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (1, '男', '1', 'int', 'sys_user_sex', 'success', 1, 10, '性别男', 1, '2021-01-30 13:27:43', '2023-01-06 09:45:24'), -(2, '女', '2', 'int', 'sys_user_sex', 'warning', 0, 20, '性别女', 1, '2021-01-30 13:27:43', '2023-01-06 09:45:21'), -(3, '未知', '0', 'int', 'sys_user_sex', 'error', 0, 30, '性别未知', 1, '2021-01-30 13:27:43', '2023-01-06 09:45:18'), +(2, '女', '2', 'int', 'sys_user_sex', 'warning', 1, 20, '性别女', 1, '2021-01-30 13:27:43', '2023-01-06 09:45:21'), +(3, '保密', '3', 'int', 'sys_user_sex', 'error', 1, 30, '性别保密', 1, '2021-01-30 13:27:43', '2023-01-06 09:45:18'), (4, '显示', '2', 'int', 'sys_show_hide', 'primary', 1, 10, '显示菜单', 1, '2021-01-30 13:27:43', '2023-01-18 09:52:59'), (5, '隐藏', '1', 'int', 'sys_show_hide', 'error', 1, 20, '隐藏菜单', 1, '2021-01-30 13:27:43', '2023-01-18 09:52:56'), (6, '正常', '1', 'int', 'sys_normal_disable', 'success', 1, 10, '正常状态', 1, '2021-01-30 13:27:43', '2023-01-18 09:52:44'), @@ -750,7 +975,7 @@ INSERT INTO `hg_sys_dict_data` (`id`, `label`, `value`, `value_type`, `type`, `l (10, '默认', 'DEFAULT', 'string', 'sys_job_group', '', 1, 10, '默认分组', 1, '2021-01-30 13:27:43', NULL), (11, '系统', 'SYSTEM', 'string', 'sys_job_group', '', 1, 20, '系统分组', 1, '2021-01-30 13:27:43', NULL), (14, '通知', '1', 'int', 'sys_notice_type', 'warning', 1, 10, '通知', 1, '2021-01-30 13:27:43', '2023-01-05 20:06:47'), -(15, '公告', '2', 'int', 'sys_notice_type', 'info', 1, 20, '公告', 1, '2021-01-30 13:27:43', '2023-01-05 20:06:44'), +(15, '公告', '2', 'int', 'sys_notice_type', 'error', 1, 20, '公告', 1, '2021-01-30 13:27:43', '2023-01-26 12:08:52'), (18, '新增', '1', 'int', 'sys_oper_type', 'info', 0, 10, '新增操作', 1, '2021-01-30 13:27:43', NULL), (19, '修改', '2', 'int', 'sys_oper_type', 'info', 0, 20, '修改操作', 1, '2021-01-30 13:27:43', NULL), (20, '删除', '3', 'int', 'sys_oper_type', 'error', 0, 30, '删除操作', 1, '2021-01-30 13:27:43', NULL), @@ -800,7 +1025,20 @@ INSERT INTO `hg_sys_dict_data` (`id`, `label`, `value`, `value_type`, `type`, `l (137, '注册', 'register', 'string', 'config_sms_template', 'warning', 0, 30, '', 1, '2023-01-21 10:28:58', '2023-01-21 10:28:58'), (138, '重置密码', 'resetPwd', 'string', 'config_sms_template', 'error', 0, 40, '', 1, '2023-01-21 10:29:10', '2023-01-21 10:29:10'), (139, '绑定手机号', 'bind', 'string', 'config_sms_template', 'info', 0, 50, '', 1, '2023-01-21 10:29:22', '2023-01-21 10:29:22'), -(140, '申请提现', 'cash', 'string', 'config_sms_template', 'primary', 0, 60, '', 1, '2023-01-21 10:29:36', '2023-01-21 10:29:40'); +(140, '申请提现', 'cash', 'string', 'config_sms_template', 'primary', 0, 60, '', 1, '2023-01-21 10:29:36', '2023-01-21 10:29:40'), +(141, '私信', '3', 'int', 'sys_notice_type', 'info', 0, 30, '', 1, '2023-01-26 12:08:42', '2023-01-26 12:08:42'), +(142, '一般', '1', 'int', 'sys_notice_tag', 'info', 0, 10, '', 1, '2023-01-26 12:13:04', '2023-01-26 12:16:07'), +(143, '重要', '2', 'int', 'sys_notice_tag', 'error', 0, 20, '', 1, '2023-01-26 12:13:36', '2023-01-26 12:13:36'), +(144, '提醒', '3', 'int', 'sys_notice_tag', 'warning', 0, 30, '', 1, '2023-01-26 12:13:52', '2023-01-26 12:13:52'), +(145, '注意', '4', 'int', 'sys_notice_tag', 'success', 0, 40, '', 1, '2023-01-26 12:14:12', '2023-01-26 12:14:12'), +(146, '调试', '5', 'int', 'sys_notice_tag', 'default', 0, 50, '', 1, '2023-01-26 12:15:59', '2023-01-26 12:15:59'), +(147, '通用验证码', 'code', 'string', 'config_ems_template', 'info', 0, 10, '', 1, '2023-01-21 10:28:39', '2023-01-21 20:40:09'), +(148, '登录', 'login', 'string', 'config_ems_template', 'success', 0, 20, '', 1, '2023-01-21 10:28:48', '2023-01-21 10:28:48'), +(149, '注册', 'register', 'string', 'config_ems_template', 'warning', 0, 30, '', 1, '2023-01-21 10:28:58', '2023-01-21 10:28:58'), +(150, '重置密码', 'resetPwd', 'string', 'config_ems_template', 'error', 0, 40, '', 1, '2023-01-21 10:29:10', '2023-01-21 10:29:10'), +(151, '绑定手机号', 'bind', 'string', 'config_ems_template', 'info', 0, 50, '', 1, '2023-01-21 10:29:22', '2023-01-21 10:29:22'), +(152, '申请提现', 'cash', 'string', 'config_ems_template', 'primary', 0, 60, '', 1, '2023-01-21 10:29:36', '2023-01-21 10:29:40'), +(153, '富文本', 'text', 'string', 'config_ems_template', 'default', 0, 0, '自定义编辑邮件内容时使用', 1, '2023-01-21 10:29:36', '2023-02-04 12:55:19'); -- -------------------------------------------------------- @@ -846,7 +1084,36 @@ INSERT INTO `hg_sys_dict_type` (`id`, `pid`, `name`, `type`, `sort`, `remark`, ` (33, 32, '上传驱动', 'config_upload_drive', 10, '', 1, '2022-12-30 17:57:18', '2022-12-30 17:57:18'), (34, 28, '日志类型', 'sys_log_type', 50, '', 1, '2023-01-20 16:39:52', '2023-01-20 16:39:52'), (35, 32, '短信驱动', 'config_sms_drive', 20, '', 1, '2023-01-21 10:27:01', '2023-01-21 10:27:01'), -(36, 32, '短信模板', 'config_sms_template', 30, '', 1, '2023-01-21 10:27:41', '2023-01-21 10:27:41'); +(36, 32, '短信模板', 'config_sms_template', 30, '', 1, '2023-01-21 10:27:41', '2023-01-21 10:27:41'), +(37, 29, '通知标签', 'sys_notice_tag', 20, '', 1, '2023-01-26 12:09:46', '2023-01-26 12:09:46'), +(38, 32, '邮件模板', 'config_ems_template', 40, '', 1, '2023-02-04 12:53:07', '2023-02-04 12:53:07'); + +-- -------------------------------------------------------- + +-- +-- 表的结构 `hg_sys_ems_log` +-- + +CREATE TABLE `hg_sys_ems_log` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `event` varchar(64) NOT NULL COMMENT '事件', + `email` varchar(512) NOT NULL COMMENT '邮箱地址,多个用;隔开', + `code` varchar(256) DEFAULT '' COMMENT '验证码', + `times` bigint(20) NOT NULL COMMENT '验证次数', + `content` longtext COMMENT '邮件内容', + `ip` varchar(128) DEFAULT NULL COMMENT 'ip地址', + `status` tinyint(1) DEFAULT '1' COMMENT '状态(1未验证,2已验证)', + `created_at` datetime DEFAULT NULL COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统_邮件发送记录'; + +-- +-- 转存表中的数据 `hg_sys_ems_log` +-- + +INSERT INTO `hg_sys_ems_log` (`id`, `event`, `email`, `code`, `times`, `content`, `ip`, `status`, `created_at`, `updated_at`) VALUES +(4, 'bind', '133814250@qq.com', '8793', 1, '\r\n\r\n\r\n \r\n \r\n \r\n \r\n 验证码邮件\r\n \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 这是你发送的验证码吗?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Windows 10
\r\n 保留地址 (estimated)
\r\n IP 地址: 127**.0.1\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 如果是,请输入验证码:\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 8793\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 该验证码10分钟内有效,请不要告诉于他人!\r\n

\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n', '127.0.0.1', 2, '2023-02-04 16:49:39', '2023-02-04 16:56:24'), +(5, 'bind', '1207426255@qq.com', '7239', 1, '\r\n\r\n\r\n \r\n \r\n \r\n \r\n 验证码邮件\r\n \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 这是你发送的验证码吗?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Windows 10
\r\n 保留地址 (estimated)
\r\n IP 地址: 127**.0.1\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 如果是,请输入验证码:\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 7239\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 该验证码10分钟内有效,请不要告诉于他人!\r\n

\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n', '127.0.0.1', 2, '2023-02-04 16:56:35', '2023-02-04 16:56:43'); -- -------------------------------------------------------- @@ -857,6 +1124,7 @@ INSERT INTO `hg_sys_dict_type` (`id`, `pid`, `name`, `type`, `sort`, `remark`, ` CREATE TABLE `hg_sys_gen_codes` ( `id` bigint(20) NOT NULL COMMENT '生成ID', `gen_type` int(10) UNSIGNED NOT NULL COMMENT '生成类型', + `gen_template` int(11) DEFAULT '0' COMMENT '生成模板', `var_name` varchar(255) NOT NULL COMMENT '实体命名', `options` json DEFAULT NULL COMMENT '配置选项', `db_name` varchar(128) DEFAULT NULL COMMENT '数据库名称', @@ -873,8 +1141,8 @@ CREATE TABLE `hg_sys_gen_codes` ( -- 转存表中的数据 `hg_sys_gen_codes` -- -INSERT INTO `hg_sys_gen_codes` (`id`, `gen_type`, `var_name`, `options`, `db_name`, `table_name`, `table_comment`, `dao_name`, `master_columns`, `status`, `created_at`, `updated_at`) VALUES -(21, 10, 'CurdDemo', '{\"join\": [{\"uuid\": \"pgJsFoqfaGjqgKjy\", \"alias\": \"testCategory\", \"field\": \"id\", \"columns\": [{\"dc\": \"分类ID\", \"id\": 1, \"name\": \"id\", \"extra\": \"auto_increment\", \"index\": \"PRI\", \"goName\": \"TestCategoryId\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryId\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"分类名称\", \"id\": 2, \"name\": \"name\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryName\", \"goType\": \"string\", \"isEdit\": false, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryName\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"描述\", \"id\": 3, \"name\": \"description\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryDescription\", \"goType\": \"string\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryDescription\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"排序\", \"id\": 4, \"name\": \"sort\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategorySort\", \"goType\": \"int\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategorySort\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"备注\", \"id\": 5, \"name\": \"remark\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryRemark\", \"goType\": \"string\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryRemark\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"状态\", \"id\": 6, \"name\": \"status\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryStatus\", \"goType\": \"int\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryStatus\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"tinyint(1)\", \"dataType\": \"tinyint\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"创建时间\", \"id\": 7, \"name\": \"created_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryCreatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryCreatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"修改时间\", \"id\": 8, \"name\": \"updated_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryUpdatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryUpdatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"删除时间\", \"id\": 9, \"name\": \"deleted_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryDeletedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryDeletedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}], \"daoName\": \"TestCategory\", \"linkMode\": 1, \"linkTable\": \"hg_test_category\", \"masterField\": \"category_id\"}], \"menu\": {\"pid\": 2097, \"icon\": \"MenuOutlined\", \"sort\": 200}, \"autoOps\": [\"genMenuPermissions\", \"runDao\", \"runService\", \"forcedCover\"], \"headOps\": [\"add\", \"batchDel\", \"export\"], \"columnOps\": [\"edit\", \"del\", \"view\", \"status\", \"switch\", \"check\"]}', 'default', 'hg_sys_gen_curd_demo', '生成演示', 'SysGenCurdDemo', '[{\"dc\": \"ID\", \"id\": 1, \"name\": \"id\", \"extra\": \"auto_increment\", \"index\": \"PRI\", \"goName\": \"Id\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": true, \"isSort\": true, \"length\": 0, \"tsName\": \"id\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"分类ID\", \"id\": 2, \"name\": \"category_id\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CategoryId\", \"goType\": \"int64\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"categoryId\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"标题\", \"id\": 3, \"name\": \"title\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Title\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"title\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"Input\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"描述\", \"id\": 4, \"name\": \"description\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Description\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"description\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"InputTextarea\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"内容\", \"id\": 5, \"name\": \"content\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Content\", \"goType\": \"string\", \"isEdit\": true, \"isList\": false, \"isSort\": false, \"length\": 65535, \"tsName\": \"content\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"text\", \"dataType\": \"text\", \"dictType\": 0, \"formMode\": \"InputEditor\", \"formRole\": \"none\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE %...%\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"单图\", \"id\": 6, \"name\": \"image\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Image\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"image\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"UploadImage\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"附件\", \"id\": 7, \"name\": \"attachfile\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Attachfile\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"attachfile\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"UploadFile\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"显示开关\", \"id\": 8, \"name\": \"switch\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Switch\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"switch\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"Switch\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"排序\", \"id\": 9, \"name\": \"sort\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Sort\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": true, \"length\": 0, \"tsName\": \"sort\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"状态\", \"id\": 10, \"name\": \"status\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Status\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"status\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"tinyint(1)\", \"dataType\": \"tinyint\", \"dictType\": 3, \"formMode\": \"Select\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"创建者\", \"id\": 11, \"name\": \"created_by\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CreatedBy\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"createdBy\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 0}, {\"dc\": \"更新者\", \"id\": 12, \"name\": \"updated_by\", \"extra\": \"\", \"index\": \"\", \"goName\": \"UpdatedBy\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"updatedBy\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 0}, {\"dc\": \"创建时间\", \"id\": 13, \"name\": \"created_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CreatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"createdAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"TimeRange\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"BETWEEN\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"修改时间\", \"id\": 14, \"name\": \"updated_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"UpdatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"updatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"Time\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"删除时间\", \"id\": 15, \"name\": \"deleted_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"DeletedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"deletedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"Time\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}]', 1, '2023-01-18 11:51:22', '2023-01-18 15:19:42'); +INSERT INTO `hg_sys_gen_codes` (`id`, `gen_type`, `gen_template`, `var_name`, `options`, `db_name`, `table_name`, `table_comment`, `dao_name`, `master_columns`, `status`, `created_at`, `updated_at`) VALUES +(1, 10, 0, 'CurdDemo', '{\"join\": [{\"uuid\": \"pgJsFoqfaGjqgKjy\", \"alias\": \"testCategory\", \"field\": \"id\", \"columns\": [{\"dc\": \"分类ID\", \"id\": 1, \"name\": \"id\", \"extra\": \"auto_increment\", \"index\": \"PRI\", \"goName\": \"TestCategoryId\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryId\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"分类名称\", \"id\": 2, \"name\": \"name\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryName\", \"goType\": \"string\", \"isEdit\": false, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryName\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"描述\", \"id\": 3, \"name\": \"description\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryDescription\", \"goType\": \"string\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryDescription\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"排序\", \"id\": 4, \"name\": \"sort\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategorySort\", \"goType\": \"int\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategorySort\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"备注\", \"id\": 5, \"name\": \"remark\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryRemark\", \"goType\": \"string\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 255, \"tsName\": \"testCategoryRemark\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"状态\", \"id\": 6, \"name\": \"status\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryStatus\", \"goType\": \"int\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryStatus\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"tinyint(1)\", \"dataType\": \"tinyint\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"创建时间\", \"id\": 7, \"name\": \"created_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryCreatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryCreatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"修改时间\", \"id\": 8, \"name\": \"updated_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryUpdatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryUpdatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"删除时间\", \"id\": 9, \"name\": \"deleted_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"TestCategoryDeletedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"testCategoryDeletedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"\", \"formRole\": \"\", \"isExport\": false, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}], \"daoName\": \"TestCategory\", \"linkMode\": 1, \"linkTable\": \"hg_test_category\", \"masterField\": \"category_id\"}], \"menu\": {\"pid\": 2097, \"icon\": \"MenuOutlined\", \"sort\": 200}, \"autoOps\": [\"genMenuPermissions\", \"runDao\", \"runService\", \"forcedCover\"], \"headOps\": [\"add\", \"batchDel\", \"export\"], \"columnOps\": [\"edit\", \"del\", \"view\", \"status\", \"switch\", \"check\"]}', 'default', 'hg_sys_gen_curd_demo', '生成演示', 'SysGenCurdDemo', '[{\"dc\": \"ID\", \"id\": 1, \"name\": \"id\", \"extra\": \"auto_increment\", \"index\": \"PRI\", \"goName\": \"Id\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": true, \"isSort\": true, \"length\": 0, \"tsName\": \"id\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"分类ID\", \"id\": 2, \"name\": \"category_id\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CategoryId\", \"goType\": \"int64\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"categoryId\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"标题\", \"id\": 3, \"name\": \"title\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Title\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 64, \"tsName\": \"title\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(64)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"Input\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"描述\", \"id\": 4, \"name\": \"description\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Description\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"description\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"InputTextarea\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"内容\", \"id\": 5, \"name\": \"content\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Content\", \"goType\": \"string\", \"isEdit\": true, \"isList\": false, \"isSort\": false, \"length\": 65535, \"tsName\": \"content\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"text\", \"dataType\": \"text\", \"dictType\": 0, \"formMode\": \"InputEditor\", \"formRole\": \"none\", \"isExport\": false, \"required\": false, \"queryWhere\": \"LIKE %...%\", \"isAllowNull\": \"NO\", \"defaultValue\": \"\"}, {\"dc\": \"单图\", \"id\": 6, \"name\": \"image\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Image\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"image\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"UploadImage\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"附件\", \"id\": 7, \"name\": \"attachfile\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Attachfile\", \"goType\": \"string\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 255, \"tsName\": \"attachfile\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"varchar(255)\", \"dataType\": \"varchar\", \"dictType\": 0, \"formMode\": \"UploadFile\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"LIKE\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"所在城市\", \"id\": 8, \"name\": \"city_id\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CityId\", \"goType\": \"int64\", \"isEdit\": true, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"cityId\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"CitySelector\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 0}, {\"dc\": \"显示开关\", \"id\": 9, \"name\": \"switch\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Switch\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"switch\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"Switch\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"排序\", \"id\": 10, \"name\": \"sort\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Sort\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": true, \"length\": 0, \"tsName\": \"sort\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"int(11)\", \"dataType\": \"int\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": false, \"queryWhere\": \"=\", \"isAllowNull\": \"NO\", \"defaultValue\": 0}, {\"dc\": \"状态\", \"id\": 11, \"name\": \"status\", \"extra\": \"\", \"index\": \"\", \"goName\": \"Status\", \"goType\": \"int\", \"isEdit\": true, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"status\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"tinyint(1)\", \"dataType\": \"tinyint\", \"dictType\": 3, \"formMode\": \"Select\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 1}, {\"dc\": \"创建者\", \"id\": 12, \"name\": \"created_by\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CreatedBy\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"createdBy\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 0}, {\"dc\": \"更新者\", \"id\": 13, \"name\": \"updated_by\", \"extra\": \"\", \"index\": \"\", \"goName\": \"UpdatedBy\", \"goType\": \"int64\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"updatedBy\", \"tsType\": \"number\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"bigint(20)\", \"dataType\": \"bigint\", \"dictType\": 0, \"formMode\": \"InputNumber\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": 0}, {\"dc\": \"创建时间\", \"id\": 14, \"name\": \"created_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"CreatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"createdAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": true, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"TimeRange\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"BETWEEN\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"修改时间\", \"id\": 15, \"name\": \"updated_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"UpdatedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": true, \"isSort\": false, \"length\": 0, \"tsName\": \"updatedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"Time\", \"formRole\": \"none\", \"isExport\": true, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}, {\"dc\": \"删除时间\", \"id\": 16, \"name\": \"deleted_at\", \"extra\": \"\", \"index\": \"\", \"goName\": \"DeletedAt\", \"goType\": \"*gtime.Time\", \"isEdit\": false, \"isList\": false, \"isSort\": false, \"length\": 0, \"tsName\": \"deletedAt\", \"tsType\": \"string\", \"unique\": false, \"isQuery\": false, \"sqlType\": \"datetime\", \"dataType\": \"datetime\", \"dictType\": 0, \"formMode\": \"Time\", \"formRole\": \"none\", \"isExport\": false, \"required\": true, \"queryWhere\": \"=\", \"isAllowNull\": \"YES\", \"defaultValue\": \"\"}]', 1, '2023-01-18 11:51:22', '2023-02-08 17:47:32'); -- -------------------------------------------------------- @@ -885,11 +1153,12 @@ INSERT INTO `hg_sys_gen_codes` (`id`, `gen_type`, `var_name`, `options`, `db_nam CREATE TABLE `hg_sys_gen_curd_demo` ( `id` bigint(20) NOT NULL COMMENT 'ID', `category_id` bigint(20) NOT NULL COMMENT '分类ID', - `title` varchar(255) NOT NULL COMMENT '标题', + `title` varchar(64) NOT NULL COMMENT '标题', `description` varchar(255) NOT NULL COMMENT '描述', `content` text NOT NULL COMMENT '内容', `image` varchar(255) DEFAULT NULL COMMENT '单图', `attachfile` varchar(255) DEFAULT NULL COMMENT '附件', + `city_id` bigint(20) DEFAULT '0' COMMENT '所在城市', `switch` int(11) DEFAULT '1' COMMENT '显示开关', `sort` int(11) NOT NULL COMMENT '排序', `status` tinyint(1) DEFAULT '1' COMMENT '状态', @@ -904,8 +1173,9 @@ CREATE TABLE `hg_sys_gen_curd_demo` ( -- 转存表中的数据 `hg_sys_gen_curd_demo` -- -INSERT INTO `hg_sys_gen_curd_demo` (`id`, `category_id`, `title`, `description`, `content`, `image`, `attachfile`, `switch`, `sort`, `status`, `created_by`, `updated_by`, `created_at`, `updated_at`, `deleted_at`) VALUES -(1, 1, '测试标题2', '描述.', '

啦啦啦啦

啦啦啦啦啦啦啦啦啦啦啦啦

', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', 'http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx', 1, 20, 1, 0, 1, '2022-12-15 19:30:14', '2023-01-18 14:56:39', NULL); +INSERT INTO `hg_sys_gen_curd_demo` (`id`, `category_id`, `title`, `description`, `content`, `image`, `attachfile`, `city_id`, `switch`, `sort`, `status`, `created_by`, `updated_by`, `created_at`, `updated_at`, `deleted_at`) VALUES +(1, 1, '测试标题', '描述.', '


', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', 'http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx', 150523, 1, 10, 1, 0, 1, '2022-12-15 19:30:14', '2023-02-08 17:30:58', NULL), +(2, 2, '测试2', '描述2', '

现在想着想着

', '', '', 0, 1, 20, 1, 1, 0, '2023-02-08 15:39:13', '2023-02-08 15:39:13', '2023-02-08 16:04:04'); -- -------------------------------------------------------- @@ -939,16 +1209,6 @@ CREATE TABLE `hg_sys_log` ( `updated_at` datetime DEFAULT NULL COMMENT '修改时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统_全局日志'; --- --- 转存表中的数据 `hg_sys_log` --- - -INSERT INTO `hg_sys_log` (`id`, `req_id`, `app_id`, `merchant_id`, `member_id`, `method`, `module`, `url`, `get_data`, `post_data`, `header_data`, `ip`, `province_id`, `city_id`, `error_code`, `error_msg`, `error_data`, `user_agent`, `take_up_time`, `timestamp`, `status`, `created_at`, `updated_at`) VALUES -(1, '74cc4ac189703d17726c30668989b6fa', 'admin', 0, 1, 'GET', 'admin', '/admin/member/info', '{}', '{}', '{\"Accept\": [\"application/json, text/plain, */*\"], \"Cookie\": [\"order=id%20desc; ltd_end=-1; pro_end=-1; memSize=16297; db_page_model=mysql; backup_path=D%3A/backup; page_number=20; serverType=nginx; force=0; soft_remarks=%7B%22list%22%3A%5B%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90011%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u9001500%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F31.72%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4E13%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22ltd_list%22%3A%5B%22%u4F01%u4E1A%u7248%u63D2%u4EF6%22%2C%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90012%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u90011000%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F32.27%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4F01%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22kfqq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%2C%22qun%22%3A%221%22%2C%22kf_list%22%3A%5B%7B%22qq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%7D%2C%7B%22qq%22%3A%222927440070%22%2C%22kf%22%3A%22http%3A//wpa.qq.com/msgrd%3Fv%3D3%26uin%3D2927440070%26site%3Dqq%26menu%3Dyes%26from%3Dmessage%26isappinstalled%3D0%22%7D%5D%2C%22wx_list%22%3A%5B%7B%22ps%22%3A%22%u552E%u524D%u54A8%u8BE2%22%2C%22kf%22%3A%22https%3A//work.weixin.qq.com/kfid/kfc72fcbde93e26a6f3%22%7D%5D%7D; pnull=2; softType=5; bt_user_info=%7B%22status%22%3Atrue%2C%22msg%22%3A%22%u83B7%u53D6%u6210%u529F%21%22%2C%22data%22%3A%7B%22username%22%3A%22153****0571%22%7D%7D; site_model=php; sites_path=D%3A/wwwroot; request_token=EaNIwNYb7xvyGoKZjioBaG96r55N1g81g32m68nTmUzeOrLX; bt_config=%7B%22webserver%22%3A%22nginx%22%2C%22sites_path%22%3A%22D%3A/wwwroot%22%2C%22backup_path%22%3A%22D%3A/backup%22%2C%22status%22%3Atrue%2C%22mysql_root%22%3A%22123456%22%2C%22email%22%3A%22admin@qq.com%22%2C%22distribution%22%3A%22Windows%2010%20Pro%20%28build%2019044%29%20x64%20%28Py3.8.6%29%22%2C%22request_iptype%22%3A%22ipv6%22%2C%22request_type%22%3A%22python%22%2C%22php%22%3A%5B%7B%22setup%22%3Atrue%2C%22version%22%3A%2256%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%2C%7B%22setup%22%3Atrue%2C%22version%22%3A%2274%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%5D%2C%22mysql%22%3A%7B%22setup%22%3Atrue%2C%22status%22%3Atrue%2C%22version%22%3A%22MySQL5.7%22%7D%2C%22sqlserver%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22ftp%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22panel%22%3A%7B%22502%22%3A%22%22%2C%22port%22%3A%2218888%22%2C%22address%22%3A%2239.162.138.63%22%2C%22domain%22%3A%22%22%2C%22auto%22%3A%22%22%2C%22limitip%22%3A%22%22%2C%22templates%22%3A%5B%5D%2C%22template%22%3A%22default%22%2C%22admin_path%22%3A%22/radius%22%7D%2C%22systemdate%22%3A%222023-01-21%2022%3A11%3A30%22%2C%22show_workorder%22%3Afalse%2C%22isSetup%22%3Atrue%2C%22lan%22%3A%7B%22H1%22%3A%22%u9996%u9875%22%2C%22H2%22%3A%22%u7F51%u7AD9%u7BA1%u7406%22%2C%22SEARCH%22%3A%22%u7F51%u7AD9%u641C%u7D22%22%2C%22PS%22%3A%22%u4F7F%u7528%u5B9D%u5854Windows%u9762%u677F%u521B%u5EFA%u7AD9%u70B9%u65F6%u4F1A%u81EA%u52A8%u521B%u5EFA%u6743%u9650%u914D%u7F6E%uFF0C%u7EDF%u4E00%u4F7F%u7528www%u7528%u6237%u3002%22%2C%22BTN1%22%3A%22%u6DFB%u52A0%u7AD9%u70B9%22%2C%22BTN2%22%3A%22%u4FEE%u6539%u9ED8%u8BA4%u9875%22%2C%22BTN3%22%3A%22%u9ED8%u8BA4%u7AD9%u70B9%22%2C%22BTN4%22%3A%22%u5220%u9664%u9009%u4E2D%22%2C%22BTN5%22%3A%22%u5206%u7C7B%u7BA1%u7406%22%2C%22TH1%22%3A%22%u57DF%u540D%22%2C%22TH2%22%3A%22%u7F51%u7AD9%u72B6%u6001%22%2C%22TH3%22%3A%22%u5907%u4EFD%22%2C%22TH4%22%3A%22%u7F51%u7AD9%u76EE%u5F55%22%2C%22TH5%22%3A%22%u5230%u671F%u65E5%u671F%22%2C%22TH6%22%3A%22%u5907%u6CE8%22%2C%22TH7%22%3A%22%u64CD%u4F5C%22%2C%22JS1%22%3A%22%u8BF7%u5148%u5B89%u88C5Web%u670D%u52A1%u5668%21%22%2C%22JS2%22%3A%22%u53BB%u5B89%u88C5%22%7D%7D\"], \"Referer\": [\"http://127.0.0.1:8001/\"], \"Sec-Ch-Ua\": [\"\\\";Not A Brand\\\";v=\\\"99\\\", \\\"Chromium\\\";v=\\\"94\\\"\"], \"Connection\": [\"close\"], \"User-Agent\": [\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400\"], \"Authorization\": [\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAzLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzU0MjA2MzUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJsYXN0SXAiOiIxMjcuMC4wLjEiLCJsYXN0VGltZSI6MTY3NDU1NjUxNCwibW9iaWxlIjoiMTUzMDM4MzA1NzEiLCJwaWQiOjAsInJlYWxOYW1lIjoi5a2f5biFIiwicm9sZUlkIjoxLCJyb2xlS2V5Ijoic3VwZXIiLCJ1c2VybmFtZSI6ImFkbWluIiwidmlzaXRDb3VudCI6NDEzfQ.QVzMnw5IUwdbZlzQM6oJYGTTVu5a7EfbrKEhpAgS0U8\"], \"Sec-Fetch-Dest\": [\"empty\"], \"Sec-Fetch-Mode\": [\"cors\"], \"Sec-Fetch-Site\": [\"same-origin\"], \"Accept-Encoding\": [\"gzip, deflate, br\"], \"Accept-Language\": [\"zh-CN,zh;q=0.9\"], \"Sec-Ch-Ua-Mobile\": [\"?0\"], \"Sec-Ch-Ua-Platform\": [\"\\\"Windows\\\"\"]}', '127.0.0.1', 0, 0, 0, '操作成功', '{}', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400', 13, 1674618373, 1, '2023-01-25 11:46:13', '2023-01-25 11:46:13'), -(2, '5880edc289703d17736c3066d57e97fc', 'admin', 0, 1, 'GET', 'admin', '/admin/site/config', '{}', '{}', '{\"Accept\": [\"application/json, text/plain, */*\"], \"Cookie\": [\"order=id%20desc; ltd_end=-1; pro_end=-1; memSize=16297; db_page_model=mysql; backup_path=D%3A/backup; page_number=20; serverType=nginx; force=0; soft_remarks=%7B%22list%22%3A%5B%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90011%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u9001500%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F31.72%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4E13%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22ltd_list%22%3A%5B%22%u4F01%u4E1A%u7248%u63D2%u4EF6%22%2C%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90012%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u90011000%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F32.27%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4F01%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22kfqq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%2C%22qun%22%3A%221%22%2C%22kf_list%22%3A%5B%7B%22qq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%7D%2C%7B%22qq%22%3A%222927440070%22%2C%22kf%22%3A%22http%3A//wpa.qq.com/msgrd%3Fv%3D3%26uin%3D2927440070%26site%3Dqq%26menu%3Dyes%26from%3Dmessage%26isappinstalled%3D0%22%7D%5D%2C%22wx_list%22%3A%5B%7B%22ps%22%3A%22%u552E%u524D%u54A8%u8BE2%22%2C%22kf%22%3A%22https%3A//work.weixin.qq.com/kfid/kfc72fcbde93e26a6f3%22%7D%5D%7D; pnull=2; softType=5; bt_user_info=%7B%22status%22%3Atrue%2C%22msg%22%3A%22%u83B7%u53D6%u6210%u529F%21%22%2C%22data%22%3A%7B%22username%22%3A%22153****0571%22%7D%7D; site_model=php; sites_path=D%3A/wwwroot; request_token=EaNIwNYb7xvyGoKZjioBaG96r55N1g81g32m68nTmUzeOrLX; bt_config=%7B%22webserver%22%3A%22nginx%22%2C%22sites_path%22%3A%22D%3A/wwwroot%22%2C%22backup_path%22%3A%22D%3A/backup%22%2C%22status%22%3Atrue%2C%22mysql_root%22%3A%22123456%22%2C%22email%22%3A%22admin@qq.com%22%2C%22distribution%22%3A%22Windows%2010%20Pro%20%28build%2019044%29%20x64%20%28Py3.8.6%29%22%2C%22request_iptype%22%3A%22ipv6%22%2C%22request_type%22%3A%22python%22%2C%22php%22%3A%5B%7B%22setup%22%3Atrue%2C%22version%22%3A%2256%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%2C%7B%22setup%22%3Atrue%2C%22version%22%3A%2274%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%5D%2C%22mysql%22%3A%7B%22setup%22%3Atrue%2C%22status%22%3Atrue%2C%22version%22%3A%22MySQL5.7%22%7D%2C%22sqlserver%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22ftp%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22panel%22%3A%7B%22502%22%3A%22%22%2C%22port%22%3A%2218888%22%2C%22address%22%3A%2239.162.138.63%22%2C%22domain%22%3A%22%22%2C%22auto%22%3A%22%22%2C%22limitip%22%3A%22%22%2C%22templates%22%3A%5B%5D%2C%22template%22%3A%22default%22%2C%22admin_path%22%3A%22/radius%22%7D%2C%22systemdate%22%3A%222023-01-21%2022%3A11%3A30%22%2C%22show_workorder%22%3Afalse%2C%22isSetup%22%3Atrue%2C%22lan%22%3A%7B%22H1%22%3A%22%u9996%u9875%22%2C%22H2%22%3A%22%u7F51%u7AD9%u7BA1%u7406%22%2C%22SEARCH%22%3A%22%u7F51%u7AD9%u641C%u7D22%22%2C%22PS%22%3A%22%u4F7F%u7528%u5B9D%u5854Windows%u9762%u677F%u521B%u5EFA%u7AD9%u70B9%u65F6%u4F1A%u81EA%u52A8%u521B%u5EFA%u6743%u9650%u914D%u7F6E%uFF0C%u7EDF%u4E00%u4F7F%u7528www%u7528%u6237%u3002%22%2C%22BTN1%22%3A%22%u6DFB%u52A0%u7AD9%u70B9%22%2C%22BTN2%22%3A%22%u4FEE%u6539%u9ED8%u8BA4%u9875%22%2C%22BTN3%22%3A%22%u9ED8%u8BA4%u7AD9%u70B9%22%2C%22BTN4%22%3A%22%u5220%u9664%u9009%u4E2D%22%2C%22BTN5%22%3A%22%u5206%u7C7B%u7BA1%u7406%22%2C%22TH1%22%3A%22%u57DF%u540D%22%2C%22TH2%22%3A%22%u7F51%u7AD9%u72B6%u6001%22%2C%22TH3%22%3A%22%u5907%u4EFD%22%2C%22TH4%22%3A%22%u7F51%u7AD9%u76EE%u5F55%22%2C%22TH5%22%3A%22%u5230%u671F%u65E5%u671F%22%2C%22TH6%22%3A%22%u5907%u6CE8%22%2C%22TH7%22%3A%22%u64CD%u4F5C%22%2C%22JS1%22%3A%22%u8BF7%u5148%u5B89%u88C5Web%u670D%u52A1%u5668%21%22%2C%22JS2%22%3A%22%u53BB%u5B89%u88C5%22%7D%7D\"], \"Referer\": [\"http://127.0.0.1:8001/\"], \"Sec-Ch-Ua\": [\"\\\";Not A Brand\\\";v=\\\"99\\\", \\\"Chromium\\\";v=\\\"94\\\"\"], \"Connection\": [\"close\"], \"User-Agent\": [\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400\"], \"Authorization\": [\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAzLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzU0MjA2MzUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJsYXN0SXAiOiIxMjcuMC4wLjEiLCJsYXN0VGltZSI6MTY3NDU1NjUxNCwibW9iaWxlIjoiMTUzMDM4MzA1NzEiLCJwaWQiOjAsInJlYWxOYW1lIjoi5a2f5biFIiwicm9sZUlkIjoxLCJyb2xlS2V5Ijoic3VwZXIiLCJ1c2VybmFtZSI6ImFkbWluIiwidmlzaXRDb3VudCI6NDEzfQ.QVzMnw5IUwdbZlzQM6oJYGTTVu5a7EfbrKEhpAgS0U8\"], \"Sec-Fetch-Dest\": [\"empty\"], \"Sec-Fetch-Mode\": [\"cors\"], \"Sec-Fetch-Site\": [\"same-origin\"], \"Accept-Encoding\": [\"gzip, deflate, br\"], \"Accept-Language\": [\"zh-CN,zh;q=0.9\"], \"Sec-Ch-Ua-Mobile\": [\"?0\"], \"Sec-Ch-Ua-Platform\": [\"\\\"Windows\\\"\"]}', '127.0.0.1', 0, 0, 0, '操作成功', '{}', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400', 1, 1674618373, 1, '2023-01-25 11:46:13', '2023-01-25 11:46:13'), -(3, '54cd67c389703d17746c306606f71ad6', 'admin', 0, 1, 'GET', 'admin', '/admin/role/dynamic', '{}', '{}', '{\"Accept\": [\"application/json, text/plain, */*\"], \"Cookie\": [\"order=id%20desc; ltd_end=-1; pro_end=-1; memSize=16297; db_page_model=mysql; backup_path=D%3A/backup; page_number=20; serverType=nginx; force=0; soft_remarks=%7B%22list%22%3A%5B%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90011%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u9001500%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F31.72%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4E13%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22ltd_list%22%3A%5B%22%u4F01%u4E1A%u7248%u63D2%u4EF6%22%2C%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90012%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u90011000%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F32.27%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4F01%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22kfqq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%2C%22qun%22%3A%221%22%2C%22kf_list%22%3A%5B%7B%22qq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%7D%2C%7B%22qq%22%3A%222927440070%22%2C%22kf%22%3A%22http%3A//wpa.qq.com/msgrd%3Fv%3D3%26uin%3D2927440070%26site%3Dqq%26menu%3Dyes%26from%3Dmessage%26isappinstalled%3D0%22%7D%5D%2C%22wx_list%22%3A%5B%7B%22ps%22%3A%22%u552E%u524D%u54A8%u8BE2%22%2C%22kf%22%3A%22https%3A//work.weixin.qq.com/kfid/kfc72fcbde93e26a6f3%22%7D%5D%7D; pnull=2; softType=5; bt_user_info=%7B%22status%22%3Atrue%2C%22msg%22%3A%22%u83B7%u53D6%u6210%u529F%21%22%2C%22data%22%3A%7B%22username%22%3A%22153****0571%22%7D%7D; site_model=php; sites_path=D%3A/wwwroot; request_token=EaNIwNYb7xvyGoKZjioBaG96r55N1g81g32m68nTmUzeOrLX; bt_config=%7B%22webserver%22%3A%22nginx%22%2C%22sites_path%22%3A%22D%3A/wwwroot%22%2C%22backup_path%22%3A%22D%3A/backup%22%2C%22status%22%3Atrue%2C%22mysql_root%22%3A%22123456%22%2C%22email%22%3A%22admin@qq.com%22%2C%22distribution%22%3A%22Windows%2010%20Pro%20%28build%2019044%29%20x64%20%28Py3.8.6%29%22%2C%22request_iptype%22%3A%22ipv6%22%2C%22request_type%22%3A%22python%22%2C%22php%22%3A%5B%7B%22setup%22%3Atrue%2C%22version%22%3A%2256%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%2C%7B%22setup%22%3Atrue%2C%22version%22%3A%2274%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%5D%2C%22mysql%22%3A%7B%22setup%22%3Atrue%2C%22status%22%3Atrue%2C%22version%22%3A%22MySQL5.7%22%7D%2C%22sqlserver%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22ftp%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22panel%22%3A%7B%22502%22%3A%22%22%2C%22port%22%3A%2218888%22%2C%22address%22%3A%2239.162.138.63%22%2C%22domain%22%3A%22%22%2C%22auto%22%3A%22%22%2C%22limitip%22%3A%22%22%2C%22templates%22%3A%5B%5D%2C%22template%22%3A%22default%22%2C%22admin_path%22%3A%22/radius%22%7D%2C%22systemdate%22%3A%222023-01-21%2022%3A11%3A30%22%2C%22show_workorder%22%3Afalse%2C%22isSetup%22%3Atrue%2C%22lan%22%3A%7B%22H1%22%3A%22%u9996%u9875%22%2C%22H2%22%3A%22%u7F51%u7AD9%u7BA1%u7406%22%2C%22SEARCH%22%3A%22%u7F51%u7AD9%u641C%u7D22%22%2C%22PS%22%3A%22%u4F7F%u7528%u5B9D%u5854Windows%u9762%u677F%u521B%u5EFA%u7AD9%u70B9%u65F6%u4F1A%u81EA%u52A8%u521B%u5EFA%u6743%u9650%u914D%u7F6E%uFF0C%u7EDF%u4E00%u4F7F%u7528www%u7528%u6237%u3002%22%2C%22BTN1%22%3A%22%u6DFB%u52A0%u7AD9%u70B9%22%2C%22BTN2%22%3A%22%u4FEE%u6539%u9ED8%u8BA4%u9875%22%2C%22BTN3%22%3A%22%u9ED8%u8BA4%u7AD9%u70B9%22%2C%22BTN4%22%3A%22%u5220%u9664%u9009%u4E2D%22%2C%22BTN5%22%3A%22%u5206%u7C7B%u7BA1%u7406%22%2C%22TH1%22%3A%22%u57DF%u540D%22%2C%22TH2%22%3A%22%u7F51%u7AD9%u72B6%u6001%22%2C%22TH3%22%3A%22%u5907%u4EFD%22%2C%22TH4%22%3A%22%u7F51%u7AD9%u76EE%u5F55%22%2C%22TH5%22%3A%22%u5230%u671F%u65E5%u671F%22%2C%22TH6%22%3A%22%u5907%u6CE8%22%2C%22TH7%22%3A%22%u64CD%u4F5C%22%2C%22JS1%22%3A%22%u8BF7%u5148%u5B89%u88C5Web%u670D%u52A1%u5668%21%22%2C%22JS2%22%3A%22%u53BB%u5B89%u88C5%22%7D%7D\"], \"Referer\": [\"http://127.0.0.1:8001/\"], \"Sec-Ch-Ua\": [\"\\\";Not A Brand\\\";v=\\\"99\\\", \\\"Chromium\\\";v=\\\"94\\\"\"], \"Connection\": [\"close\"], \"User-Agent\": [\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400\"], \"Authorization\": [\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAzLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzU0MjA2MzUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJsYXN0SXAiOiIxMjcuMC4wLjEiLCJsYXN0VGltZSI6MTY3NDU1NjUxNCwibW9iaWxlIjoiMTUzMDM4MzA1NzEiLCJwaWQiOjAsInJlYWxOYW1lIjoi5a2f5biFIiwicm9sZUlkIjoxLCJyb2xlS2V5Ijoic3VwZXIiLCJ1c2VybmFtZSI6ImFkbWluIiwidmlzaXRDb3VudCI6NDEzfQ.QVzMnw5IUwdbZlzQM6oJYGTTVu5a7EfbrKEhpAgS0U8\"], \"Sec-Fetch-Dest\": [\"empty\"], \"Sec-Fetch-Mode\": [\"cors\"], \"Sec-Fetch-Site\": [\"same-origin\"], \"Accept-Encoding\": [\"gzip, deflate, br\"], \"Accept-Language\": [\"zh-CN,zh;q=0.9\"], \"Sec-Ch-Ua-Mobile\": [\"?0\"], \"Sec-Ch-Ua-Platform\": [\"\\\"Windows\\\"\"]}', '127.0.0.1', 0, 0, 0, '操作成功', '{}', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400', 10, 1674618373, 1, '2023-01-25 11:46:13', '2023-01-25 11:46:13'), -(4, '68a576e189703d17766c306693d1e257', 'admin', 0, 1, 'GET', 'admin', '/admin/dept/list', '{}', '{}', '{\"Accept\": [\"application/json, text/plain, */*\"], \"Cookie\": [\"order=id%20desc; ltd_end=-1; pro_end=-1; memSize=16297; db_page_model=mysql; backup_path=D%3A/backup; page_number=20; serverType=nginx; force=0; soft_remarks=%7B%22list%22%3A%5B%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90011%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u9001500%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F31.72%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4E13%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22ltd_list%22%3A%5B%22%u4F01%u4E1A%u7248%u63D2%u4EF6%22%2C%22%u4E13%u4E1A%u7248%u63D2%u4EF6%22%2C%2215%u5929%u65E0%u7406%u7531%u9000%u6B3E%22%2C%22%u53EF%u66F4%u6362IP%22%2C%22%u5E74%u4ED8%u90012%u5F20%u5546%u7528%u8BC1%u4E66%22%2C%22%u5E74%u4ED8%u90011000%u6761%u77ED%u4FE1%22%2C%22%u4F4E%u81F32.27%u5143/%u5929%22%2C%22%u5546%u7528%u9632%u706B%u5899%u6388%u6743%22%2C%22%u5E74%u4ED8%u53EF%u5165%u4F01%u4E1A%u670D%u52A1%u7FA4%22%2C%22%u4EA7%u54C1%u6388%u6743%u8BC1%u4E66%22%5D%2C%22kfqq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%2C%22qun%22%3A%221%22%2C%22kf_list%22%3A%5B%7B%22qq%22%3A%223007255432%22%2C%22kf%22%3A%22http%3A//q.url.cn/CDfQPS%3F_type%3Dwpa%26qidian%3Dtrue%22%7D%2C%7B%22qq%22%3A%222927440070%22%2C%22kf%22%3A%22http%3A//wpa.qq.com/msgrd%3Fv%3D3%26uin%3D2927440070%26site%3Dqq%26menu%3Dyes%26from%3Dmessage%26isappinstalled%3D0%22%7D%5D%2C%22wx_list%22%3A%5B%7B%22ps%22%3A%22%u552E%u524D%u54A8%u8BE2%22%2C%22kf%22%3A%22https%3A//work.weixin.qq.com/kfid/kfc72fcbde93e26a6f3%22%7D%5D%7D; pnull=2; softType=5; bt_user_info=%7B%22status%22%3Atrue%2C%22msg%22%3A%22%u83B7%u53D6%u6210%u529F%21%22%2C%22data%22%3A%7B%22username%22%3A%22153****0571%22%7D%7D; site_model=php; sites_path=D%3A/wwwroot; request_token=EaNIwNYb7xvyGoKZjioBaG96r55N1g81g32m68nTmUzeOrLX; bt_config=%7B%22webserver%22%3A%22nginx%22%2C%22sites_path%22%3A%22D%3A/wwwroot%22%2C%22backup_path%22%3A%22D%3A/backup%22%2C%22status%22%3Atrue%2C%22mysql_root%22%3A%22123456%22%2C%22email%22%3A%22admin@qq.com%22%2C%22distribution%22%3A%22Windows%2010%20Pro%20%28build%2019044%29%20x64%20%28Py3.8.6%29%22%2C%22request_iptype%22%3A%22ipv6%22%2C%22request_type%22%3A%22python%22%2C%22php%22%3A%5B%7B%22setup%22%3Atrue%2C%22version%22%3A%2256%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%2C%7B%22setup%22%3Atrue%2C%22version%22%3A%2274%22%2C%22max%22%3A%2250%22%2C%22maxTime%22%3A0%2C%22pathinfo%22%3Atrue%2C%22status%22%3Atrue%7D%5D%2C%22mysql%22%3A%7B%22setup%22%3Atrue%2C%22status%22%3Atrue%2C%22version%22%3A%22MySQL5.7%22%7D%2C%22sqlserver%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22ftp%22%3A%7B%22setup%22%3Afalse%2C%22status%22%3Afalse%2C%22version%22%3A%22%22%7D%2C%22panel%22%3A%7B%22502%22%3A%22%22%2C%22port%22%3A%2218888%22%2C%22address%22%3A%2239.162.138.63%22%2C%22domain%22%3A%22%22%2C%22auto%22%3A%22%22%2C%22limitip%22%3A%22%22%2C%22templates%22%3A%5B%5D%2C%22template%22%3A%22default%22%2C%22admin_path%22%3A%22/radius%22%7D%2C%22systemdate%22%3A%222023-01-21%2022%3A11%3A30%22%2C%22show_workorder%22%3Afalse%2C%22isSetup%22%3Atrue%2C%22lan%22%3A%7B%22H1%22%3A%22%u9996%u9875%22%2C%22H2%22%3A%22%u7F51%u7AD9%u7BA1%u7406%22%2C%22SEARCH%22%3A%22%u7F51%u7AD9%u641C%u7D22%22%2C%22PS%22%3A%22%u4F7F%u7528%u5B9D%u5854Windows%u9762%u677F%u521B%u5EFA%u7AD9%u70B9%u65F6%u4F1A%u81EA%u52A8%u521B%u5EFA%u6743%u9650%u914D%u7F6E%uFF0C%u7EDF%u4E00%u4F7F%u7528www%u7528%u6237%u3002%22%2C%22BTN1%22%3A%22%u6DFB%u52A0%u7AD9%u70B9%22%2C%22BTN2%22%3A%22%u4FEE%u6539%u9ED8%u8BA4%u9875%22%2C%22BTN3%22%3A%22%u9ED8%u8BA4%u7AD9%u70B9%22%2C%22BTN4%22%3A%22%u5220%u9664%u9009%u4E2D%22%2C%22BTN5%22%3A%22%u5206%u7C7B%u7BA1%u7406%22%2C%22TH1%22%3A%22%u57DF%u540D%22%2C%22TH2%22%3A%22%u7F51%u7AD9%u72B6%u6001%22%2C%22TH3%22%3A%22%u5907%u4EFD%22%2C%22TH4%22%3A%22%u7F51%u7AD9%u76EE%u5F55%22%2C%22TH5%22%3A%22%u5230%u671F%u65E5%u671F%22%2C%22TH6%22%3A%22%u5907%u6CE8%22%2C%22TH7%22%3A%22%u64CD%u4F5C%22%2C%22JS1%22%3A%22%u8BF7%u5148%u5B89%u88C5Web%u670D%u52A1%u5668%21%22%2C%22JS2%22%3A%22%u53BB%u5B89%u88C5%22%7D%7D\"], \"Referer\": [\"http://127.0.0.1:8001/\"], \"Sec-Ch-Ua\": [\"\\\";Not A Brand\\\";v=\\\"99\\\", \\\"Chromium\\\";v=\\\"94\\\"\"], \"Connection\": [\"close\"], \"User-Agent\": [\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400\"], \"Authorization\": [\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAzLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzU0MjA2MzUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJsYXN0SXAiOiIxMjcuMC4wLjEiLCJsYXN0VGltZSI6MTY3NDU1NjUxNCwibW9iaWxlIjoiMTUzMDM4MzA1NzEiLCJwaWQiOjAsInJlYWxOYW1lIjoi5a2f5biFIiwicm9sZUlkIjoxLCJyb2xlS2V5Ijoic3VwZXIiLCJ1c2VybmFtZSI6ImFkbWluIiwidmlzaXRDb3VudCI6NDEzfQ.QVzMnw5IUwdbZlzQM6oJYGTTVu5a7EfbrKEhpAgS0U8\"], \"Sec-Fetch-Dest\": [\"empty\"], \"Sec-Fetch-Mode\": [\"cors\"], \"Sec-Fetch-Site\": [\"same-origin\"], \"Accept-Encoding\": [\"gzip, deflate, br\"], \"Accept-Language\": [\"zh-CN,zh;q=0.9\"], \"Sec-Ch-Ua-Mobile\": [\"?0\"], \"Sec-Ch-Ua-Platform\": [\"\\\"Windows\\\"\"]}', '127.0.0.1', 0, 0, 0, '操作成功', '{}', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.190.400 QQBrowser/11.5.5240.400', 3, 1674618373, 1, '2023-01-25 11:46:14', '2023-01-25 11:46:14'); - -- -------------------------------------------------------- -- @@ -962,6 +1222,7 @@ CREATE TABLE `hg_sys_login_log` ( `username` varchar(64) DEFAULT NULL COMMENT '用户名', `response` json DEFAULT NULL COMMENT '响应数据', `login_at` datetime DEFAULT NULL COMMENT '登录时间', + `login_ip` varchar(64) DEFAULT NULL COMMENT '登录IP', `err_msg` varchar(1000) DEFAULT NULL COMMENT '错误提示', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态', `created_at` datetime DEFAULT NULL COMMENT '创建时间', @@ -972,10 +1233,20 @@ CREATE TABLE `hg_sys_login_log` ( -- 转存表中的数据 `hg_sys_login_log` -- -INSERT INTO `hg_sys_login_log` (`id`, `req_id`, `member_id`, `username`, `response`, `login_at`, `err_msg`, `status`, `created_at`, `updated_at`) VALUES -(28, 'f0a3a95463383d17fb8e341dfc2edc73', 1, 'admin', '{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAzLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzU0MjA2MzUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJsYXN0SXAiOiIxMjcuMC4wLjEiLCJsYXN0VGltZSI6MTY3NDU1NjUxNCwibW9iaWxlIjoiMTUzMDM4MzA1NzEiLCJwaWQiOjAsInJlYWxOYW1lIjoi5a2f5biFIiwicm9sZUlkIjoxLCJyb2xlS2V5Ijoic3VwZXIiLCJ1c2VybmFtZSI6ImFkbWluIiwidmlzaXRDb3VudCI6NDEzfQ.QVzMnw5IUwdbZlzQM6oJYGTTVu5a7EfbrKEhpAgS0U8\", \"avatar\": \"http://alioss.qvnidaye.com//images/2021/03/12/image_1615529198_vMK4kwq2.jpg\", \"userId\": 1, \"realName\": \"孟帅\", \"username\": \"admin\", \"permissions\": null}', '2023-01-24 18:37:15', '', 1, '2023-01-24 18:37:16', '2023-01-24 18:37:16'), -(29, '4066612664693d176c19df314997a857', 0, 'ameng', '{}', '2023-01-25 09:35:15', '用户密码不正确', 2, '2023-01-25 09:35:15', '2023-01-25 09:35:15'), -(30, 'cce2c34b65693d176e19df31baa00f89', 7, 'ameng', '{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NTQ3NDUyMCwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6NywiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsImxhc3RJcCI6IjEyNy4wLjAuMSIsImxhc3RUaW1lIjoxNjczNDM4MDU1LCJtb2JpbGUiOiIiLCJwaWQiOjEsInJlYWxOYW1lIjoi6Zi_6JCMIiwicm9sZUlkIjoyLCJyb2xlS2V5Ijoibm9ybSIsInVzZXJuYW1lIjoiYW1lbmciLCJ2aXNpdENvdW50Ijo1fQ.cy8myHfhakfDR_Ml3UsxbxfLxN1jBXR3IKO_outxuN8\", \"avatar\": \"\", \"userId\": 7, \"realName\": \"阿萌\", \"username\": \"ameng\", \"permissions\": null}', '2023-01-25 09:35:20', '', 1, '2023-01-25 09:35:20', '2023-01-25 09:35:20'); +INSERT INTO `hg_sys_login_log` (`id`, `req_id`, `member_id`, `username`, `response`, `login_at`, `login_ip`, `err_msg`, `status`, `created_at`, `updated_at`) VALUES +(1, '042fbd3f8737401777de8e163a78d897', 1, 'admin', '{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAwLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzYyNjQxMTUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJtb2JpbGUiOiIxNTMwMzgzMDU3MSIsInBpZCI6MCwicmVhbE5hbWUiOiLlrZ_luIUiLCJyb2xlSWQiOjEsInJvbGVLZXkiOiJzdXBlciIsInVzZXJuYW1lIjoiYWRtaW4ifQ.DjKeoj6YPiIgX1C7I7pH7Ok3gs2SOqn8qq_Fr4jzH7s\", \"userId\": 1, \"expires\": 864000}', '2023-02-03 12:55:15', '127.0.0.1', '', 1, '2023-02-03 12:55:15', '2023-02-03 12:55:15'), +(2, '042fbd3f8737401777de8e163a78d897', 1, 'admin', '{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9hbGlvc3MucXZuaWRheWUuY29tLy9pbWFnZXMvMjAyMS8wMy8xMi9pbWFnZV8xNjE1NTI5MTk4X3ZNSzRrd3EyLmpwZyIsImRlcHRJZCI6MTAwLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzYyNjQxMTUsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJtb2JpbGUiOiIxNTMwMzgzMDU3MSIsInBpZCI6MCwicmVhbE5hbWUiOiLlrZ_luIUiLCJyb2xlSWQiOjEsInJvbGVLZXkiOiJzdXBlciIsInVzZXJuYW1lIjoiYWRtaW4ifQ.DjKeoj6YPiIgX1C7I7pH7Ok3gs2SOqn8qq_Fr4jzH7s\", \"userId\": 1, \"expires\": 864000}', '2023-02-03 12:55:15', '127.0.0.1', '', 1, '2023-02-03 12:55:15', '2023-02-03 12:55:15'), +(3, '3006dc23c74640175cc795780651d214', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MDg4MiwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.m01fkGVAeVpGx9PhuClqkpRNqfpUv60AA6--GPJdVmw\", \"expires\": 864000}', '2023-02-03 17:34:42', '127.0.0.1', '', 1, '2023-02-03 17:34:42', '2023-02-03 17:34:42'), +(4, 'dcd073ae004740177ec79578d514bbcb', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTEyOSwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.hg5cp1Wz-ne4-DtmDfpb5K79UXXTm-r_YkJCYp5tpCs\", \"expires\": 864000}', '2023-02-03 17:38:49', '127.0.0.1', '', 1, '2023-02-03 17:38:50', '2023-02-03 17:38:50'), +(5, '043abc820247401793c7957812a31c5d', 0, 'ameng', '{}', '2023-02-03 17:38:57', '127.0.0.1', '验证码错误', 2, '2023-02-03 17:38:57', '2023-02-03 17:38:57'), +(6, '0caaff700347401795c79578ac8efe1d', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTE0MSwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.Ppf00Ds5bbII3NOwsgG5ODU9Y4qCvd9ibI5UbRHYF-8\", \"expires\": 864000}', '2023-02-03 17:39:01', '127.0.0.1', '', 1, '2023-02-03 17:39:01', '2023-02-03 17:39:01'), +(7, 'e05c131416474017aac7957838c4db02', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTIyMSwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.AyYaG0CHKH3psSx9mOtgiYrpiN_G0G6Gw405l9vgTF8\", \"expires\": 864000}', '2023-02-03 17:40:21', '127.0.0.1', '', 1, '2023-02-03 17:40:22', '2023-02-03 17:40:22'), +(8, '3421335123474017ccc7957826136279', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTI3OCwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.U02fNrhCkLVvl5N6311nIWnhKQEPs5-8ba7jj6Em1L8\", \"expires\": 864000}', '2023-02-03 17:41:18', '127.0.0.1', '', 1, '2023-02-03 17:41:18', '2023-02-03 17:41:18'), +(9, 'bc938ea839474017efc7957896b8b2c2', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTM3NCwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.0xLK5R9RQNm0UuRCajhhA-Iv-3mjRZZ32agdZ8IDRFw\", \"expires\": 864000}', '2023-02-03 17:42:54', '127.0.0.1', '', 1, '2023-02-03 17:42:54', '2023-02-03 17:42:54'), +(10, '5cc1b15c3f4740171bc8957806650305', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTM5OCwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.MPODl3s9VbcffiO9_RVLUgwDmcAnMXwt6ZFUI-qJy0A\", \"expires\": 864000}', '2023-02-03 17:43:18', '127.0.0.1', '', 1, '2023-02-03 17:43:19', '2023-02-03 17:43:19'), +(11, '90be73d99747401798c89578cc79f410', 8, 'ameng', '{\"id\": 8, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6IiIsImRlcHRJZCI6MTA1LCJlbWFpbCI6IiIsImV4cCI6MTY3NjI4MTc3OCwiZXhwaXJlcyI6ODY0MDAwLCJpZCI6OCwiaXNSZWZyZXNoIjpmYWxzZSwiand0VmVyc2lvbiI6IjEuMCIsIm1vYmlsZSI6IiIsInBpZCI6MSwicmVhbE5hbWUiOiJhbWVuZyIsInJvbGVJZCI6MjA2LCJyb2xlS2V5IjoiZmluYW5jZSIsInVzZXJuYW1lIjoiYW1lbmcifQ.qfWNllzEjZOSomccDyNf4ArE4kaWtqoLb_VPJDi6pwg\", \"expires\": 864000}', '2023-02-03 17:49:38', '127.0.0.1', '', 1, '2023-02-03 17:49:39', '2023-02-03 17:49:39'), +(12, '9c37b9f0bc4f4017b14f7d7a36dded04', 1, 'admin', '{\"id\": 1, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9hdHRhY2htZW50LzIwMjMtMDEtMTgvY3B2NmZtcW13ZnE4em9iY3R6LnBuZyIsImRlcHRJZCI6MTAwLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzYyOTA3MzQsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJtb2JpbGUiOiIxNTMwMzgzMDU3MSIsInBpZCI6MCwicmVhbE5hbWUiOiLlrZ_luIUiLCJyb2xlSWQiOjEsInJvbGVLZXkiOiJzdXBlciIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zZo2eqWyLgbZk6N8Wwalp2Ny4iC7T9HpokoHDSmTO2s\", \"expires\": 864000}', '2023-02-03 20:18:54', '127.0.0.1', '', 1, '2023-02-03 20:18:54', '2023-02-03 20:18:54'), +(13, '805c6a42c04f4017bc4f7d7ae1d97baa', 1, 'admin', '{\"id\": 1, \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJhZG1pbiIsImF2YXRhciI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9hdHRhY2htZW50LzIwMjMtMDEtMTgvY3B2NmZtcW13ZnE4em9iY3R6LnBuZyIsImRlcHRJZCI6MTAwLCJlbWFpbCI6IjEzMzgxNDI1MEBxcS5jb20iLCJleHAiOjE2NzYyOTA3NDgsImV4cGlyZXMiOjg2NDAwMCwiaWQiOjEsImlzUmVmcmVzaCI6ZmFsc2UsImp3dFZlcnNpb24iOiIxLjAiLCJtb2JpbGUiOiIxNTMwMzgzMDU3MSIsInBpZCI6MCwicmVhbE5hbWUiOiLlrZ_luIUiLCJyb2xlSWQiOjEsInJvbGVLZXkiOiJzdXBlciIsInVzZXJuYW1lIjoiYWRtaW4ifQ.NsDVdk8Jp40-mfvkuG6X-rF6otprv58tJVc6eatOUV4\", \"expires\": 864000}', '2023-02-03 20:19:08', '127.0.0.1', '', 1, '2023-02-03 20:19:08', '2023-02-03 20:19:08'); -- -------------------------------------------------------- @@ -4710,6 +4981,121 @@ CREATE TABLE `hg_sys_serve_log` ( `updated_at` datetime DEFAULT NULL COMMENT '修改时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统_服务日志'; +-- +-- 转存表中的数据 `hg_sys_serve_log` +-- + +INSERT INTO `hg_sys_serve_log` (`id`, `trace_id`, `level_format`, `content`, `stack`, `line`, `trigger_ns`, `status`, `created_at`, `updated_at`) VALUES +(1, 'b880bbcd6bdc3d17b227ae52957e26db', 'WARN', 'exception:sql执行异常: Error 3140: Invalid JSON text: \"The document is empty.\" at position 0 in value for column \'hg_admin_notice.receiver\'., INSERT INTO `hg_admin_notice`(`updated_at`,`title`,`type`,`tag`,`read_count`,`created_at`,`deleted_at`,`id`,`created_by`,`updated_by`,`receiver`,`remark`,`content`,`status`,`sort`) VALUES(\'2023-01-26 20:43:12\',\'1\',1,2,0,\'2023-01-26 20:43:12\',null,0,0,0,\'\',\'\',\'\',1,0) ', '[\"\"]', 'response.go:45:', 1674736992054118800, 1, '2023-01-26 20:43:12', '2023-01-26 20:43:12'), +(2, 'f85ceaee90e13d17c6d2942d15c57870', 'WARN', 'exception:convert params from \"&member.SelectReq{Meta:gmeta.Meta{}}\" to \"map[string]interface{}\" failed', '[\"\"]', 'response.go:45:', 1674742649052566800, 1, '2023-01-26 22:17:29', '2023-01-26 22:17:29'), +(3, 'd828c85091e13d17c7d2942d1f1f75a6', 'WARN', 'exception:convert params from \"&member.SelectReq{Meta:gmeta.Meta{}}\" to \"map[string]interface{}\" failed', '[\"\"]', 'response.go:45:', 1674742650697485500, 1, '2023-01-26 22:17:30', '2023-01-26 22:17:30'), +(4, 'b0627d36e1e43d17cf94f10eda5e5828', 'WARN', 'exception:sql执行异常: Error 3140: Invalid JSON text: \"The document is empty.\" at position 0 in value for column \'hg_admin_notice.receiver\'., INSERT INTO `hg_admin_notice`(`content`,`created_at`,`updated_at`,`type`,`updated_by`,`receiver`,`sort`,`tag`,`remark`,`created_by`,`read_count`,`status`,`id`,`title`,`deleted_at`) VALUES(\'

!测试公告测试公告测试公告测试公告测试公告测试公告!

\',\'2023-01-26 23:18:12\',\'2023-01-26 23:18:12\',2,0,\'\',10,2,\'\',0,0,1,0,\'测试公告\',null) ', '[\"\"]', 'response.go:45:', 1674746292411472500, 1, '2023-01-26 23:18:12', '2023-01-26 23:18:12'), +(5, 'b4da5febac5f3e1765cd2e3b2b5d9d44', 'WARN', 'exception:账号不存在', '[\"\"]', 'response.go:45:', 1674881307722581900, 1, '2023-01-28 12:48:28', '2023-01-28 12:48:28'), +(6, 'f4ea7703af5f3e1767cd2e3b8fff5f25', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674881316716101900, 1, '2023-01-28 12:48:37', '2023-01-28 12:48:37'), +(7, '844af283b05f3e1769cd2e3befadc30a', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674881323163958400, 1, '2023-01-28 12:48:43', '2023-01-28 12:48:43'), +(8, '04e0e54bb25f3e176bcd2e3b5cf4e53d', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674881330818750900, 1, '2023-01-28 12:48:51', '2023-01-28 12:48:51'), +(9, '64f1270a79633e176dcd2e3bfa1a9e67', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674885482949171700, 1, '2023-01-28 13:58:04', '2023-01-28 13:58:04'), +(10, 'd08376ec7b633e1771cd2e3bf52e3cf3', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674885495335734900, 1, '2023-01-28 13:58:15', '2023-01-28 13:58:15'), +(11, '489878f87c633e1773cd2e3bbd684e2d', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674885499828356600, 1, '2023-01-28 13:58:20', '2023-01-28 13:58:20'), +(12, '00cc19a07f633e1775cd2e3bc4d931b4', 'WARN', 'exception:验证码错误', '[\"\"]', 'response.go:45:', 1674885511228137000, 1, '2023-01-28 13:58:31', '2023-01-28 13:58:31'), +(13, '3c44815680633e1777cd2e3b2f6999a8', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1674885514292660700, 1, '2023-01-28 13:58:34', '2023-01-28 13:58:34'), +(14, 'd49755012e093f176f236c1cedcc873b', 'WARN', 'exception:ID不能为空', '[\"\"]', 'response.go:45:', 1675067679601184900, 1, '2023-01-30 16:34:39', '2023-01-30 16:34:39'), +(15, '84a2dfaa9b0c3f17045aaa2b3bcd4bca', 'WARN', 'exception:私信类型必须选择接收人', '[\"\"]', 'response.go:45:', 1675071449132420000, 1, '2023-01-30 17:37:29', '2023-01-30 17:37:29'), +(16, '70ae5b87c6133f17bf61584a8ca848ae', 'WARN', 'exception:sql执行异常: sql: expected 3 arguments, got 4, SELECT COUNT(1) FROM `hg_admin_notice` WHERE ((`type` IN(1,2) OR (`type` = 3 and JSON_CONTAINS(`receiver`,\'1\')))) AND `deleted_at` IS NULL', '[\"\"]', 'response.go:45:', 1675079329891890400, 1, '2023-01-30 19:48:49', '2023-01-30 19:48:49'), +(17, 'dc73cdbfe0133f170dae6563872bc43e', 'WARN', 'exception:sql执行异常: Error 1054 (42S22): Unknown column \'?\' in \'where clause\', SELECT COUNT(1) FROM `hg_admin_notice` WHERE ((`type` IN(1,2) OR (`type` = 3 and JSON_CONTAINS(`receiver`,`1`)))) AND `deleted_at` IS NULL', '[\"\"]', 'response.go:45:', 1675079442614513700, 1, '2023-01-30 19:50:42', '2023-01-30 19:50:42'), +(18, 'cc11de79eb643f17e8486a2b876e0277', 'WARN', 'exception:convert params from \"¬ice.PullMessagesReq{Meta:gmeta.Meta{}, PullMessagesInp:adminin.PullMessagesInp{}}\" to \"map[string]interface{}\" failed', '[\"\"]', 'response.go:45:', 1675168548930893200, 1, '2023-01-31 20:35:49', '2023-01-31 20:35:49'), +(19, '0c4e7fbcbb9d3f17da643971d1986565', 'WARN', 'exception:用户密码不正确', '[\"\"]', 'response.go:45:', 1675231016102176400, 1, '2023-02-01 13:56:56', '2023-02-01 13:56:56'), +(20, '24bb31d4bc9d3f17e1643971e815c886', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231020751377000, 1, '2023-02-01 13:57:00', '2023-02-01 13:57:00'), +(21, 'dca9681ef99d3f17e764397103c695a5', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231279700570100, 1, '2023-02-01 14:01:19', '2023-02-01 14:01:19'), +(22, '747bed090b9e3f17e86439718122152e', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231356656046900, 1, '2023-02-01 14:02:36', '2023-02-01 14:02:36'), +(23, '8c5886120b9e3f17e9643971494f5adf', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231356799430100, 1, '2023-02-01 14:02:36', '2023-02-01 14:02:36'), +(24, 'bc9fe581109e3f17ea64397168657dcb', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231380144749900, 1, '2023-02-01 14:03:00', '2023-02-01 14:03:00'), +(25, '08200f87109e3f17eb6439719e3f417c', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231380268681900, 1, '2023-02-01 14:03:00', '2023-02-01 14:03:00'), +(26, 'b8b21cf8179e3f17ec6439716e93dccc', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675231412190327400, 1, '2023-02-01 14:03:32', '2023-02-01 14:03:32'), +(27, 'd877081f5fa03f1728c9581e14d5bdbf', 'WARN', 'exception:Error 1054 (42S22): Unknown column \'n.type\' in \'where clause\', SELECT `id` FROM `hg_admin_notice` WHERE (n.type =2 and n.id IN(10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28)) AND `deleted_at` IS NULL', '[\"\"]', 'response.go:45:', 1675233916821990800, 1, '2023-02-01 14:45:17', '2023-02-01 14:45:17'), +(28, '4cfcefb83ba93f1706b82275cfd94643', 'WARN', 'exception:公告ID不能为空', '[\"\"]', 'response.go:45:', 1675243660379684600, 1, '2023-02-01 17:27:40', '2023-02-01 17:27:40'), +(29, '88c921bf3ba93f1707b8227587337f72', 'WARN', 'exception:公告ID不能为空', '[\"\"]', 'response.go:45:', 1675243660488728900, 1, '2023-02-01 17:27:40', '2023-02-01 17:27:40'), +(30, 'd444fdcb45a93f1713b82275f844255d', 'WARN', 'exception:公告ID不能为空', '[\"\"]', 'response.go:45:', 1675243703655398300, 1, '2023-02-01 17:28:23', '2023-02-01 17:28:23'), +(31, 'd470a05448a93f1726b82275be2e3b4e', 'WARN', 'exception:公告ID不能为空', '[\"\"]', 'response.go:45:', 1675243714528876800, 1, '2023-02-01 17:28:34', '2023-02-01 17:28:34'), +(32, 'a8d4d55c61b13f173668c469d494884c', 'WARN', 'exception:公告不存在', '[\"\"]', 'response.go:45:', 1675252618141161000, 1, '2023-02-01 19:56:58', '2023-02-01 19:56:58'), +(33, '1c94d85c76b13f173768c46976d809b7', 'WARN', 'exception:公告不存在', '[\"\"]', 'response.go:45:', 1675252708342737200, 1, '2023-02-01 19:58:28', '2023-02-01 19:58:28'), +(34, '3495e7bae3ef3f17cc28152300438b89', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675321347803702000, 1, '2023-02-02 15:02:27', '2023-02-02 15:02:27'), +(35, 'b80fcfd3f3ef3f170a9dd811ce280d49', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675321416925766500, 1, '2023-02-02 15:03:36', '2023-02-02 15:03:36'), +(36, '909c623904f03f1768daa24f536b7e76', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675321487519809100, 1, '2023-02-02 15:04:47', '2023-02-02 15:04:47'), +(37, 'dca321f17af03f1741b9a928fe2d1803', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675321997328074800, 1, '2023-02-02 15:13:17', '2023-02-02 15:13:17'), +(38, 'dc2c60c782f03f17b577774f27d37068', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675322030918998800, 1, '2023-02-02 15:13:50', '2023-02-02 15:13:50'), +(39, '2c207db584f03f17b677774f2cbe166c', 'WARN', 'exception:unsupported value type for UnmarshalValue: *adminin.MemberLoginModel', '[\"\"]', 'response.go:45:', 1675322039203306700, 1, '2023-02-02 15:13:59', '2023-02-02 15:13:59'), +(40, 'dc05c9d492fa3f176f86673b62b3e5f2', 'WARN', 'exception:验证码错误', '[\"\"]', 'response.go:45:', 1675333095076489400, 1, '2023-02-02 18:18:15', '2023-02-02 18:18:15'), +(41, 'd410172158014017d920e200aaf44b6a', 'WARN', 'exception:sql执行异常: reflect.MakeSlice of non-slice type', '[\"\"]', 'response.go:45:', 1675340539509942000, 1, '2023-02-02 20:22:19', '2023-02-02 20:22:19'), +(42, '4c7ccee86d014017cbf7dd6b4c39d900', 'WARN', 'exception:sql执行异常: reflect.MakeSlice of non-slice type', '[\"\"]', 'response.go:45:', 1675340632960208700, 1, '2023-02-02 20:23:53', '2023-02-02 20:23:53'), +(43, '301252ee7e01401786667857cc8aa3c2', 'WARN', 'exception:sql执行异常: reflect.MakeSlice of non-slice type', '[\"\"]', 'response.go:45:', 1675340706065870300, 1, '2023-02-02 20:25:06', '2023-02-02 20:25:06'), +(44, '3c32c19d7f014017c4a0fa6244c58e54', 'WARN', 'exception:sql执行异常: reflect.MakeSlice of non-slice type', '[\"\"]', 'response.go:45:', 1675340709015605100, 1, '2023-02-02 20:25:09', '2023-02-02 20:25:09'), +(45, 'e4a5e24cb101401746c8067e37a0da35', 'PANI', 'exception:exception recovered: runtime error: invalid memory address or nil pointer dereference', '[\"\"]', 'response.go:45:', 1675340922435595700, 1, '2023-02-02 20:28:42', '2023-02-02 20:28:42'), +(46, '101fd75d183640179601762aa61559a9', 'WARN', 'exception:sql执行异常: Error 1054 (42S22): Unknown column \'province_id\' in \'field list\', SELECT `dept_id`,`role_id`,`username`,`real_name`,`avatar`,`balance`,`sex`,`qq`,`email`,`mobile`,`birthday`,`province_id`,`city_id`,`county_id`,`address`,`visit_count`,`last_time`,`last_ip`,`cash`,`created_at` FROM `hg_admin_member` WHERE `id`=1 LIMIT 1', '[\"\"]', 'response.go:45:', 1675398539702949800, 1, '2023-02-03 12:29:00', '2023-02-03 12:29:00'), +(47, 'fc23c578233640179d01762aa5209fe7', 'WARN', 'exception:sql执行异常: Error 1054 (42S22): Unknown column \'province_id\' in \'field list\', SELECT `dept_id`,`role_id`,`username`,`real_name`,`avatar`,`balance`,`sex`,`qq`,`email`,`mobile`,`birthday`,`province_id`,`city_id`,`county_id`,`address`,`visit_count`,`last_time`,`last_ip`,`cash`,`created_at` FROM `hg_admin_member` WHERE `id`=1 LIMIT 1', '[\"\"]', 'response.go:45:', 1675398587406262400, 1, '2023-02-03 12:29:47', '2023-02-03 12:29:47'), +(48, 'ecc17508e23a40172a88d54663e054af', 'WARN', 'exception:the region code is incorrectly configured, models:&{Id:0 Title:日照市 Pinyin: Lng: Lat: Pid:0 Level:2 Tree:tr_0 tr_370000 Sort:0 Status:0 CreatedAt: UpdatedAt:}', '[\"\"]', 'response.go:45:', 1675403803891027600, 1, '2023-02-03 13:56:44', '2023-02-03 13:56:44'), +(49, 'c867e2aefc3a4017e790c3759104b8ee', 'WARN', 'exception:the region code is incorrectly configured, models:&{Id:0 Title:日照市 Pinyin: Lng: Lat: Pid:0 Level:2 Tree:tr_0 tr_370000 Sort:0 Status:0 CreatedAt: UpdatedAt:}, ids:[370000]', '[\"\"]', 'response.go:45:', 1675403918366708500, 1, '2023-02-03 13:58:38', '2023-02-03 13:58:38'), +(50, 'b8cb1deda53c401726aa5158fd398459', 'PANI', 'exception:exception recovered: runtime error: invalid memory address or nil pointer dereference', '[\"\"]', 'response.go:45:', 1675405744737613800, 1, '2023-02-03 14:29:05', '2023-02-03 14:29:05'), +(51, '3c92b061573e40172f4ef176d30c921e', 'WARN', 'exception:sql执行异常: Error 1054 (42S22): Unknown column \'name\' in \'field list\', SELECT COUNT(name) FROM `hg_sys_login_log` WHERE (`member_id`=\'1\') AND (`status`=1)', '[\"\"]', 'response.go:45:', 1675407606458079700, 1, '2023-02-03 15:00:06', '2023-02-03 15:00:06'), +(52, '000e8848533f4017df54553e49ff1552', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675408688314536000, 1, '2023-02-03 15:18:08', '2023-02-03 15:18:08'), +(53, 'c4b31cbb124140174ddb2227e00aaf77', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675410610091296000, 1, '2023-02-03 15:50:10', '2023-02-03 15:50:10'), +(54, '0450ec99464140176bdb2227ea1becc8', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675410832868404600, 1, '2023-02-03 15:53:53', '2023-02-03 15:53:53'), +(55, '6c0f9902b941401791db22270d401f38', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:norm, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675411324250826900, 1, '2023-02-03 16:02:04', '2023-02-03 16:02:04'), +(56, 'f8700e4802464017b578dd0650b842c7', 'WARN', 'hook LastActive err:there should be WHERE condition statement for UPDATE operation\n1. there should be WHERE condition statement for UPDATE operation\n 1). github.com/gogf/gf/v2/database/gdb.(*Model).Update\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_update.go:81\n 2). hotgo/internal/logic/hook.(*sHook).LastActive\n E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/hook/last_active.go:70\n 3). github.com/gogf/gf/v2/net/ghttp.(*Server).niceCallHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:118\n 4). github.com/gogf/gf/v2/net/ghttp.(*Server).callHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:79\n 5). github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:199\n, memberId:7', '[\"\"]', 'last_active.go:72:', 1675416036999611900, 1, '2023-02-03 17:20:37', '2023-02-03 17:20:37'), +(57, '40a21f5902464017b678dd06da401715', 'WARN', 'hook LastActive err:there should be WHERE condition statement for UPDATE operation\n1. there should be WHERE condition statement for UPDATE operation\n 1). github.com/gogf/gf/v2/database/gdb.(*Model).Update\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_update.go:81\n 2). hotgo/internal/logic/hook.(*sHook).LastActive\n E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/hook/last_active.go:70\n 3). github.com/gogf/gf/v2/net/ghttp.(*Server).niceCallHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:118\n 4). github.com/gogf/gf/v2/net/ghttp.(*Server).callHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:79\n 5). github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:199\n, memberId:1', '[\"\"]', 'last_active.go:72:', 1675416037281488700, 1, '2023-02-03 17:20:37', '2023-02-03 17:20:37'), +(58, 'e4d7ee4b11464017a3581d48d6f75941', 'WARN', 'hook LastActive err:there should be WHERE condition statement for UPDATE operation\n1. there should be WHERE condition statement for UPDATE operation\n 1). github.com/gogf/gf/v2/database/gdb.(*Model).Update\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_update.go:81\n 2). hotgo/internal/logic/hook.(*sHook).LastActive\n E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/hook/last_active.go:71\n 3). github.com/gogf/gf/v2/net/ghttp.(*Server).niceCallHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:118\n 4). github.com/gogf/gf/v2/net/ghttp.(*Server).callHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:79\n 5). github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:199\n, memberId:7', '[\"\"]', 'last_active.go:73:', 1675416101488985400, 1, '2023-02-03 17:21:41', '2023-02-03 17:21:41'), +(59, 'f46a0b5511464017a4581d48792789c0', 'WARN', 'hook LastActive err:there should be WHERE condition statement for UPDATE operation\n1. there should be WHERE condition statement for UPDATE operation\n 1). github.com/gogf/gf/v2/database/gdb.(*Model).Update\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_update.go:81\n 2). hotgo/internal/logic/hook.(*sHook).LastActive\n E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/hook/last_active.go:71\n 3). github.com/gogf/gf/v2/net/ghttp.(*Server).niceCallHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:118\n 4). github.com/gogf/gf/v2/net/ghttp.(*Server).callHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:79\n 5). github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:199\n, memberId:1', '[\"\"]', 'last_active.go:73:', 1675416101637554900, 1, '2023-02-03 17:21:41', '2023-02-03 17:21:41'), +(60, '5087a9601746401749658e13fcd18baf', 'WARN', 'hook LastActive err:Error 1062 (23000): Duplicate entry \'0\' for key \'PRIMARY\', UPDATE `hg_admin_member` SET `avatar`=\'\',`email`=\'\',`level`=0,`auth_key`=\'\',`address`=\'\',`remark`=\'\',`password_reset_token`=\'\',`username`=\'\',`dept_id`=0,`created_at`=null,`role_id`=0,`city_id`=0,`sex`=0,`birthday`=null,`pid`=0,`cash`=,`password_hash`=\'\',`updated_at`=\'2023-02-03 17:22:07\',`id`=0,`real_name`=\'\',`balance`=0,`tree`=\'\',`status`=0,`salt`=\'\',`last_active_at`=\'2023-02-03 17:22:07\',`qq`=\'\',`mobile`=\'\' WHERE `id`=1\n1. Error 1062 (23000): Duplicate entry \'0\' for key \'PRIMARY\', UPDATE `hg_admin_member` SET `avatar`=\'\',`email`=\'\',`level`=0,`auth_key`=\'\',`address`=\'\',`remark`=\'\',`password_reset_token`=\'\',`username`=\'\',`dept_id`=0,`created_at`=null,`role_id`=0,`city_id`=0,`sex`=0,`birthday`=null,`pid`=0,`cash`=,`password_hash`=\'\',`updated_at`=\'2023-02-03 17:22:07\',`id`=0,`real_name`=\'\',`balance`=0,`tree`=\'\',`status`=0,`salt`=\'\',`last_active_at`=\'2023-02-03 17:22:07\',`qq`=\'\',`mobile`=\'\' WHERE `id`=1\n 1). github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_core_underlying.go:281\n 2). github.com/gogf/gf/v2/database/gdb.(*Core).DoExec\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_core_underlying.go:135\n 3). github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_core.go:600\n 4). github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_hook.go:138\n 5). github.com/gogf/gf/v2/database/gdb.(*Model).Update\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/database/gdb/gdb_model_update.go:97\n 6). hotgo/internal/logic/hook.(*sHook).LastActive\n E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/hook/last_active.go:71\n 7). github.com/gogf/gf/v2/net/ghttp.(*Server).niceCallHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:118\n 8). github.com/gogf/gf/v2/net/ghttp.(*Server).callHookHandler\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_router_hook.go:79\n 9). github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\n E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:199\n, memberId:1', '[\"\"]', 'last_active.go:73:', 1675416127625743500, 1, '2023-02-03 17:22:07', '2023-02-03 17:22:07'), +(61, 'f8c7fbaf414640178998d109213d0bf6', 'PANI', 'exception:exception recovered: runtime error: invalid memory address or nil pointer dereference', '[\"\"]', 'response.go:45:', 1675416309326966400, 1, '2023-02-03 17:25:09', '2023-02-03 17:25:09'), +(62, '0010386c5d464017e53049107dec698a', 'WARN', 'exception:用户不存在!', '[\"\"]', 'response.go:45:', 1675416428478097200, 1, '2023-02-03 17:27:08', '2023-02-03 17:27:08'), +(63, '043abc820247401793c7957812a31c5d', 'WARN', 'exception:验证码错误', '[\"\"]', 'response.go:45:', 1675417137493273200, 1, '2023-02-03 17:38:57', '2023-02-03 17:38:57'), +(64, 'bce2ce0f984740179cc8957820ee8f38', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675417779813229000, 1, '2023-02-03 17:49:40', '2023-02-03 17:49:40'), +(65, 'd09b48f4ad474017b6c8957841325417', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675417873836270900, 1, '2023-02-03 17:51:14', '2023-02-03 17:51:14'), +(66, '106b248419484017cd60f43322702311', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675418335811091100, 1, '2023-02-03 17:58:55', '2023-02-03 17:58:55'), +(67, '0850e0371d484017e760f4336543a391', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675418351711612400, 1, '2023-02-03 17:59:11', '2023-02-03 17:59:11'), +(68, 'a402b89a254840170161f433bd734f59', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675418387730403200, 1, '2023-02-03 17:59:47', '2023-02-03 17:59:47'), +(69, 'dc201d9e2a4840171b61f433df02b89e', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675418409261754800, 1, '2023-02-03 18:00:09', '2023-02-03 18:00:09'), +(70, '90a112a53a4840173661f433590cbdc7', 'WARN', 'AdminAuth fail path:/notice/pullMessages, GetRoleKey:finance, r.Method:GET', '[\"\"]', 'admin_auth.go:45:', 1675418478097588800, 1, '2023-02-03 18:01:18', '2023-02-03 18:01:18'), +(71, '646017ab5e4a4017594e7d7a7aff922c', 'WARN', 'exception:真实姓名不能为空', '[\"\"]', 'response.go:45:', 1675420831840738600, 1, '2023-02-03 18:40:32', '2023-02-03 18:40:32'), +(72, '2c9b7467604a40175e4e7d7a5d916074', 'WARN', 'exception:头像不能为空', '[\"\"]', 'response.go:45:', 1675420839295438200, 1, '2023-02-03 18:40:39', '2023-02-03 18:40:39'), +(73, 'c0d5dc71c28d4017456a0a7891635d18', 'WARN', 'exception:View.AddPath failed: path \"/resource/template/email/text.html\" should be directory type', '[\"\"]', 'response.go:45:', 1675494927669733300, 1, '2023-02-04 15:15:28', '2023-02-04 15:15:28'), +(74, '4cfbb413d38d4017486a0a78de2a078c', 'WARN', 'exception:View.AddPath failed: path \"./resource/template/email/text.html\" should be directory type', '[\"\"]', 'response.go:45:', 1675494999103992600, 1, '2023-02-04 15:16:39', '2023-02-04 15:16:39'), +(75, 'dcc44f84218f40171ca1877da64e6561', 'WARN', 'exception:SDKError:\n StatusCode: 400\n Code: MissingAccessKeyId\n Message: code: 400, AccessKeyId is mandatory for this action. request id: A1AA6A77-CBB9-5608-8999-3BAE4B454DDC\n Data: {\"Code\":\"MissingAccessKeyId\",\"HostId\":\"dysmsapi.aliyuncs.com\",\"Message\":\"AccessKeyId is mandatory for this action.\",\"Recommend\":\"https://next.api.aliyun.com/troubleshoot?q=MissingAccessKeyId\\u0026product=Dysmsapi\",\"RequestId\":\"A1AA6A77-CBB9-5608-8999-3BAE4B454DDC\",\"statusCode\":400}\n', '[\"\"]', 'response.go:45:', 1675496435613689300, 1, '2023-02-04 15:40:35', '2023-02-04 15:40:35'), +(76, '38f61e05329240173f4a38475354a335', 'WARN', 'exception:SDKError:\n StatusCode: 400\n Code: MissingAccessKeyId\n Message: code: 400, AccessKeyId is mandatory for this action. request id: 6131B2F7-7C09-5269-BBDC-AB35A0CFD003\n Data: {\"Code\":\"MissingAccessKeyId\",\"HostId\":\"dysmsapi.aliyuncs.com\",\"Message\":\"AccessKeyId is mandatory for this action.\",\"Recommend\":\"https://next.api.aliyun.com/troubleshoot?q=MissingAccessKeyId\\u0026product=Dysmsapi\",\"RequestId\":\"6131B2F7-7C09-5269-BBDC-AB35A0CFD003\",\"statusCode\":400}\n', '[\"\"]', 'response.go:45:', 1675499805045100700, 1, '2023-02-04 16:36:45', '2023-02-04 16:36:45'), +(77, 'f0e442b6469340172a66fe769b0b21a8', 'WARN', 'exception:验证码错误', '[\"\"]', 'response.go:45:', 1675500993303408500, 1, '2023-02-04 16:56:33', '2023-02-04 16:56:33'), +(78, '645ac165de9340172c8be96711ba5c9a', 'WARN', 'exception:登录密码不正确', '[\"\"]', 'response.go:45:', 1675501644788992900, 1, '2023-02-04 17:07:25', '2023-02-04 17:07:25'), +(79, '44216a700f95401785aa7221cc6e9626', 'PANI', 'exception:exception recovered: reflect: call of reflect.Value.Type on zero Value', '[\"\"]', 'response.go:45:', 1675502954927819500, 1, '2023-02-04 17:29:15', '2023-02-04 17:29:15'), +(80, 'd8802ea24c1d411794421357ffede791', 'WARN', 'exception:请先删除该字典类型下得所有子级类型!', '[\"\"]', 'response.go:45:', 1675652751341364700, 1, '2023-02-06 11:05:51', '2023-02-06 11:05:51'), +(81, 'c427301a631d4117832b2b44169386ea', 'WARN', 'exception:请先删除该字典类型下得所有子级类型!', '[\"1. hotgo/internal/global.LoggingServeLogHandler.func1\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:111\", \"2. github.com/gogf/gf/v2/util/gutil.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:40\", \"3. github.com/gogf/gf/v2/frame/g.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/frame/g/g_func.go:67\", \"4. hotgo/internal/global.LoggingServeLogHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:86\", \"5. github.com/gogf/gf/v2/os/glog.(*HandlerInput).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger_handler.go:69\", \"6. github.com/gogf/gf/v2/os/glog.(*Logger).print\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger.go:230\", \"7. github.com/gogf/gf/v2/os/glog.(*Logger).printStd\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger.go:371\", \"8. github.com/gogf/gf/v2/os/glog.(*Logger).Warningf\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger_api.go:107\", \"9. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"11. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"13. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"15. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"17. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"19. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"21. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"23. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"25. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"27. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"29. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"31. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"33. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"35. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"37. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"38. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"39. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"40. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"41. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"42. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"43. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"44. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"45. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45:', 1675652847848131100, 1, '2023-02-06 11:07:28', '2023-02-06 11:07:28'), +(82, 'e4a9a7b67a1d41174c403f706f44753a', 'WARN', 'exception:请先删除该字典类型下得所有子级类型!', '[\"1. hotgo/internal/global.LoggingServeLogHandler.func1\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:111\", \"2. github.com/gogf/gf/v2/util/gutil.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:40\", \"3. github.com/gogf/gf/v2/frame/g.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/frame/g/g_func.go:67\", \"4. hotgo/internal/global.LoggingServeLogHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:86\", \"5. github.com/gogf/gf/v2/os/glog.(*HandlerInput).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger_handler.go:69\", \"6. github.com/gogf/gf/v2/os/glog.(*Logger).print\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger.go:230\", \"7. github.com/gogf/gf/v2/os/glog.(*Logger).printStd\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger.go:371\", \"8. github.com/gogf/gf/v2/os/glog.(*Logger).Warningf\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/os/glog/glog_logger_api.go:107\", \"9. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"11. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"13. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"15. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"17. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"19. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"21. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"23. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"25. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"27. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"29. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"31. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"33. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"35. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"37. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"38. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"39. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"40. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"41. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"42. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"43. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"44. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"45. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675652949260640500, 1, '2023-02-06 11:09:09', '2023-02-06 11:09:09'); +INSERT INTO `hg_sys_serve_log` (`id`, `trace_id`, `level_format`, `content`, `stack`, `line`, `trigger_ns`, `status`, `created_at`, `updated_at`) VALUES +(83, '701a4df18e1d4117dd27f948e8ce4fab', 'WARN', 'exception:请先删除该字典类型下得所有子级类型!', '[\"1. hotgo/internal/global.LoggingServeLogHandler.func1\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:110\", \"2. github.com/gogf/gf/v2/util/gutil.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:40\", \"3. github.com/gogf/gf/v2/frame/g.Try\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/frame/g/g_func.go:67\", \"4. hotgo/internal/global.LoggingServeLogHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/global/init.go:85\", \"5. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"7. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"9. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"11. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"13. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"15. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"17. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"19. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"21. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"23. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"25. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"27. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"29. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"31. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"33. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"35. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"37. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"38. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"39. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"40. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"41. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675653036161770200, 1, '2023-02-06 11:10:36', '2023-02-06 11:10:36'), +(84, '2c694630c41d41173b86da6a16b148e2', 'WARN', 'exception:请先删除该字典类型下得所有子级类型!', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675653264858401300, 1, '2023-02-06 11:14:25', '2023-02-06 11:14:25'), +(85, '2c720fc8ce264117f33194418885218f', 'PANI', 'exception:exception recovered: runtime error: invalid memory address or nil pointer dereference', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675663205934112500, 1, '2023-02-06 14:00:06', '2023-02-06 14:00:06'), +(86, '84dc39ccce264117f4319441d35ccb16', 'PANI', 'exception:exception recovered: runtime error: invalid memory address or nil pointer dereference', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675663206141015700, 1, '2023-02-06 14:00:06', '2023-02-06 14:00:06'), +(87, '7cb5726de5284117ae057d50870feba8', 'WARN', 'exception:QQ号码已存在,请换一个', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675665502215115900, 1, '2023-02-06 14:38:22', '2023-02-06 14:38:22'), +(88, 'a0e1b057522f41179882ad1bd51bd4b0', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675672567110876300, 1, '2023-02-06 16:36:07', '2023-02-06 16:36:07'), +(89, '7809a12bb2ba41175dab186079ac3261', 'WARN', 'exception:上传的文件不是图片', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675825810758538400, 1, '2023-02-08 11:10:10', '2023-02-08 11:10:10'), +(90, '6c99fd5391c8411702666c4ade229fac', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675841062865359500, 1, '2023-02-08 15:24:22', '2023-02-08 15:24:22'); +INSERT INTO `hg_sys_serve_log` (`id`, `trace_id`, `level_format`, `content`, `stack`, `line`, `trigger_ns`, `status`, `created_at`, `updated_at`) VALUES +(91, 'd81d84689cc8411706666c4adbd3ff4d', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675841110454143900, 1, '2023-02-08 15:25:10', '2023-02-08 15:25:10'), +(92, 'dc19fa419dc8411708666c4a8c7de43e', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675841114102611800, 1, '2023-02-08 15:25:14', '2023-02-08 15:25:14'), +(93, '182244db6ac94117110d2c50ba265efd', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675841997142390700, 1, '2023-02-08 15:39:57', '2023-02-08 15:39:57'), +(94, '945a1bc1adc94117c1932143f04845cc', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675842284466528500, 1, '2023-02-08 15:44:44', '2023-02-08 15:44:44'), +(95, '709912d0a9ca41170b7ed46ea0b25f01', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675843367205098700, 1, '2023-02-08 16:02:47', '2023-02-08 16:02:47'), +(96, '98514de7e2cd4117fab0ed2cd43651cc', 'WARN', 'exception:table does not exist:', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675846910788590600, 1, '2023-02-08 17:01:50', '2023-02-08 17:01:50'), +(97, '305e46e8d9ce41170d34500d10c378cc', 'WARN', 'exception:生成模板配置InputPath不能为空', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675847971669066200, 1, '2023-02-08 17:19:31', '2023-02-08 17:19:31'), +(98, 'd4bb53ecdace41170e34500d8565e0bb', 'WARN', 'exception:生成模板配置InputPath不能为空', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675847976026060300, 1, '2023-02-08 17:19:36', '2023-02-08 17:19:36'); +INSERT INTO `hg_sys_serve_log` (`id`, `trace_id`, `level_format`, `content`, `stack`, `line`, `trigger_ns`, `status`, `created_at`, `updated_at`) VALUES +(99, '2c844719e5ce41172cfefa15060d21cc', 'WARN', 'exception:生成模板配置参数\'InputPath\'不能为空', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675848019730502900, 1, '2023-02-08 17:20:20', '2023-02-08 17:20:20'), +(100, '2ceca99bedce4117407ed21e8681848d', 'WARN', 'exception:生成模板配置参数\'InputPath\'路径不存在,请先创建路径', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675848056283236900, 1, '2023-02-08 17:20:56', '2023-02-08 17:20:56'), +(101, 'f0f4dab4efce4117417ed21ee71d2760', 'WARN', 'exception:生成模板不存在!', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675848065292317200, 1, '2023-02-08 17:21:05', '2023-02-08 17:21:05'), +(102, '1c46500df0ce4117427ed21ed0820c97', 'WARN', 'exception:生成模板不存在!', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675848066773157600, 1, '2023-02-08 17:21:06', '2023-02-08 17:21:06'), +(103, 'f8f1cae1afd84117c6796a5909b96134', 'WARN', 'exception:reflect: call of reflect.Value.NumField on slice Value', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675858786280964800, 1, '2023-02-08 20:19:46', '2023-02-08 20:19:46'), +(104, 'acab43dfb2d84117cb796a59c09c2fbc', 'WARN', 'exception:reflect: call of reflect.Value.NumField on slice Value', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675858799123414200, 1, '2023-02-08 20:19:59', '2023-02-08 20:19:59'), +(105, '1c82e235dbd84117d92f066e04c2985a', 'WARN', 'exception:reflect: call of reflect.Value.NumField on slice Value', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675858972375016000, 1, '2023-02-08 20:22:52', '2023-02-08 20:22:52'), +(106, '4476a701f7d8411789c8a65a1b91162e', 'WARN', 'exception:reflect: call of reflect.Value.NumField on slice Value', '[\"1. hotgo/internal/logic/middleware.(*sMiddleware).ResponseHandler\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/response.go:45\", \"2. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"3. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"4. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"5. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"6. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"7. hotgo/internal/logic/middleware.(*sMiddleware).DemoLimit\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:81\", \"8. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"9. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"10. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"11. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"12. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"13. hotgo/internal/logic/middleware.(*sMiddleware).Blacklist\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/limit_blacklist.go:22\", \"14. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"15. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"16. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"17. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"18. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"19. hotgo/internal/logic/middleware.(*sMiddleware).CORS\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:74\", \"20. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"21. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"22. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"23. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"24. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"25. hotgo/internal/logic/middleware.(*sMiddleware).Ctx\", \" E:/Users/Administrator/Desktop/gosrc/hotgo/server/internal/logic/middleware/init.go:53\", \"26. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:55\", \"27. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"28. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:54\", \"29. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"30. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"31. github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_middleware_tracing.go:78\", \"32. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1.5\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:96\", \"33. github.com/gogf/gf/v2/net/ghttp.niceCallFunc\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_func.go:55\", \"34. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next.func1\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:95\", \"35. github.com/gogf/gf/v2/util/gutil.TryCatch\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/util/gutil/gutil.go:56\", \"36. github.com/gogf/gf/v2/net/ghttp.(*middleware).Next\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_request_middleware.go:49\", \"37. github.com/gogf/gf/v2/net/ghttp.(*Server).ServeHTTP\", \" E:/gopath/pkg/mod/github.com/gogf/gf/v2@v2.3.1/net/ghttp/ghttp_server_handler.go:132\", \"\"]', 'response.go:45', 1675859091764673600, 1, '2023-02-08 20:24:51', '2023-02-08 20:24:51'); + -- -------------------------------------------------------- -- @@ -4718,9 +5104,9 @@ CREATE TABLE `hg_sys_serve_log` ( CREATE TABLE `hg_sys_sms_log` ( `id` bigint(20) NOT NULL COMMENT '主键', - `event` varchar(255) NOT NULL COMMENT '事件', + `event` varchar(64) NOT NULL COMMENT '事件', `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号', - `code` varchar(512) DEFAULT '' COMMENT '验证码或短信内容', + `code` varchar(256) DEFAULT '' COMMENT '验证码或短信内容', `times` bigint(20) NOT NULL COMMENT '验证次数', `ip` varchar(128) DEFAULT NULL COMMENT 'ip地址', `status` tinyint(1) DEFAULT '1' COMMENT '状态(1未验证,2已验证)', @@ -4747,7 +5133,7 @@ CREATE TABLE `hg_test` ( `flag` json DEFAULT NULL COMMENT '标签', `title` varchar(255) NOT NULL COMMENT '标题', `description` varchar(255) NOT NULL COMMENT '描述', - `content` text NOT NULL COMMENT '内容', + `content` longtext NOT NULL COMMENT '内容', `image` varchar(255) DEFAULT NULL COMMENT '单图', `images` json DEFAULT NULL COMMENT '多图', `attachfile` varchar(255) DEFAULT NULL COMMENT '附件', @@ -4768,6 +5154,7 @@ CREATE TABLE `hg_test` ( `mobile` varchar(20) DEFAULT '' COMMENT '手机号码', `hobby` json DEFAULT NULL COMMENT '爱好', `channel` int(11) NOT NULL DEFAULT '1' COMMENT '渠道', + `city_id` bigint(20) DEFAULT '0' COMMENT '所在城市', `pid` bigint(20) NOT NULL COMMENT '上级ID', `level` int(11) DEFAULT '1' COMMENT '树等级', `tree` varchar(512) NOT NULL COMMENT '关系树', @@ -4784,8 +5171,10 @@ CREATE TABLE `hg_test` ( -- 转存表中的数据 `hg_test` -- -INSERT INTO `hg_test` (`id`, `category_id`, `flag`, `title`, `description`, `content`, `image`, `images`, `attachfile`, `attachfiles`, `map`, `star`, `price`, `views`, `activity_at`, `start_at`, `end_at`, `switch`, `sort`, `avatar`, `sex`, `qq`, `email`, `mobile`, `hobby`, `channel`, `pid`, `level`, `tree`, `remark`, `status`, `created_by`, `updated_by`, `created_at`, `updated_at`, `deleted_at`) VALUES -(1, 1, '[1, 2]', '测试标题', '描述', '

这是内容............

', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', '[\"http://localhost:8000/attachment/2022-12-29/cpea9g76jq4cyxvg8c.jpg\", \"http://localhost:8000/attachment/2022-12-29/cpeajfdijd6gix0m37.jpg\"]', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', '[\"http://localhost:8000/attachment/2022-12-29/cpea9g76jq4cyxvg8c.jpg\", \"http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx\"]', '[{\"key\": \"qwe\", \"value\": \"123\"}, {\"key\": \"asd\", \"value\": \"456\"}]', '3.0', '88.00', 10, '2022-12-23', '2022-12-01 00:00:00', '2022-12-31 23:59:59', 1, 20, '', 15, '133814250', '133814250@qq.com', '15303830571', '[3, 2, 1]', 1, 0, 1, '', '备注!', 1, 1, 1, '2022-12-15 19:30:14', '2023-01-18 15:02:01', NULL); +INSERT INTO `hg_test` (`id`, `category_id`, `flag`, `title`, `description`, `content`, `image`, `images`, `attachfile`, `attachfiles`, `map`, `star`, `price`, `views`, `activity_at`, `start_at`, `end_at`, `switch`, `sort`, `avatar`, `sex`, `qq`, `email`, `mobile`, `hobby`, `channel`, `city_id`, `pid`, `level`, `tree`, `remark`, `status`, `created_by`, `updated_by`, `created_at`, `updated_at`, `deleted_at`) VALUES +(1, 1, '[1, 2]', '测试标题', '描述', '

这是内容............

', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', '[\"http://localhost:8000/attachment/2022-12-29/cpea9g76jq4cyxvg8c.jpg\", \"http://localhost:8000/attachment/2022-12-29/cpeajfdijd6gix0m37.jpg\"]', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', '[\"http://localhost:8000/attachment/2022-12-29/cpea9g76jq4cyxvg8c.jpg\", \"http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx\"]', '[{\"key\": \"qwe\", \"value\": \"123\"}, {\"key\": \"asd\", \"value\": \"456\"}]', '3.0', '88.00', 10, '2022-12-23', '2022-12-01 00:00:00', '2022-12-31 23:59:59', 1, 20, '', 15, '133814250', '133814250@qq.com', '15303830571', '[3, 2, 1]', 1, 140406, 0, 1, '', '备注!', 1, 1, 1, '2022-12-15 19:30:14', '2023-02-06 14:10:29', NULL), +(2, 0, '[1]', '测试2', '描述11', '

描述11描述11描述11描述11描述11

', '', '{}', '', '{}', '{}', '0.0', '10.00', 0, NULL, NULL, NULL, 0, 30, '', 0, '', '1561561@qq.com', '15303830571', '{}', 3, 140214, 0, 1, '', '', 1, 1, 1, '2023-02-06 14:17:11', '2023-02-06 14:21:32', NULL), +(3, 0, '[1]', '测试3', '测试3测试3测试3测试3测试3', '

测试3测试3测试3测试3测试3测试3测试3

', '', '{}', '', '{}', '[{\"key\": \"\", \"value\": \"\"}]', '3.0', '10.00', 0, NULL, NULL, NULL, 0, 40, '', 0, '49498498', '6544984@qq.com', '15303830578', '[2]', 0, 120103, 0, 1, '', '', 1, 8, 0, '2023-02-06 14:38:27', '2023-02-06 14:38:27', NULL); -- -------------------------------------------------------- @@ -4836,7 +5225,8 @@ ALTER TABLE `hg_admin_dept` -- ALTER TABLE `hg_admin_member` ADD PRIMARY KEY (`id`), - ADD KEY `dept_id` (`dept_id`); + ADD KEY `dept_id` (`dept_id`), + ADD KEY `pid` (`pid`); -- -- 表的索引 `hg_admin_member_post` @@ -4866,6 +5256,13 @@ ALTER TABLE `hg_admin_menu` ALTER TABLE `hg_admin_notice` ADD PRIMARY KEY (`id`); +-- +-- 表的索引 `hg_admin_notice_read` +-- +ALTER TABLE `hg_admin_notice_read` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `notice_id` (`notice_id`,`member_id`); + -- -- 表的索引 `hg_admin_post` -- @@ -4939,6 +5336,13 @@ ALTER TABLE `hg_sys_dict_type` ADD PRIMARY KEY (`id`) USING BTREE, ADD UNIQUE KEY `dict_type` (`type`); +-- +-- 表的索引 `hg_sys_ems_log` +-- +ALTER TABLE `hg_sys_ems_log` + ADD PRIMARY KEY (`id`) USING BTREE, + ADD KEY `email` (`email`); + -- -- 表的索引 `hg_sys_gen_codes` -- @@ -5009,25 +5413,31 @@ ALTER TABLE `hg_test_category` -- 使用表AUTO_INCREMENT `hg_admin_dept` -- ALTER TABLE `hg_admin_dept` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门ID', AUTO_INCREMENT=117; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门ID', AUTO_INCREMENT=113; -- -- 使用表AUTO_INCREMENT `hg_admin_member` -- ALTER TABLE `hg_admin_member` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员ID', AUTO_INCREMENT=8; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员ID', AUTO_INCREMENT=9; -- -- 使用表AUTO_INCREMENT `hg_admin_menu` -- ALTER TABLE `hg_admin_menu` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', AUTO_INCREMENT=2211; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', AUTO_INCREMENT=2227; -- -- 使用表AUTO_INCREMENT `hg_admin_notice` -- ALTER TABLE `hg_admin_notice` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '公告ID', AUTO_INCREMENT=9; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '公告ID', AUTO_INCREMENT=29; + +-- +-- 使用表AUTO_INCREMENT `hg_admin_notice_read` +-- +ALTER TABLE `hg_admin_notice_read` + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID', AUTO_INCREMENT=15; -- -- 使用表AUTO_INCREMENT `hg_admin_post` @@ -5039,19 +5449,19 @@ ALTER TABLE `hg_admin_post` -- 使用表AUTO_INCREMENT `hg_admin_role` -- ALTER TABLE `hg_admin_role` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', AUTO_INCREMENT=213; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', AUTO_INCREMENT=209; -- -- 使用表AUTO_INCREMENT `hg_admin_role_casbin` -- ALTER TABLE `hg_admin_role_casbin` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3380; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4711; -- -- 使用表AUTO_INCREMENT `hg_sys_attachment` -- ALTER TABLE `hg_sys_attachment` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文件ID', AUTO_INCREMENT=30; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文件ID', AUTO_INCREMENT=36; -- -- 使用表AUTO_INCREMENT `hg_sys_blacklist` @@ -5063,13 +5473,13 @@ ALTER TABLE `hg_sys_blacklist` -- 使用表AUTO_INCREMENT `hg_sys_config` -- ALTER TABLE `hg_sys_config` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '配置ID', AUTO_INCREMENT=50; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '配置ID', AUTO_INCREMENT=55; -- -- 使用表AUTO_INCREMENT `hg_sys_cron` -- ALTER TABLE `hg_sys_cron` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', AUTO_INCREMENT=4; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', AUTO_INCREMENT=7; -- -- 使用表AUTO_INCREMENT `hg_sys_cron_group` @@ -5081,49 +5491,55 @@ ALTER TABLE `hg_sys_cron_group` -- 使用表AUTO_INCREMENT `hg_sys_dict_data` -- ALTER TABLE `hg_sys_dict_data` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典数据ID', AUTO_INCREMENT=141; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典数据ID', AUTO_INCREMENT=154; -- -- 使用表AUTO_INCREMENT `hg_sys_dict_type` -- ALTER TABLE `hg_sys_dict_type` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典类型ID', AUTO_INCREMENT=37; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典类型ID', AUTO_INCREMENT=39; + +-- +-- 使用表AUTO_INCREMENT `hg_sys_ems_log` +-- +ALTER TABLE `hg_sys_ems_log` + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=6; -- -- 使用表AUTO_INCREMENT `hg_sys_gen_codes` -- ALTER TABLE `hg_sys_gen_codes` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '生成ID', AUTO_INCREMENT=24; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '生成ID', AUTO_INCREMENT=2; -- -- 使用表AUTO_INCREMENT `hg_sys_gen_curd_demo` -- ALTER TABLE `hg_sys_gen_curd_demo` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=11; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', AUTO_INCREMENT=3; -- -- 使用表AUTO_INCREMENT `hg_sys_log` -- ALTER TABLE `hg_sys_log` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', AUTO_INCREMENT=5; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID'; -- -- 使用表AUTO_INCREMENT `hg_sys_login_log` -- ALTER TABLE `hg_sys_login_log` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', AUTO_INCREMENT=31; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', AUTO_INCREMENT=14; -- -- 使用表AUTO_INCREMENT `hg_sys_serve_log` -- ALTER TABLE `hg_sys_serve_log` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID'; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', AUTO_INCREMENT=107; -- -- 使用表AUTO_INCREMENT `hg_sys_sms_log` -- ALTER TABLE `hg_sys_sms_log` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=14; + MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=2; -- -- 使用表AUTO_INCREMENT `hg_test` diff --git a/server/resource/template/email/code.html b/server/resource/template/email/code.html new file mode 100644 index 0000000..5fd7a53 --- /dev/null +++ b/server/resource/template/email/code.html @@ -0,0 +1,217 @@ + + + + + + + + 验证码邮件 + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ logo +
+

+ 这是你发送的验证码吗? +

+
+

+ @{.os}
+ @{.cityLabel} (estimated)
+ IP 地址: @{.ip} +

+
+

+ 如果是,请输入验证码: +

+
+

+ @{.code} +

+
+

+ 该验证码@{.expires}分钟内有效,请不要告诉于他人! +

+
+ +
+
+ + \ No newline at end of file diff --git a/server/resource/template/email/resetPwd.html b/server/resource/template/email/resetPwd.html new file mode 100644 index 0000000..574fbb9 --- /dev/null +++ b/server/resource/template/email/resetPwd.html @@ -0,0 +1,301 @@ + + + + + + + + 密码重置邮件 + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ logo +
+

+ Hi, @{.username}! +

+

+ 忘记密码请求 +

+
+

+ 你好像忘记了你的账户密码。你可以通过点击下面的按钮更改密码: +

+
+ + + + + + +
+ + 重置密码 + +
+
+

+ Ms and the @{.name} Team. +

+
+

+ 如果你在点击密码重置按钮时遇到麻烦,请将下面的URL复制并粘贴到你的浏览器中: +

+
+

+ @{.passwordResetLink} +

+
+ +
+
+ + \ No newline at end of file diff --git a/server/resource/template/email/text.html b/server/resource/template/email/text.html new file mode 100644 index 0000000..47cc6ed --- /dev/null +++ b/server/resource/template/email/text.html @@ -0,0 +1,12 @@ + + + + + + + + + +@{.content} + + \ No newline at end of file diff --git a/server/resource/template/generate/default/curd/controller.go.template b/server/resource/template/generate/default/curd/controller.go.template index f298b28..f11c8ec 100644 --- a/server/resource/template/generate/default/curd/controller.go.template +++ b/server/resource/template/generate/default/curd/controller.go.template @@ -28,16 +28,16 @@ type c@{.varName} struct{} func (c *c@{.varName}) List(ctx context.Context, req *@{.varName | ToLower}.ListReq) (res *@{.varName | ToLower}.ListRes, err error) { var in @{.templateGroup}in.@{.varName}ListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } list, totalCount, err := service.@{.templateGroup | UcFirst}@{.varName}().List(ctx, in) if err != nil { - return nil, err + return } res = new(@{.varName | ToLower}.ListRes) @@ -45,24 +45,22 @@ func (c *c@{.varName}) List(ctx context.Context, req *@{.varName | ToLower}.List res.PageCount = form.CalPageCount(totalCount, req.PerPage) res.Page = req.Page res.PerPage = req.PerPage - return res, nil + return } @{ if eq .options.Step.HasExport true } // Export 导出@{.tableComment}列表 func (c *c@{.varName}) Export(ctx context.Context, req *@{.varName | ToLower}.ExportReq) (res *@{.varName | ToLower}.ExportRes, err error) { var in @{.templateGroup}in.@{.varName}ListInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.@{.templateGroup | UcFirst}@{.varName}().Export(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.@{.templateGroup | UcFirst}@{.varName}().Export(ctx, in) + return } @{end} @{ if eq .options.Step.HasEdit true } @@ -70,17 +68,15 @@ func (c *c@{.varName}) Export(ctx context.Context, req *@{.varName | ToLower}.Ex func (c *c@{.varName}) Edit(ctx context.Context, req *@{.varName | ToLower}.EditReq) (res *@{.varName | ToLower}.EditRes, err error) { var in @{.templateGroup}in.@{.varName}EditInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.@{.templateGroup | UcFirst}@{.varName}().Edit(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.@{.templateGroup | UcFirst}@{.varName}().Edit(ctx, in) + return } @{end} @{ if and (eq .options.Step.HasEdit true) (eq .options.Step.HasMaxSort true) } @@ -88,12 +84,12 @@ func (c *c@{.varName}) Edit(ctx context.Context, req *@{.varName | ToLower}.Edit func (c *c@{.varName}) MaxSort(ctx context.Context, req *@{.varName | ToLower}.MaxSortReq) (res *@{.varName | ToLower}.MaxSortRes, err error) { data, err := service.@{.templateGroup | UcFirst}@{.varName}().MaxSort(ctx, sysin.@{.varName}MaxSortInp{}) if err != nil { - return nil, err + return } res = new(@{.varName | ToLower}.MaxSortRes) res.@{.varName}MaxSortModel = data - return res, nil + return } @{end} @{ if eq .options.Step.HasView true } @@ -101,21 +97,21 @@ func (c *c@{.varName}) MaxSort(ctx context.Context, req *@{.varName | ToLower}.M func (c *c@{.varName}) View(ctx context.Context, req *@{.varName | ToLower}.ViewReq) (res *@{.varName | ToLower}.ViewRes, err error) { var in @{.templateGroup}in.@{.varName}ViewInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } data, err := service.@{.templateGroup | UcFirst}@{.varName}().View(ctx, in) if err != nil { - return nil, err + return } res = new(@{.varName | ToLower}.ViewRes) res.@{.varName}ViewModel = data - return res, nil + return } @{end} @{ if eq .options.Step.HasDel true } @@ -123,17 +119,15 @@ func (c *c@{.varName}) View(ctx context.Context, req *@{.varName | ToLower}.View func (c *c@{.varName}) Delete(ctx context.Context, req *@{.varName | ToLower}.DeleteReq) (res *@{.varName | ToLower}.DeleteRes, err error) { var in @{.templateGroup}in.@{.varName}DeleteInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.@{.templateGroup | UcFirst}@{.varName}().Delete(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.@{.templateGroup | UcFirst}@{.varName}().Delete(ctx, in) + return } @{end} @{ if eq .options.Step.HasStatus true } @@ -141,17 +135,15 @@ func (c *c@{.varName}) Delete(ctx context.Context, req *@{.varName | ToLower}.De func (c *c@{.varName}) Status(ctx context.Context, req *@{.varName | ToLower}.StatusReq) (res *@{.varName | ToLower}.StatusRes, err error) { var in @{.templateGroup}in.@{.varName}StatusInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.@{.templateGroup | UcFirst}@{.varName}().Status(ctx, in); err != nil { - return nil, err - } - return res, nil + err = service.@{.templateGroup | UcFirst}@{.varName}().Status(ctx, in) + return } @{end} @{ if eq .options.Step.HasSwitch true } @@ -159,17 +151,14 @@ func (c *c@{.varName}) Status(ctx context.Context, req *@{.varName | ToLower}.St func (c *c@{.varName}) Switch(ctx context.Context, req *@{.varName | ToLower}.SwitchReq) (res *@{.varName | ToLower}.SwitchRes, err error) { var in @{.templateGroup}in.@{.varName}SwitchInp if err = gconv.Scan(req, &in); err != nil { - return nil, err + return } if err = validate.PreFilter(ctx, &in); err != nil { - return nil, err + return } - if err = service.@{.templateGroup | UcFirst}@{.varName}().Switch(ctx, in); err != nil { - return nil, err - } - - return res, nil + err = service.@{.templateGroup | UcFirst}@{.varName}().Switch(ctx, in) + return } @{end} diff --git a/server/resource/template/generate/default/curd/input.go.template b/server/resource/template/generate/default/curd/input.go.template index 6226197..b07f12e 100644 --- a/server/resource/template/generate/default/curd/input.go.template +++ b/server/resource/template/generate/default/curd/input.go.template @@ -23,7 +23,7 @@ import ( @{ if eq .options.Step.HasEdit true } // @{.varName}EditInp 修改/新增@{.tableComment} type @{.varName}EditInp struct { - entity.Test + entity.@{.daoName} } func (in *@{.varName}EditInp) Filter(ctx context.Context) (err error) { @@ -38,6 +38,10 @@ type @{.varName}DeleteInp struct { @{.pk.GoName} interface{} `json:"@{.pk.TsName}" v:"required#@{.pk.Dc}不能为空" dc:"@{.pk.Dc}"` } +func (in *@{.varName}DeleteInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}DeleteModel struct{} @{end} @{ if eq .options.Step.HasView true } @@ -46,8 +50,12 @@ type @{.varName}ViewInp struct { @{.pk.GoName} @{.pk.GoType} `json:"@{.pk.TsName}" v:"required#@{.pk.Dc}不能为空" dc:"@{.pk.Dc}"` } +func (in *@{.varName}ViewInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}ViewModel struct { - entity.Test + entity.@{.daoName} }@{end} // @{.varName}ListInp 获取@{.tableComment}列表 @@ -56,13 +64,14 @@ type @{.varName}ListInp struct { @{.listInpColumns} } +func (in *@{.varName}ListInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}ListModel struct { @{.listModelColumns} } -func (in *@{.varName}ListInp) Filter(ctx context.Context) (err error) { - return -} @{ if eq .options.Step.HasExport true } // @{.varName}ExportModel 导出@{.tableComment} type @{.varName}ExportModel struct { @@ -72,6 +81,10 @@ type @{.varName}ExportModel struct { // @{.varName}MaxSortInp 获取@{.tableComment}最大排序 type @{.varName}MaxSortInp struct{} +func (in *@{.varName}MaxSortInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}MaxSortModel struct { Sort int `json:"sort" description:"排序"` } @@ -83,6 +96,10 @@ type @{.varName}StatusInp struct { Status int `json:"status" dc:"状态"` } +func (in *@{.varName}StatusInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}StatusModel struct{} @{end} @{ if eq .options.Step.HasSwitch true } @@ -92,5 +109,9 @@ type @{.varName}SwitchInp struct { @{.pk.GoName} @{.pk.GoType} `json:"@{.pk.TsName}" v:"required#@{.pk.Dc}不能为空" dc:"@{.pk.Dc}"` } +func (in *@{.varName}SwitchInp) Filter(ctx context.Context) (err error) { + return +} + type @{.varName}SwitchModel struct{} @{end} \ No newline at end of file diff --git a/server/resource/template/generate/default/curd/logic.go.template b/server/resource/template/generate/default/curd/logic.go.template index fe6d63a..46a16a4 100644 --- a/server/resource/template/generate/default/curd/logic.go.template +++ b/server/resource/template/generate/default/curd/logic.go.template @@ -21,6 +21,7 @@ import ( "hotgo/internal/dao" "hotgo/internal/library/contexts" "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" "hotgo/internal/model/input/@{.templateGroup}in" "hotgo/internal/model/input/form" "hotgo/internal/service" @@ -39,46 +40,42 @@ func init() { service.Register@{.servFunName}(New@{.servFunName}()) } -// Model @{.tableComment}Orm模型 -func (s *s@{.servFunName}) Model(ctx context.Context) *gdb.Model { - return dao.@{.daoName}.Ctx(ctx) +// Model @{.tableComment}ORM模型 +func (s *s@{.servFunName}) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.@{.daoName}.Ctx(ctx), option...) } // List 获取@{.tableComment}列表 func (s *s@{.servFunName}) List(ctx context.Context, in @{.templateGroup}in.@{.varName}ListInp) (list []*@{.templateGroup}in.@{.varName}ListModel, totalCount int, err error) { - mod := dao.@{.daoName}.Ctx(ctx) + mod := s.Model(ctx) @{.listWhere} @{.listJoin.link} totalCount, err = mod.Clone().Count(1) if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err + return } if totalCount == 0 { - return list, totalCount, nil + return } @{.listJoin.select} - if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth).Page(in.Page, in.PerPage).@{.listOrder}.Scan(&list); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return list, totalCount, err - } - return list, totalCount, err + err = mod.Fields(fields).Page(in.Page, in.PerPage).@{.listOrder}.Scan(&list) + return } @{ if eq .options.Step.HasExport true } // Export 导出@{.tableComment} func (s *s@{.servFunName}) Export(ctx context.Context, in @{.templateGroup}in.@{.varName}ListInp) (err error) { list, totalCount, err := s.List(ctx, in) if err != nil { - return err + return } // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} tags, err := convert.GetEntityDescTags(@{.templateGroup}in.@{.varName}ExportModel{}) if err != nil { - return err + return } var ( @@ -87,13 +84,11 @@ func (s *s@{.servFunName}) Export(ctx context.Context, in @{.templateGroup}in.@{ exports []@{.templateGroup}in.@{.varName}ExportModel ) - err = gconv.Scan(list, &exports) - if err != nil { - return err - } - if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil { + if err = gconv.Scan(list, &exports);err != nil { return } + + err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName) return }@{end} @{ if eq .options.Step.HasEdit true } @@ -112,61 +107,50 @@ func (s *s@{.servFunName}) Edit(ctx context.Context, in @{.templateGroup}in.@{.v @{ if eq .options.Step.HasDel true } // Delete 删除@{.tableComment} func (s *s@{.servFunName}) Delete(ctx context.Context, in @{.templateGroup}in.@{.varName}DeleteInp) (err error) { - _, err = dao.@{.daoName}.Ctx(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Delete() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Delete() + return }@{end} @{ if and (eq .options.Step.HasEdit true) (eq .options.Step.HasMaxSort true) } // MaxSort 获取@{.tableComment}最大排序 func (s *s@{.servFunName}) MaxSort(ctx context.Context, in @{.templateGroup}in.@{.varName}MaxSortInp) (res *@{.templateGroup}in.@{.varName}MaxSortModel, err error) { if err = dao.@{.daoName}.Ctx(ctx).Fields(dao.@{.daoName}.Columns().Sort).OrderDesc(dao.@{.daoName}.Columns().Sort).Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err + return } - res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int() - return res, nil + if res == nil { + res = new(@{.templateGroup}in.@{.varName}MaxSortModel) + } + + res.Sort = form.DefaultMaxSort(ctx, res.Sort) + return } @{end} @{ if eq .options.Step.HasView true } // View 获取@{.tableComment}指定信息 func (s *s@{.servFunName}) View(ctx context.Context, in @{.templateGroup}in.@{.varName}ViewInp) (res *@{.templateGroup}in.@{.varName}ViewModel, err error) { - if err = dao.@{.daoName}.Ctx(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Scan(&res); err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return nil, err - } - - return res, nil + err = s.Model(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Scan(&res) + return }@{end} @{ if eq .options.Step.HasStatus true } // Status 更新@{.tableComment}状态 func (s *s@{.servFunName}) Status(ctx context.Context, in @{.templateGroup}in.@{.varName}StatusInp) (err error) { if in.@{.pk.GoName} <= 0 { err = gerror.New("@{.pk.Dc}不能为空") - return err + return } if in.Status <= 0 { err = gerror.New("状态不能为空") - return err + return } if !validate.InSliceInt(consts.StatusMap, in.Status) { err = gerror.New("状态不正确") - return err + return } - _, err = dao.@{.daoName}.Ctx(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Data(dao.@{.daoName}.Columns().Status, in.Status).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Data(@{.statusUpdate}).Update() + return } @{end} @{ if eq .options.Step.HasSwitch true } @@ -179,15 +163,10 @@ func (s *s@{.servFunName}) Switch(ctx context.Context, in @{.templateGroup}in.@{ if !validate.InSliceString(fields, in.Key) { err = gerror.New("开关键名不在白名单") - return err + return } - _, err = dao.@{.daoName}.Ctx(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Data(in.Key, in.Value).Update() - if err != nil { - err = gerror.Wrap(err, consts.ErrorORM) - return err - } - - return nil + _, err = s.Model(ctx).Where(dao.@{.daoName}.Columns().@{.pk.GoName}, in.@{.pk.GoName}).Data(@{.switchUpdate}).Update() + return } @{end} \ No newline at end of file diff --git a/server/resource/template/generate/default/curd/web.edit.vue.template b/server/resource/template/generate/default/curd/web.edit.vue.template index 58d63f6..eddef21 100644 --- a/server/resource/template/generate/default/curd/web.edit.vue.template +++ b/server/resource/template/generate/default/curd/web.edit.vue.template @@ -1,31 +1,33 @@ @@ -57,10 +59,8 @@ }, }); - const params = computed(() => { - return props.formParams; - }); - + const loading = ref(false); + const params = ref(props.formParams); const message = useMessage(); const formRef = ref({}); const dialogWidth = ref('75%'); diff --git a/server/utility/simple/simple.go b/server/utility/simple/simple.go index 3765d2b..d84662d 100644 --- a/server/utility/simple/simple.go +++ b/server/utility/simple/simple.go @@ -8,11 +8,36 @@ package simple import ( "context" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/encoding/gbase64" + "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/util/gconv" + "hotgo/internal/consts" + "hotgo/utility/encrypt" ) +// CheckPassword 检查密码 +func CheckPassword(input, salt, hash string) (err error) { + // 解密密码 + password, err := gbase64.Decode([]byte(input)) + if err != nil { + return err + } + password, err = encrypt.AesECBDecrypt(password, consts.RequestEncryptKey) + if err != nil { + return err + } + + if hash != gmd5.MustEncryptString(string(password)+salt) { + err = gerror.New("用户密码不正确") + return + } + + return +} + func SafeGo(ctx context.Context, f func(ctx context.Context), level ...interface{}) { go func() { defer func() { diff --git a/server/utility/url/url.go b/server/utility/url/url.go index 463c02f..87cd3fc 100644 --- a/server/utility/url/url.go +++ b/server/utility/url/url.go @@ -59,7 +59,7 @@ func GetAddr(ctx context.Context) string { func GetDomain(ctx context.Context) string { r := ghttp.RequestFromCtx(ctx) if r == nil { - g.Log().Warningf(ctx, "GetDomain ctx not request") + g.Log().Info(ctx, "GetDomain ctx not request") return "" } if validate.IsDNSName(r.Host) { diff --git a/server/utility/validate/validate.go b/server/utility/validate/validate.go index e0ca590..ec2683c 100644 --- a/server/utility/validate/validate.go +++ b/server/utility/validate/validate.go @@ -25,7 +25,7 @@ func IsDNSName(s string) bool { func IsHTTPS(ctx context.Context) bool { r := ghttp.RequestFromCtx(ctx) if r == nil { - g.Log().Warningf(ctx, "IsHTTPS ctx not request") + g.Log().Infof(ctx, "IsHTTPS ctx not request") return false } var ( diff --git a/web/.env b/web/.env index ecbb546..c7ac7a5 100644 --- a/web/.env +++ b/web/.env @@ -1,11 +1,11 @@ # port -VITE_PORT = 8001 +VITE_PORT=8001 # spa-title -VITE_GLOB_APP_TITLE = HG后台管理系统 +VITE_GLOB_APP_TITLE=HG后台管理系统 # spa shortname -VITE_GLOB_APP_SHORT_NAME = HG +VITE_GLOB_APP_SHORT_NAME=HG # 生产环境 开启mock -VITE_GLOB_PROD_MOCK = false +VITE_GLOB_PROD_MOCK=false diff --git a/web/.env.development b/web/.env.development index e535f39..79c773f 100644 --- a/web/.env.development +++ b/web/.env.development @@ -1,23 +1,23 @@ # 只在开发模式中被载入 # 网站根目录 -VITE_PUBLIC_PATH = / +VITE_PUBLIC_PATH=/ # 是否开启mock -VITE_USE_MOCK = false +VITE_USE_MOCK=false # 网站前缀 -VITE_BASE_URL = / +VITE_BASE_URL=/ # 是否删除console -VITE_DROP_CONSOLE = true +VITE_DROP_CONSOLE=true # 跨域代理,可以配置多个,请注意不要换行,如果是公网运行,请改成公网IP:服务端运行端口 #VITE_PROXY = [["/appApi","http://localhost:8001"],["/upload","http://localhost:8001/upload"]] VITE_PROXY=[["/admin","http://localhost:8000/admin"]] # API 接口地址 -VITE_GLOB_API_URL = +VITE_GLOB_API_URL= # 图片上传地址 VITE_GLOB_UPLOAD_URL= @@ -26,4 +26,4 @@ VITE_GLOB_UPLOAD_URL= VITE_GLOB_IMG_URL= # 接口前缀 -VITE_GLOB_API_URL_PREFIX = /admin +VITE_GLOB_API_URL_PREFIX=/admin diff --git a/web/.env.production b/web/.env.production index d791513..ab49e2e 100644 --- a/web/.env.production +++ b/web/.env.production @@ -1,19 +1,19 @@ # 只在生产模式中被载入 # 网站根目录 -VITE_PUBLIC_PATH = /admin +VITE_PUBLIC_PATH=/admin # 是否开启mock -VITE_USE_MOCK = false +VITE_USE_MOCK=false # 网站前缀 -VITE_BASE_URL = / +VITE_BASE_URL=/ # 是否删除console -VITE_DROP_CONSOLE = true +VITE_DROP_CONSOLE=true # API -VITE_GLOB_API_URL = +VITE_GLOB_API_URL= # 图片上传地址 VITE_GLOB_UPLOAD_URL= @@ -22,12 +22,12 @@ VITE_GLOB_UPLOAD_URL= VITE_GLOB_IMG_URL= # 接口前缀 -VITE_GLOB_API_URL_PREFIX = /admin +VITE_GLOB_API_URL_PREFIX=/admin # 是否启用gzip压缩或brotli压缩 # 可选: gzip | brotli | none # 如果你需要多种形式,你可以用','来分隔 -VITE_BUILD_COMPRESS = 'none' +VITE_BUILD_COMPRESS='none' # 使用压缩时是否删除原始文件,默认为false -VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE=false diff --git a/web/.eslintrc.js b/web/.eslintrc.js index 6396b2f..489ca2b 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -73,5 +73,12 @@ module.exports = defineConfig({ math: 'always', }, ], + '@typescript-eslint/no-this-alias': [ + 'error', + { + allowDestructuring: false, // Disallow `const { props, state } = this`; true by default + allowedNames: ['that'], // Allow `const self = this`; `[]` by default + }, + ], }, }); diff --git a/web/package-lock.json b/web/package-lock.json index c9d3e88..fac496b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,17 +1,17 @@ { "name": "hotgo", - "version": "2.1.2", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "hotgo", - "version": "2.1.2", + "version": "2.1.1", "license": "MIT", "dependencies": { "@vicons/antd": "^0.10.0", "@vicons/ionicons5": "^0.10.0", - "@vueup/vue-quill": "^1.0.0-beta.8", + "@vueup/vue-quill": "^1.1.0", "@vueuse/core": "^5.3.0", "axios": "^0.21.4", "blueimp-md5": "^2.19.0", @@ -27,6 +27,9 @@ "node-sass": "^7.0.3", "pinia": "^2.0.14", "qs": "^6.10.3", + "quill-image-uploader": "^1.2.4", + "quill-magic-url": "^4.2.0", + "throttle-debounce": "^5.0.0", "vfonts": "^0.1.0", "vue": "^3.2.33", "vue-router": "^4.0.15", @@ -79,6 +82,7 @@ "vite-plugin-compression": "^0.3.6", "vite-plugin-html": "^2.1.2", "vite-plugin-mock": "^2.9.6", + "vite-plugin-require-transform": "^1.0.5", "vite-plugin-style-import": "^1.4.1", "vite-plugin-top-level-await": "^1.2.2", "vue-eslint-parser": "^7.11.0" @@ -918,11 +922,6 @@ "node": ">=10" } }, - "node_modules/@commitlint/read/node_modules/graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/@commitlint/resolve-extends": { "version": "12.1.4", "resolved": "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz", @@ -1066,24 +1065,6 @@ "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, - "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader": { - "version": "3.0.2", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", - "dev": true, - "optional": true, - "dependencies": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "cosmiconfig": ">=6" - } - }, "node_modules/@esbuild/android-arm": { "version": "0.17.2", "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.2.tgz", @@ -2284,12 +2265,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2298,87 +2281,11 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jest": { - "version": "27.0.3", - "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", - "dependencies": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "27.4.2", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@types/jest/node_modules/@types/node": { - "version": "17.0.4", - "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==" - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/diff-sequences": { - "version": "27.4.0", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "27.4.2", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-get-type": { - "version": "27.4.0", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "27.4.2", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dependencies": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/@types/json-schema": { "version": "7.0.9", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", @@ -2391,8 +2298,7 @@ }, "node_modules/@types/lodash": { "version": "4.14.182", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", - "dev": true + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" }, "node_modules/@types/lodash-es": { "version": "4.17.6", @@ -2402,10 +2308,6 @@ "@types/lodash": "*" } }, - "node_modules/@types/lodash-es/node_modules/@types/lodash": { - "version": "4.14.178", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" - }, "node_modules/@types/mdast": { "version": "3.0.10", "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.10.tgz", @@ -2453,6 +2355,15 @@ "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", "dev": true }, + "node_modules/@types/quill": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-2.0.10.tgz", + "integrity": "sha512-L6OHONEj2v4NRbWQOsn7j1N0SyzhRR3M4g1M6j/uuIwIsIW2ShWHhwbqNvH8hSmVktzqu0lITfdnqVOQ4qkrhA==", + "dependencies": { + "parchment": "^1.1.2", + "quill-delta": "^4.0.1" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz", @@ -2488,13 +2399,15 @@ "node_modules/@types/yargs": { "version": "16.0.4", "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "20.2.1", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.33.0", @@ -2803,78 +2716,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.37", - "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.37", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.37", - "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", "dependencies": { - "@vue/compiler-core": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.37", - "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.37", - "@vue/compiler-dom": "3.2.37", - "@vue/compiler-ssr": "3.2.37", - "@vue/reactivity-transform": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" } }, - "node_modules/@vue/compiler-sfc/node_modules/nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.37", - "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", "dependencies": { - "@vue/compiler-dom": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" } }, "node_modules/@vue/devtools-api": { @@ -2900,64 +2784,71 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.2.37", - "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", "dependencies": { - "@vue/shared": "3.2.37" + "@vue/shared": "3.2.47" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.37", - "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.37", - "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", "dependencies": { - "@vue/reactivity": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.37", - "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", "dependencies": { - "@vue/runtime-core": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.37", - "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", "dependencies": { - "@vue/compiler-ssr": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" }, "peerDependencies": { - "vue": "3.2.37" + "vue": "3.2.47" } }, "node_modules/@vue/shared": { - "version": "3.2.37", - "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, "node_modules/@vueup/vue-quill": { - "version": "1.0.0-beta.8", - "integrity": "sha512-3fnIdmnz2ba4dI4WIpudlYoev9r5hrL8NrvhzMXrBj5c5+uEBqM2P48Q+skwToFZjPJT+QDIKiQqY3CXJvpX/Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vueup/vue-quill/-/vue-quill-1.1.0.tgz", + "integrity": "sha512-xr1mx2y+JZClPs/lz+qjvGOWgLqh9SWfm1V+ofsJtuvBnN/h9O/QqJBuVWmdAcB6JGFhIeQcjuA2JgzqX2STjg==", "dependencies": { "quill": "^1.3.7", "quill-delta": "^4.2.2" }, "peerDependencies": { - "vue": "^3.2.31" + "vue": "^3.2.41" } }, "node_modules/@vueuse/core": { @@ -3446,8 +3337,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -3640,6 +3532,26 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/batch-processor": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz", @@ -3662,6 +3574,17 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/blueimp-md5": { "version": "2.19.0", "resolved": "https://registry.npmmirror.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz", @@ -3735,6 +3658,30 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3789,8 +3736,9 @@ } }, "node_modules/cachedir": { - "version": "2.2.0", - "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true, "engines": { "node": ">=6" @@ -3986,7 +3934,7 @@ }, "node_modules/chardet": { "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, @@ -4059,14 +4007,27 @@ } }, "node_modules/cli-cursor": { - "version": "2.1.0", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "dependencies": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { @@ -4100,9 +4061,13 @@ } }, "node_modules/cli-width": { - "version": "2.2.1", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } }, "node_modules/clipboard": { "version": "2.0.11", @@ -4238,24 +4203,25 @@ } }, "node_modules/commitizen": { - "version": "4.2.4", - "integrity": "sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", + "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", "dev": true, "dependencies": { - "cachedir": "2.2.0", - "cz-conventional-changelog": "3.2.0", + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", "dedent": "0.7.0", - "detect-indent": "6.0.0", + "detect-indent": "6.1.0", "find-node-modules": "^2.1.2", "find-root": "1.1.0", - "fs-extra": "8.1.0", - "glob": "7.1.4", - "inquirer": "6.5.2", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", "is-utf8": "^0.2.1", - "lodash": "^4.17.20", - "minimist": "1.2.5", + "lodash": "4.17.21", + "minimist": "1.2.7", "strip-bom": "4.0.0", - "strip-json-comments": "3.0.1" + "strip-json-comments": "3.1.1" }, "bin": { "commitizen": "bin/commitizen", @@ -4263,67 +4229,22 @@ "git-cz": "bin/git-cz" }, "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/commitizen/node_modules/fs-extra": { - "version": "8.1.0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/commitizen/node_modules/glob": { - "version": "7.1.4", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commitizen/node_modules/graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/commitizen/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/commitizen/node_modules/strip-json-comments": { - "version": "3.0.1", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commitizen/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" + "node": ">=10" } }, "node_modules/commondir": { @@ -4421,7 +4342,7 @@ }, "node_modules/conventional-commit-types": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, @@ -4495,7 +4416,8 @@ "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -4526,7 +4448,7 @@ }, "node_modules/crypto-js": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", "dev": true }, @@ -4599,12 +4521,14 @@ "dev": true }, "node_modules/csstype": { - "version": "2.6.19", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "node_modules/cz-conventional-changelog": { - "version": "3.2.0", - "integrity": "sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", "dev": true, "dependencies": { "chalk": "^2.4.1", @@ -4621,217 +4545,9 @@ "@commitlint/load": ">6.1.1" } }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/execute-rule": { - "version": "15.0.0", - "integrity": "sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=v12" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load": { - "version": "15.0.0", - "integrity": "sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/execute-rule": "^15.0.0", - "@commitlint/resolve-extends": "^15.0.0", - "@commitlint/types": "^15.0.0", - "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/load/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/resolve-extends": { - "version": "15.0.0", - "integrity": "sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==", - "dev": true, - "optional": true, - "dependencies": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types": { - "version": "15.0.0", - "integrity": "sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cz-conventional-changelog/node_modules/@commitlint/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { @@ -4843,7 +4559,7 @@ }, "node_modules/cz-conventional-changelog/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { @@ -4857,7 +4573,7 @@ }, "node_modules/cz-conventional-changelog/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { @@ -4866,13 +4582,13 @@ }, "node_modules/cz-conventional-changelog/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/cz-conventional-changelog/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { @@ -4881,7 +4597,7 @@ }, "node_modules/cz-conventional-changelog/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { @@ -5019,6 +4735,27 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/define-properties": { "version": "1.1.3", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", @@ -5070,8 +4807,9 @@ } }, "node_modules/detect-indent": { - "version": "6.0.0", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "engines": { "node": ">=8" @@ -5114,6 +4852,7 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=0.3.1" } @@ -5308,11 +5047,12 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.6", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -6068,7 +5808,7 @@ }, "node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "dependencies": { @@ -6082,7 +5822,7 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "dependencies": { @@ -6158,14 +5898,18 @@ } }, "node_modules/figures": { - "version": "2.0.0", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -6181,11 +5925,39 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/filename-reserved-regex": { @@ -6337,8 +6109,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.6", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -6401,11 +6174,6 @@ "node": ">=12" } }, - "node_modules/fs-extra/node_modules/graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -6605,11 +6373,6 @@ "node": ">=0.10.0" } }, - "node_modules/gh-pages/node_modules/graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/gh-pages/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", @@ -6647,13 +6410,14 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -6683,6 +6447,17 @@ "dev": true, "peer": true }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz", @@ -7042,9 +6817,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { "version": "4.0.1", @@ -7125,6 +6900,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.0", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", @@ -7259,153 +7054,29 @@ "dev": true }, "node_modules/inquirer": { - "version": "6.5.2", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "3.2.0", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.0", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, "node_modules/ip": { @@ -7588,6 +7259,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz", @@ -7804,12 +7484,13 @@ } }, "node_modules/jake": { - "version": "10.8.2", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, @@ -7817,75 +7498,15 @@ "jake": "bin/cli.js" }, "engines": { - "node": "*" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/jake/node_modules/chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jest": { "version": "27.5.1", "resolved": "https://registry.npmmirror.com/jest/-/jest-27.5.1.tgz", @@ -8445,20 +8066,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.5", - "integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.3.5", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", @@ -8739,8 +8346,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -8766,12 +8374,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true, - "optional": true - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", @@ -9052,19 +8654,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "node_modules/listr2/node_modules/rxjs": { - "version": "7.4.0", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "dependencies": { - "tslib": "~2.1.0" - } - }, - "node_modules/listr2/node_modules/tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", @@ -9112,12 +8701,6 @@ "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true, - "optional": true - }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -9125,7 +8708,7 @@ }, "node_modules/lodash.map": { "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, @@ -9181,31 +8764,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -9222,7 +8780,7 @@ }, "node_modules/longest": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", "dev": true, "engines": { @@ -9286,7 +8844,8 @@ "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "node_modules/make-fetch-happen": { "version": "9.1.0", @@ -9511,8 +9070,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9521,9 +9081,13 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minimist-options": { "version": "4.1.0", @@ -9699,8 +9263,9 @@ } }, "node_modules/mute-stream": { - "version": "0.0.7", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "node_modules/naive-ui": { @@ -9731,10 +9296,6 @@ "vue": "^3.0.0" } }, - "node_modules/naive-ui/node_modules/@types/lodash": { - "version": "4.14.181", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" - }, "node_modules/naive-ui/node_modules/evtd": { "version": "0.2.4", "resolved": "https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz", @@ -9748,7 +9309,6 @@ "version": "3.3.4", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10054,6 +9614,14 @@ "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", "dev": true }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -10216,9 +9784,32 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { @@ -10538,7 +10129,6 @@ "node_modules/postcss": { "version": "8.4.14", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "funding": [ { "type": "opencollective", @@ -10575,42 +10165,6 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/postcss-js/node_modules/nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/postcss-js/node_modules/postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-js/node_modules/source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss-less": { "version": "3.1.4", "resolved": "https://registry.npmmirror.com/postcss-less/-/postcss-less-3.1.4.tgz", @@ -11099,42 +10653,6 @@ "purgecss": "bin/purgecss.js" } }, - "node_modules/purgecss/node_modules/nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/purgecss/node_modules/postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/purgecss/node_modules/source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", @@ -11213,6 +10731,42 @@ "lodash.isequal": "^4.5.0" } }, + "node_modules/quill-image-uploader": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.4.tgz", + "integrity": "sha512-ipho6Qpsu4wMlnmrGjlT5C6VzoFag0o2TiOWXR3wJm3g44cG9f5DisPGo7CZkvsCdrxHhNrf2p4BAPWQ4eE8NA==", + "peerDependencies": { + "quill": "^1.3.7" + } + }, + "node_modules/quill-magic-url": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/quill-magic-url/-/quill-magic-url-4.2.0.tgz", + "integrity": "sha512-u1tHwsQjrTczhECNtXK5EUkWwAMb8raLpsU3llqiLu344kPlA9ldoenHvY3XW+yI+2IZ9WgKgRmcy+cKGN3gnQ==", + "dependencies": { + "@types/quill": "^2.0.9", + "normalize-url": "^4.5.1", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-magic-url/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "node_modules/quill-magic-url/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/quill/node_modules/fast-diff": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz", @@ -11244,7 +10798,8 @@ "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/read-pkg": { "version": "5.2.0", @@ -11606,34 +11161,16 @@ } }, "node_modules/restore-cursor": { - "version": "2.0.0", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/retry": { @@ -11702,6 +11239,7 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, "engines": { @@ -11732,21 +11270,14 @@ } }, "node_modules/rxjs": { - "version": "6.6.7", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -12057,7 +11588,6 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12978,6 +12508,14 @@ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", @@ -13109,6 +12647,7 @@ "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", "dev": true, "optional": true, + "peer": true, "dependencies": { "arg": "^4.1.0", "create-require": "^1.1.0", @@ -13135,7 +12674,8 @@ "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "node_modules/tslib": { "version": "2.3.1", @@ -13707,6 +13247,18 @@ "esbuild": "bin/esbuild" } }, + "node_modules/vite-plugin-require-transform": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.6.tgz", + "integrity": "sha512-c5gFkLj7u8mft8KRVPQ25Dy6uuuxy337MVjE66+b/lXd77bwbVeO2w8hSlVcmYK1P2yQzlwF5Qt7mdydLqmbKA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.15.8", + "@babel/parser": "^7.15.8", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, "node_modules/vite-plugin-style-import": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/vite-plugin-style-import/-/vite-plugin-style-import-1.4.1.tgz", @@ -13809,14 +13361,15 @@ } }, "node_modules/vue": { - "version": "3.2.37", - "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", "dependencies": { - "@vue/compiler-dom": "3.2.37", - "@vue/compiler-sfc": "3.2.37", - "@vue/runtime-dom": "3.2.37", - "@vue/server-renderer": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" } }, "node_modules/vue-demi": { @@ -13945,38 +13498,6 @@ "vue": "^3.0.11" } }, - "node_modules/vueuc/node_modules/@types/node": { - "version": "14.18.2", - "integrity": "sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg==" - }, - "node_modules/vueuc/node_modules/seemly": { - "version": "0.3.3", - "integrity": "sha512-mAyqemz41e9HiZPMXAn7NtTExJgztwco5cdZjrt/iViU/oFeav+Q8K1c93M/tIZZ00QkT65JMr4xXQk7Vv5hWQ==", - "dependencies": { - "@types/jest": "^27.0.1" - } - }, - "node_modules/vueuc/node_modules/vdirs": { - "version": "0.1.4", - "integrity": "sha512-g2wJgE8hj/ruqEnGFEXFVC8IR4kRaPDr7Cl+SSy+A8kmNr47rL1l+0wMi51amlrTL6eQsRk+wcl4bjjfPXNzZQ==", - "dependencies": { - "@types/node": "^14.14.10", - "evtd": "^0.2.2" - }, - "peerDependencies": { - "vue": "^3.0.11" - } - }, - "node_modules/vueuc/node_modules/vooks": { - "version": "0.2.10", - "integrity": "sha512-clZkEndDEUyUFP7u1dL0iijcW0p04Hhj50IVcakRrLjQkuZIr7sx6EX9oMyWgrYVjmfdX6vysnCg3OxsYl67jA==", - "dependencies": { - "evtd": "^0.2.2" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -14022,6 +13543,15 @@ "node": ">=10.13.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -14306,6 +13836,7 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -14963,11 +14494,6 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } - }, - "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true } } }, @@ -15073,18 +14599,6 @@ "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, - "@endemolshinegroup/cosmiconfig-typescript-loader": { - "version": "3.0.2", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", - "dev": true, - "optional": true, - "requires": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - } - }, "@esbuild/android-arm": { "version": "0.17.2", "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.2.tgz", @@ -15899,12 +15413,14 @@ "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true }, "@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } @@ -15913,68 +15429,11 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, - "@types/jest": { - "version": "27.0.3", - "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", - "requires": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "27.4.2", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@types/node": { - "version": "17.0.4", - "integrity": "sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==" - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - }, - "diff-sequences": { - "version": "27.4.0", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==" - }, - "jest-diff": { - "version": "27.4.2", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-get-type": { - "version": "27.4.0", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==" - }, - "pretty-format": { - "version": "27.4.2", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "requires": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } - } - } - }, "@types/json-schema": { "version": "7.0.9", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", @@ -15987,8 +15446,7 @@ }, "@types/lodash": { "version": "4.14.182", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", - "dev": true + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" }, "@types/lodash-es": { "version": "4.17.6", @@ -15996,12 +15454,6 @@ "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", "requires": { "@types/lodash": "*" - }, - "dependencies": { - "@types/lodash": { - "version": "4.14.178", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" - } } }, "@types/mdast": { @@ -16051,6 +15503,15 @@ "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", "dev": true }, + "@types/quill": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-2.0.10.tgz", + "integrity": "sha512-L6OHONEj2v4NRbWQOsn7j1N0SyzhRR3M4g1M6j/uuIwIsIW2ShWHhwbqNvH8hSmVktzqu0lITfdnqVOQ4qkrhA==", + "requires": { + "parchment": "^1.1.2", + "quill-delta": "^4.0.1" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz", @@ -16088,13 +15549,15 @@ "@types/yargs": { "version": "16.0.4", "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { "version": "20.2.1", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true }, "@typescript-eslint/eslint-plugin": { "version": "4.33.0", @@ -16297,64 +15760,49 @@ } }, "@vue/compiler-core": { - "version": "3.2.37", - "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.37", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.37", - "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", "requires": { - "@vue/compiler-core": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" } }, "@vue/compiler-sfc": { - "version": "3.2.37", - "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.37", - "@vue/compiler-dom": "3.2.37", - "@vue/compiler-ssr": "3.2.37", - "@vue/reactivity-transform": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" - }, - "dependencies": { - "nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" - }, - "postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - } - }, - "source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" - } } }, "@vue/compiler-ssr": { - "version": "3.2.37", - "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", "requires": { - "@vue/compiler-dom": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" } }, "@vue/devtools-api": { @@ -16371,55 +15819,62 @@ } }, "@vue/reactivity": { - "version": "3.2.37", - "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", "requires": { - "@vue/shared": "3.2.37" + "@vue/shared": "3.2.47" } }, "@vue/reactivity-transform": { - "version": "3.2.37", - "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.37", - "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", "requires": { - "@vue/reactivity": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" } }, "@vue/runtime-dom": { - "version": "3.2.37", - "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", "requires": { - "@vue/runtime-core": "3.2.37", - "@vue/shared": "3.2.37", + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.37", - "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", "requires": { - "@vue/compiler-ssr": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" } }, "@vue/shared": { - "version": "3.2.37", - "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, "@vueup/vue-quill": { - "version": "1.0.0-beta.8", - "integrity": "sha512-3fnIdmnz2ba4dI4WIpudlYoev9r5hrL8NrvhzMXrBj5c5+uEBqM2P48Q+skwToFZjPJT+QDIKiQqY3CXJvpX/Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vueup/vue-quill/-/vue-quill-1.1.0.tgz", + "integrity": "sha512-xr1mx2y+JZClPs/lz+qjvGOWgLqh9SWfm1V+ofsJtuvBnN/h9O/QqJBuVWmdAcB6JGFhIeQcjuA2JgzqX2STjg==", "requires": { "quill": "^1.3.7", "quill-delta": "^4.2.2" @@ -16833,8 +16288,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -16974,6 +16430,12 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "batch-processor": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz", @@ -16993,6 +16455,17 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "blueimp-md5": { "version": "2.19.0", "resolved": "https://registry.npmmirror.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz", @@ -17049,6 +16522,16 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", @@ -17091,8 +16574,9 @@ } }, "cachedir": { - "version": "2.2.0", - "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true }, "call-bind": { @@ -17229,7 +16713,7 @@ }, "chardet": { "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, @@ -17285,13 +16769,20 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-cursor": { - "version": "2.1.0", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, + "cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true + }, "cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -17316,8 +16807,9 @@ } }, "cli-width": { - "version": "2.2.1", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "clipboard": { @@ -17431,73 +16923,38 @@ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "commitizen": { - "version": "4.2.4", - "integrity": "sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", + "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", "dev": true, "requires": { - "cachedir": "2.2.0", - "cz-conventional-changelog": "3.2.0", + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", "dedent": "0.7.0", - "detect-indent": "6.0.0", + "detect-indent": "6.1.0", "find-node-modules": "^2.1.2", "find-root": "1.1.0", - "fs-extra": "8.1.0", - "glob": "7.1.4", - "inquirer": "6.5.2", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", "is-utf8": "^0.2.1", - "lodash": "^4.17.20", - "minimist": "1.2.5", + "lodash": "4.17.21", + "minimist": "1.2.7", "strip-bom": "4.0.0", - "strip-json-comments": "3.0.1" + "strip-json-comments": "3.1.1" }, "dependencies": { "fs-extra": { - "version": "8.1.0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } - }, - "glob": { - "version": "7.1.4", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true } } }, @@ -17589,7 +17046,7 @@ }, "conventional-commit-types": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, @@ -17649,7 +17106,8 @@ "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "cross-spawn": { "version": "7.0.3", @@ -17673,7 +17131,7 @@ }, "crypto-js": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", "dev": true }, @@ -17738,12 +17196,14 @@ } }, "csstype": { - "version": "2.6.19", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "cz-conventional-changelog": { - "version": "3.2.0", - "integrity": "sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", "dev": true, "requires": { "@commitlint/load": ">6.1.1", @@ -17755,167 +17215,9 @@ "word-wrap": "^1.0.3" }, "dependencies": { - "@commitlint/execute-rule": { - "version": "15.0.0", - "integrity": "sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg==", - "dev": true, - "optional": true - }, - "@commitlint/load": { - "version": "15.0.0", - "integrity": "sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg==", - "dev": true, - "optional": true, - "requires": { - "@commitlint/execute-rule": "^15.0.0", - "@commitlint/resolve-extends": "^15.0.0", - "@commitlint/types": "^15.0.0", - "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@commitlint/resolve-extends": { - "version": "15.0.0", - "integrity": "sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg==", - "dev": true, - "optional": true, - "requires": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/types": { - "version": "15.0.0", - "integrity": "sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -17924,7 +17226,7 @@ }, "chalk": { "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { @@ -17935,7 +17237,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -17944,19 +17246,19 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { @@ -18055,6 +17357,23 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + } + } + }, "define-properties": { "version": "1.1.3", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", @@ -18094,8 +17413,9 @@ "dev": true }, "detect-indent": { - "version": "6.0.0", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "detect-newline": { @@ -18125,7 +17445,8 @@ "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "diff-sequences": { "version": "27.5.1", @@ -18292,11 +17613,12 @@ "dev": true }, "ejs": { - "version": "3.1.6", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, "electron-to-chromium": { @@ -18860,7 +18182,7 @@ }, "external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { @@ -18871,7 +18193,7 @@ "dependencies": { "tmp": { "version": "0.0.33", - "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { @@ -18940,8 +18262,9 @@ } }, "figures": { - "version": "2.0.0", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -18957,11 +18280,38 @@ } }, "filelist": { - "version": "1.0.2", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "filename-reserved-regex": { @@ -19085,8 +18435,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.6", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "forever-agent": { "version": "0.6.1", @@ -19117,13 +18468,6 @@ "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - } } }, "fs-minipass": { @@ -19279,11 +18623,6 @@ "pinkie-promise": "^2.0.0" } }, - "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", @@ -19314,15 +18653,26 @@ } }, "glob": { - "version": "7.2.0", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { @@ -19610,9 +18960,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-proxy-agent": { "version": "4.0.1", @@ -19671,6 +19021,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.2.0", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", @@ -19768,121 +19124,26 @@ "dev": true }, "inquirer": { - "version": "6.5.2", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } }, "ip": { @@ -20002,6 +19263,12 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz", @@ -20164,69 +19431,22 @@ } }, "jake": { - "version": "10.8.2", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "async": { - "version": "0.9.2", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true - }, - "chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -20691,14 +19911,6 @@ "semver": "^7.3.2" }, "dependencies": { - "@babel/plugin-syntax-typescript": { - "version": "7.16.5", - "integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.5" - } - }, "semver": { "version": "7.3.5", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", @@ -20926,8 +20138,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonc-parser": { @@ -20943,14 +20156,6 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true, - "optional": true - } } }, "jsonparse": { @@ -21151,19 +20356,6 @@ "version": "2.0.16", "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true - }, - "rxjs": { - "version": "7.4.0", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "requires": { - "tslib": "~2.1.0" - } - }, - "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true } } }, @@ -21202,12 +20394,6 @@ "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, - "lodash.get": { - "version": "4.4.2", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true, - "optional": true - }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -21215,7 +20401,7 @@ }, "lodash.map": { "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, @@ -21259,25 +20445,6 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -21293,7 +20460,7 @@ }, "longest": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", "dev": true }, @@ -21341,7 +20508,8 @@ "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "make-fetch-happen": { "version": "9.1.0", @@ -21504,15 +20672,17 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "minimist-options": { @@ -21641,8 +20811,9 @@ } }, "mute-stream": { - "version": "0.0.7", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "naive-ui": { @@ -21670,10 +20841,6 @@ "vueuc": "^0.4.47" }, "dependencies": { - "@types/lodash": { - "version": "4.14.181", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" - }, "evtd": { "version": "0.2.4", "resolved": "https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz", @@ -21688,8 +20855,7 @@ "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "natural-compare": { "version": "1.4.0", @@ -21927,6 +21093,11 @@ "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", "dev": true }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -22049,9 +21220,26 @@ } } }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, @@ -22279,7 +21467,6 @@ "postcss": { "version": "8.4.14", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -22294,28 +21481,6 @@ "requires": { "camelcase-css": "^2.0.1", "postcss": "^8.1.6" - }, - "dependencies": { - "nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true - }, - "postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - } - }, - "source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true - } } }, "postcss-less": { @@ -22674,28 +21839,6 @@ "glob": "^7.1.7", "postcss": "^8.3.5", "postcss-selector-parser": "^6.0.6" - }, - "dependencies": { - "nanoid": { - "version": "3.1.30", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true - }, - "postcss": { - "version": "8.4.5", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - } - }, - "source-map-js": { - "version": "1.0.1", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true - } } }, "q": { @@ -22763,6 +21906,39 @@ "lodash.isequal": "^4.5.0" } }, + "quill-image-uploader": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.4.tgz", + "integrity": "sha512-ipho6Qpsu4wMlnmrGjlT5C6VzoFag0o2TiOWXR3wJm3g44cG9f5DisPGo7CZkvsCdrxHhNrf2p4BAPWQ4eE8NA==", + "requires": {} + }, + "quill-magic-url": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/quill-magic-url/-/quill-magic-url-4.2.0.tgz", + "integrity": "sha512-u1tHwsQjrTczhECNtXK5EUkWwAMb8raLpsU3llqiLu344kPlA9ldoenHvY3XW+yI+2IZ9WgKgRmcy+cKGN3gnQ==", + "requires": { + "@types/quill": "^2.0.9", + "normalize-url": "^4.5.1", + "quill-delta": "^3.6.2" + }, + "dependencies": { + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + } + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", @@ -22776,7 +21952,8 @@ "react-is": { "version": "17.0.2", "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "read-pkg": { "version": "5.2.0", @@ -23054,27 +22231,13 @@ "dev": true }, "restore-cursor": { - "version": "2.0.0", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } } }, "retry": { @@ -23124,6 +22287,7 @@ }, "run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, @@ -23137,18 +22301,12 @@ } }, "rxjs": { - "version": "6.6.7", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "tslib": "^2.1.0" } }, "safe-buffer": { @@ -23407,8 +22565,7 @@ "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { "version": "0.5.21", @@ -24104,6 +23261,11 @@ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, + "throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", @@ -24210,6 +23372,7 @@ "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", "dev": true, "optional": true, + "peer": true, "requires": { "arg": "^4.1.0", "create-require": "^1.1.0", @@ -24224,7 +23387,8 @@ "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, - "optional": true + "optional": true, + "peer": true } } }, @@ -24667,6 +23831,18 @@ } } }, + "vite-plugin-require-transform": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.6.tgz", + "integrity": "sha512-c5gFkLj7u8mft8KRVPQ25Dy6uuuxy337MVjE66+b/lXd77bwbVeO2w8hSlVcmYK1P2yQzlwF5Qt7mdydLqmbKA==", + "dev": true, + "requires": { + "@babel/generator": "^7.15.8", + "@babel/parser": "^7.15.8", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, "vite-plugin-style-import": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/vite-plugin-style-import/-/vite-plugin-style-import-1.4.1.tgz", @@ -24699,14 +23875,15 @@ } }, "vue": { - "version": "3.2.37", - "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", "requires": { - "@vue/compiler-dom": "3.2.37", - "@vue/compiler-sfc": "3.2.37", - "@vue/runtime-dom": "3.2.37", - "@vue/server-renderer": "3.2.37", - "@vue/shared": "3.2.37" + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" } }, "vue-demi": { @@ -24783,34 +23960,6 @@ "seemly": "^0.3.1", "vdirs": "^0.1.4", "vooks": "^0.2.4" - }, - "dependencies": { - "@types/node": { - "version": "14.18.2", - "integrity": "sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg==" - }, - "seemly": { - "version": "0.3.3", - "integrity": "sha512-mAyqemz41e9HiZPMXAn7NtTExJgztwco5cdZjrt/iViU/oFeav+Q8K1c93M/tIZZ00QkT65JMr4xXQk7Vv5hWQ==", - "requires": { - "@types/jest": "^27.0.1" - } - }, - "vdirs": { - "version": "0.1.4", - "integrity": "sha512-g2wJgE8hj/ruqEnGFEXFVC8IR4kRaPDr7Cl+SSy+A8kmNr47rL1l+0wMi51amlrTL6eQsRk+wcl4bjjfPXNzZQ==", - "requires": { - "@types/node": "^14.14.10", - "evtd": "^0.2.2" - } - }, - "vooks": { - "version": "0.2.10", - "integrity": "sha512-clZkEndDEUyUFP7u1dL0iijcW0p04Hhj50IVcakRrLjQkuZIr7sx6EX9oMyWgrYVjmfdX6vysnCg3OxsYl67jA==", - "requires": { - "evtd": "^0.2.2" - } - } } }, "w3c-hr-time": { @@ -24851,6 +24000,15 @@ "graceful-fs": "^4.1.2" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -25067,7 +24225,8 @@ "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "optional": true + "optional": true, + "peer": true }, "yocto-queue": { "version": "0.1.0", diff --git a/web/package.json b/web/package.json index 7a5d13c..f37f042 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "hotgo", - "version": "2.1.1", + "version": "2.1.3", "author": { "name": "MengShuai", "email": "133814250@qq.com", @@ -30,7 +30,7 @@ "dependencies": { "@vicons/antd": "^0.10.0", "@vicons/ionicons5": "^0.10.0", - "@vueup/vue-quill": "^1.0.0-beta.8", + "@vueup/vue-quill": "^1.1.0", "@vueuse/core": "^5.3.0", "axios": "^0.21.4", "blueimp-md5": "^2.19.0", @@ -46,6 +46,9 @@ "node-sass": "^7.0.3", "pinia": "^2.0.14", "qs": "^6.10.3", + "quill-image-uploader": "^1.2.4", + "quill-magic-url": "^4.2.0", + "throttle-debounce": "^5.0.0", "vfonts": "^0.1.0", "vue": "^3.2.33", "vue-router": "^4.0.15", diff --git a/web/src/api/apply/notice.ts b/web/src/api/apply/notice.ts index 40dd1f9..dc7851c 100644 --- a/web/src/api/apply/notice.ts +++ b/web/src/api/apply/notice.ts @@ -39,3 +39,66 @@ export function View(params) { params, }); } + +// 获取最大排序 +export function MaxSort() { + return http.request({ + url: '/notice/maxSort', + method: 'GET', + }); +} + +export function EditNotify(params) { + return http.request({ + url: '/notice/editNotify', + method: 'POST', + params, + }); +} + +export function EditNotice(params) { + return http.request({ + url: '/notice/editNotice', + method: 'POST', + params, + }); +} + +export function EditLetter(params) { + return http.request({ + url: '/notice/editLetter', + method: 'POST', + params, + }); +} + +export function ReadAll(params) { + return http.request({ + url: '/notice/readAll', + method: 'POST', + params, + }); +} + +export function PullMessages() { + return http.request({ + url: '/notice/pullMessages', + method: 'get', + }); +} + +export function UpRead(params) { + return http.request({ + url: '/notice/upRead', + method: 'POST', + params, + }); +} + +export function MessageList(params) { + return http.request({ + url: '/notice/messageList', + method: 'get', + params, + }); +} diff --git a/web/src/api/apply/provinces.ts b/web/src/api/apply/provinces.ts index 1cc8256..8a710a0 100644 --- a/web/src/api/apply/provinces.ts +++ b/web/src/api/apply/provinces.ts @@ -79,3 +79,25 @@ export function CheckProvincesUniqueId(params) { params, }); } + +/** + * 省市区选项 + */ +export function ProvincesSelect(params) { + return http.request({ + url: '/provinces/select', + method: 'GET', + params, + }); +} + +/** + * 获取指定城市标签 + */ +export function GetCityLabel(params) { + return http.request({ + url: '/provinces/cityLabel', + method: 'GET', + params, + }); +} diff --git a/web/src/api/base/index.ts b/web/src/api/base/index.ts index 0a8e929..be5dbb6 100644 --- a/web/src/api/base/index.ts +++ b/web/src/api/base/index.ts @@ -7,3 +7,12 @@ export function GetCaptcha() { method: 'get', }); } + +// 上传图片 +export function UploadImage(params) { + return http.request({ + url: '/upload/image', + method: 'post', + params, + }); +} diff --git a/web/src/api/curdDemo/index.ts b/web/src/api/curdDemo/index.ts index 9f4c891..eec1805 100644 --- a/web/src/api/curdDemo/index.ts +++ b/web/src/api/curdDemo/index.ts @@ -18,6 +18,7 @@ export function Delete(params) { }); } + // 添加/编辑生成演示 export function Edit(params) { return http.request({ @@ -27,6 +28,7 @@ export function Edit(params) { }); } + // 修改生成演示状态 export function Status(params) { return http.request({ @@ -36,6 +38,7 @@ export function Status(params) { }); } + // 操作生成演示开关 export function Switch(params) { return http.request({ @@ -45,6 +48,7 @@ export function Switch(params) { }); } + // 获取生成演示指定详情 export function View(params) { return http.request({ @@ -54,6 +58,7 @@ export function View(params) { }); } + // 获取生成演示最大排序 export function MaxSort() { return http.request({ @@ -62,7 +67,8 @@ export function MaxSort() { }); } + // 导出生成演示 export function Export(params) { jumpExport('/curdDemo/export', params); -} +} \ No newline at end of file diff --git a/web/src/api/org/user.ts b/web/src/api/org/user.ts index 9f789a1..85fc2b5 100644 --- a/web/src/api/org/user.ts +++ b/web/src/api/org/user.ts @@ -39,3 +39,11 @@ export function ResetPwd(params) { params, }); } + +// 获取可选的后台用户选项 +export function GetMemberOption() { + return http.request({ + url: '/member/option', + method: 'GET', + }); +} diff --git a/web/src/api/system/user.ts b/web/src/api/system/user.ts index c8eff4c..b50b16c 100644 --- a/web/src/api/system/user.ts +++ b/web/src/api/system/user.ts @@ -30,6 +30,60 @@ export function getUserInfo() { }); } +export function updateMemberProfile(params) { + return http.request({ + url: '/member/updateProfile', + method: 'post', + params, + }); +} + +export function updateMemberPwd(params) { + return http.request({ + url: '/member/updatePwd', + method: 'post', + params, + }); +} + +export function updateMemberMobile(params) { + return http.request({ + url: '/member/updateMobile', + method: 'post', + params, + }); +} + +export function updateMemberEmail(params) { + return http.request({ + url: '/member/updateEmail', + method: 'post', + params, + }); +} + +export function SendBindEmail() { + return http.request({ + url: '/ems/sendBind', + method: 'post', + }); +} + +export function SendBindSms() { + return http.request({ + url: '/sms/sendBind', + method: 'post', + }); +} + +export function updateMemberCash(params) { + return http.request({ + url: '/member/updateCash', + method: 'post', + params, + }); +} + /** * @description: 用户登录 */ diff --git a/web/src/components/CitySelector/citySelector.vue b/web/src/components/CitySelector/citySelector.vue new file mode 100644 index 0000000..d30be31 --- /dev/null +++ b/web/src/components/CitySelector/citySelector.vue @@ -0,0 +1,105 @@ + + + diff --git a/web/src/components/CitySelector/props.ts b/web/src/components/CitySelector/props.ts new file mode 100644 index 0000000..f4f21ee --- /dev/null +++ b/web/src/components/CitySelector/props.ts @@ -0,0 +1,22 @@ +import type { PropType } from 'vue'; +import { NCascader } from 'naive-ui'; + +export const basicProps = { + ...NCascader.props, + defaultValue: { + type: [Number, String, Array], + default: null, + }, + value: { + type: [Number, String, Array], + default: null, + }, + dataType: { + type: String as PropType<'p' | 'pc' | 'pca'>, + default: 'pca', + }, + checkStrategy: { + type: String as PropType<'child' | 'all'>, + default: 'child', + }, +}; diff --git a/web/src/components/Editor/editor.vue b/web/src/components/Editor/editor.vue index 23045c5..c68ba75 100644 --- a/web/src/components/Editor/editor.vue +++ b/web/src/components/Editor/editor.vue @@ -1,11 +1,15 @@ @@ -13,40 +17,27 @@ import { ref, watch, onMounted } from 'vue'; import { QuillEditor } from '@vueup/vue-quill'; import '@vueup/vue-quill/dist/vue-quill.snow.css'; + import ImageUploader from 'quill-image-uploader'; + import MagicUrl from 'quill-magic-url'; import { getRandomString } from '@/utils/charset'; + import { UploadImage } from '@/api/base'; + import componentSetting from '@/settings/componentSetting'; + import { isNullOrUnDef } from '@/utils/is'; + import { useMessage } from 'naive-ui'; + export interface Props { value: string; + id?: string; } const emit = defineEmits(['update:value']); - const quillEditorId = ref('quillEditorId-' + getRandomString(16, true)); + const message = useMessage(); + const initFinish = ref(false); const quillEditor = ref(); const content = ref(); - const props = withDefaults(defineProps(), { value: '' }); - const options = ref({ - modules: { - toolbar: [ - ['bold', 'italic', 'underline', 'strike'], // toggled buttons - ['blockquote', 'code-block'], - - [{ header: 1 }, { header: 2 }], // custom button values - [{ list: 'ordered' }, { list: 'bullet' }], - [{ script: 'sub' }, { script: 'super' }], // superscript/subscript - [{ indent: '-1' }, { indent: '+1' }], // outdent/indent - [{ direction: 'rtl' }], // text direction - - [{ size: ['small', false, 'large', 'huge'] }], // custom dropdown - [{ header: [1, 2, 3, 4, 5, 6, false] }], - - [{ color: [] }, { background: [] }], // dropdown with defaults from theme - [{ font: [] }], - [{ align: [] }], - ['clean'], - ['image'], - ], - }, - theme: 'snow', - placeholder: '输入您要编辑的内容!', + const props = withDefaults(defineProps(), { + value: '', + id: 'quillEditorId-' + getRandomString(16, true), }); function readyQuill() { @@ -54,20 +45,41 @@ } watch( - () => content.value, - (_newValue, _oldValue) => { - if (quillEditor.value !== undefined) { - emit('update:value', quillEditor.value.getHTML()); + () => props.value, + (newValue) => { + if (!initFinish.value) { + quillEditor.value?.setHTML(newValue); } }, { - immediate: true, // 深度监听 + immediate: true, + deep: true, } ); + function onEditorFocus(val) { + initFinish.value = true; + console.log(val); + } + + function onEditorBlur(val) { + console.log(val); + } + + function onUpdateContent() { + emit('update:value', quillEditor.value.getHTML()); + } + + function checkFileType(map: string[], fileType: string) { + if (isNullOrUnDef(map)) { + return true; + } + return map.includes(fileType); + } + onMounted(async () => { // 兼容表单分组 n-form-item-blank - let dom = document.getElementById(quillEditorId.value); + let dom = document.getElementById(props.id); if (dom && dom.parentNode) { const parent = dom.parentNode as Element; if ('n-form-item-blank' === parent.className) { @@ -75,10 +87,64 @@ } } }); + + const modules = [ + { + name: 'imageUploader', + module: ImageUploader, + options: { + upload: (file) => { + return new Promise((resolve, reject) => { + if (!checkFileType(componentSetting.upload.imageType, file.type)) { + message.error(`只能上传图片类型为${componentSetting.upload.imageType.join(',')}`); + reject('Upload failed'); + return; + } + + const formData = new FormData(); + formData.append('file', file); + UploadImage(formData) + .then((res) => { + console.log(res); + resolve(res.fileUrl); + }) + .catch((err) => { + reject('Upload failed'); + console.error('Error:', err); + }); + }); + }, + }, + }, + { + name: 'magicUrl', + module: MagicUrl, + }, + ]; - diff --git a/web/src/components/Form/src/BasicForm.vue b/web/src/components/Form/src/BasicForm.vue index 37a3695..9c0b9c1 100644 --- a/web/src/components/Form/src/BasicForm.vue +++ b/web/src/components/Form/src/BasicForm.vue @@ -60,7 +60,7 @@ v-bind="getComponentProps(schema)" :is="schema.component" v-model:value="formModel[schema.field]" - :class="{ isFull: schema.isFull != false && getProps.isFull }" + :class="{ isFull: schema.isFull !== false && getProps.isFull }" /> diff --git a/web/src/views/curdDemo/edit.vue b/web/src/views/curdDemo/edit.vue index cf819c6..9dbaabd 100644 --- a/web/src/views/curdDemo/edit.vue +++ b/web/src/views/curdDemo/edit.vue @@ -1,74 +1,84 @@ - + \ No newline at end of file diff --git a/web/src/views/curdDemo/index.vue b/web/src/views/curdDemo/index.vue index 5c34032..607bd04 100644 --- a/web/src/views/curdDemo/index.vue +++ b/web/src/views/curdDemo/index.vue @@ -2,8 +2,8 @@
- - + +
@@ -28,7 +44,7 @@ import { genInfoObj, selectListObj } from '@/views/develop/code/components/model'; import { ColumnList } from '@/api/develop/code'; import { NButton, NCheckbox, NInput, NSelect, NTooltip, NTreeSelect } from 'naive-ui'; - import { HelpCircleOutline } from '@vicons/ionicons5'; + import { HelpCircleOutline, Reload } from '@vicons/ionicons5'; import { renderIcon } from '@/utils'; import { cloneDeep } from 'lodash-es'; @@ -64,14 +80,26 @@ const columns = ref([]); const show = ref(false); const dataSource = ref(formValue.value.masterColumns); + + async function reloadFields(loading = false) { + if (loading) { + show.value = true; + } + + formValue.value.masterColumns = await ColumnList({ + name: formValue.value.dbName, + table: formValue.value.tableName, + }); + dataSource.value = formValue.value.masterColumns; + if (loading) { + show.value = false; + } + } + onMounted(async () => { show.value = true; if (formValue.value.masterColumns.length === 0) { - formValue.value.masterColumns = await ColumnList({ - name: formValue.value.dbName, - table: formValue.value.tableName, - }); - dataSource.value = formValue.value.masterColumns; + await reloadFields(); } columns.value = [ diff --git a/web/src/views/develop/code/components/model.ts b/web/src/views/develop/code/components/model.ts index 85591a0..b4099f5 100644 --- a/web/src/views/develop/code/components/model.ts +++ b/web/src/views/develop/code/components/model.ts @@ -20,6 +20,7 @@ export interface joinAttr { export const genInfoObj = { id: 0, genType: 10, + genTemplate: null, varName: '', options: { headOps: ['add', 'batchDel', 'export'], diff --git a/web/src/views/develop/code/deploy.vue b/web/src/views/develop/code/deploy.vue index 0e33085..cdcd539 100644 --- a/web/src/views/develop/code/deploy.vue +++ b/web/src/views/develop/code/deploy.vue @@ -44,9 +44,7 @@ 提交生成 - 仅保存配置 + 仅保存配置 @@ -217,12 +215,17 @@ positiveText: '确定', negativeText: '取消', onPositiveClick: () => { - Build(genInfo.value).then((_res) => { - setTimeout(function () { - location.reload(); - }, 1500); - message.success('生成提交成功,即将刷新页面..'); - }); + formBtnLoading.value = true; + Build(genInfo.value) + .then((_res) => { + setTimeout(function () { + location.reload(); + }, 1500); + message.success('生成提交成功,即将刷新页面..'); + }) + .finally(() => { + formBtnLoading.value = false; + }); }, onNegativeClick: () => { // message.error('取消'); diff --git a/web/src/views/develop/code/index.vue b/web/src/views/develop/code/index.vue index 89cceb8..f21e201 100644 --- a/web/src/views/develop/code/index.vue +++ b/web/src/views/develop/code/index.vue @@ -62,6 +62,16 @@ placeholder="请选择" :options="selectList.genType" v-model:value="formParams.genType" + :on-update:value="onUpdateValueGenType" + /> + + + + @@ -447,6 +457,21 @@ formParams.value.daoName = option?.daoName as string; formParams.value.tableComment = option?.defTableComment as string; } + + const genTemplateOptions = ref([]); + function onFocusGenTemplate() { + for (let i = 0; i < selectList.value.genType?.length; i++) { + if (selectList.value.genType[i].value === formParams.value.genType) { + genTemplateOptions.value = selectList.value.genType[i].templates; + formParams.value.genTemplate = null; + } + } + } + + function onUpdateValueGenType(value) { + formParams.value.genType = value; + onFocusGenTemplate(); + } diff --git a/web/src/views/home/account/BasicSetting.vue b/web/src/views/home/account/BasicSetting.vue new file mode 100644 index 0000000..87e9c58 --- /dev/null +++ b/web/src/views/home/account/BasicSetting.vue @@ -0,0 +1,206 @@ + + + diff --git a/web/src/views/home/account/CashSetting.vue b/web/src/views/home/account/CashSetting.vue new file mode 100644 index 0000000..c1d516e --- /dev/null +++ b/web/src/views/home/account/CashSetting.vue @@ -0,0 +1,121 @@ + + + diff --git a/web/src/views/home/account/SafetySetting.vue b/web/src/views/home/account/SafetySetting.vue new file mode 100644 index 0000000..6451d5a --- /dev/null +++ b/web/src/views/home/account/SafetySetting.vue @@ -0,0 +1,317 @@ + + + diff --git a/web/src/views/setting/account/account.vue b/web/src/views/home/account/account.vue similarity index 82% rename from web/src/views/setting/account/account.vue rename to web/src/views/home/account/account.vue index b2a2995..f39c937 100644 --- a/web/src/views/setting/account/account.vue +++ b/web/src/views/home/account/account.vue @@ -1,8 +1,8 @@