diff --git a/docs/guide-zh-CN/images/sys-db-by.png b/docs/guide-zh-CN/images/sys-db-by.png
new file mode 100644
index 0000000..4dd6c3e
Binary files /dev/null and b/docs/guide-zh-CN/images/sys-db-by.png differ
diff --git a/docs/guide-zh-CN/images/sys-db-by2.png b/docs/guide-zh-CN/images/sys-db-by2.png
new file mode 100644
index 0000000..bf25dfa
Binary files /dev/null and b/docs/guide-zh-CN/images/sys-db-by2.png differ
diff --git a/docs/guide-zh-CN/images/sys-library-dict.png b/docs/guide-zh-CN/images/sys-library-dict.png
new file mode 100644
index 0000000..421973f
Binary files /dev/null and b/docs/guide-zh-CN/images/sys-library-dict.png differ
diff --git a/docs/guide-zh-CN/images/sys-middleware-com-response.png b/docs/guide-zh-CN/images/sys-middleware-com-response.png
new file mode 100644
index 0000000..26d46a5
Binary files /dev/null and b/docs/guide-zh-CN/images/sys-middleware-com-response.png differ
diff --git a/docs/guide-zh-CN/images/sys-middleware-error-log.png b/docs/guide-zh-CN/images/sys-middleware-error-log.png
new file mode 100644
index 0000000..224dfb5
Binary files /dev/null and b/docs/guide-zh-CN/images/sys-middleware-error-log.png differ
diff --git a/docs/guide-zh-CN/start-deploy.md b/docs/guide-zh-CN/start-deploy.md
new file mode 100644
index 0000000..decee16
--- /dev/null
+++ b/docs/guide-zh-CN/start-deploy.md
@@ -0,0 +1,108 @@
+## 生产部署
+
+目录
+
+- 编译配置
+- 编译
+- 修改生产配置文件
+- 启动服务
+- Nginx配置
+
+### 编译配置
+
+- 配置文件:server/hack/config.yaml,以下是默认配置
+```yaml
+gfcli:
+ build:
+ name: "hotgo" # 编译后的可执行文件名称
+ # arch: "all" #不填默认当前系统架构,可选:386,amd64,arm,all
+ # system: "all" #不填默认当前系统平台,可选:linux,darwin,windows,all
+ mod: "none"
+ cgo: 0
+ packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署
+ packDst: "internal/packed/packed.go" # 打包后生成的Go文件路径,一般使用相对路径指定到本项目目录中
+ version: ""
+ output: "./temp/hotgo" # 可执行文件生成路径
+ extra: ""
+```
+
+
+### 编译
+
+- 以下方式任选其一即可
+
+1、 make一键编译 (确认已安装`make环境`)
+```shell
+cd server && make build
+```
+
+2、 按步骤手动编译
+```shell
+cd server # 切换到服务端目录下
+rm -rf ./resource/public/admin/ # 删除之前的web资源
+mkdir ./resource/public/admin/ # 重新创建web资源存放目录,除首次编译后续可以跳过执行此步骤
+cd ../web && pnpm run build # 切换到web项目下,编译web项目
+\cp -rf ./dist/* ../server/resource/public/admin/ # 将编译好的web资源复制到server对应的资源存放路径下
+cd ../server # 切换回服务端目录下
+echo "y" | gf build # 编译hotgo服务端
+
+# 不出意外你已经编译好了hotgo可执行文件!
+```
+
+3、分端编译 (多人开发时推荐)
+```shell
+# 编译服务端
+cd server # 切换到服务端目录下
+rm -rf ./resource/public/admin/ # 删除之前的web资源,如果开发环境没有这个目录可以忽略此步骤
+echo "y" | gf build # 编译hotgo服务端
+
+# 编译web端
+cd web
+pnpm run build 或 npm run build
+
+# web端编译完成后,将web/dist/*中的文件上传到`server`端线上运行目录:/resource/public/admin即可
+# 至此,web端和server端都可以独立覆盖更新
+```
+
+
+### 修改生产配置文件
+- 配置文件:server/manifest/config/config.yaml
+> 如关闭debug、mode设为生产环境、修改数据库地址、缓存驱动、队列驱动、日志路径等
+
+
+
+### 启动服务
+> 这里可以接使用gf官方推荐的启动方式,请参考:https://goframe.org/pages/viewpage.action?pageId=1114403
+
+
+### Nginx配置
+```
+ # websocket
+ location = /socket {
+ proxy_pass http://127.0.0.1:8000/socket;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $host;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+ proxy_connect_timeout 600s;
+ proxy_read_timeout 600;
+ proxy_send_timeout 600s;
+ }
+
+ # http
+ location ^~ / {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_pass http://127.0.0.1:8000/;
+ proxy_redirect off;
+ proxy_buffering off;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection upgrade;
+ }
+```
diff --git a/docs/guide-zh-CN/start-environment.md b/docs/guide-zh-CN/start-environment.md
new file mode 100644
index 0000000..7ceabb1
--- /dev/null
+++ b/docs/guide-zh-CN/start-environment.md
@@ -0,0 +1,31 @@
+## 环境搭建
+
+目录
+
+- 前端环境
+- 后端环境
+- 使用说明
+
+### 前端环境
+
+1. 前往https://nodejs.org/zh-cn/下载当前版本node
+2. 命令行运行 `node -v` 若控制台输出版本号则node安装成功
+3. node 版本需大于等于 `16.0`
+4. 安装pnpm:`npm install -g pnpm`
+5. 命令行运行 `pnpm -v` 若控制台输出版本号则前端环境搭建成功
+
+### 后端环境
+1. 下载golang安装 版本号需>=1.23
+2. 国际: https://golang.org/dl/
+3. 国内: https://golang.google.cn/dl/
+4. 命令行运行 go 若控制台输出各类提示命令 则安装成功 输入 `go version` 确认版本大于1.23
+5. 开发工具推荐 [Goland](https://www.jetbrains.com/go/)
+
+### 使用说明
+
+> 需要本地具有 git node golang 环境
+
+- node版本 >= 20.0.0
+- golang版本 >= 1.23
+- mysql版本 >= 5.7,引擎需要是 innoDB 或 postgresql版本 >=14
+- IDE推荐:Goland
diff --git a/docs/guide-zh-CN/start-installation.md b/docs/guide-zh-CN/start-installation.md
new file mode 100644
index 0000000..e527318
--- /dev/null
+++ b/docs/guide-zh-CN/start-installation.md
@@ -0,0 +1,107 @@
+## 系统安装
+
+目录
+
+- 环境要求
+- 安装
+
+### 环境要求
+
+- node版本 >= v20.0.0
+- golang版本 >= v1.23
+- goframe版本 >=v2.9.4
+- mysql版本 >=5.7 或 postgresql版本 >=14
+
+> 必须先看[环境搭建文档](start-environment.md),如果安装遇到问题务必先查看[常见问题文档](start-issue.md)
+
+### 安装
+
+
+一、克隆项目
+
+```
+git clone https://github.com/bufanyun/hotgo.git && cd hotgo
+```
+
+二、配置你的站点信息
+
+1、服务端:
+- 项目数据库文件 `storage/data/hotgo.sql` 创建数据库并导入
+- 将配置文件 `manifest/config/config.example.yaml` 复制后改为`manifest/config/config.yaml`
+- 将`manifest/config/config.yaml`中的`database.default.link`数据库配置改为你自己的:
+```yaml
+# Database. 配置参考:https://goframe.org/pages/viewpage.action?pageId=1114245
+database:
+ logger:
+ path: "logs/database" # 日志文件路径。默认为空,表示关闭,仅输出到终端
+ <<: *defaultLogger
+ stdout: true
+ default:
+# link: "mysql:账号:密码@tcp(127.0.0.1:3306)/数据库名?loc=Local&parseTime=true&charset=utf8mb4"
+ link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true&charset=utf8mb4"
+ debug: true
+ Prefix: "hg_"
+```
+
+- 将`hack/config.yaml`中的`gfcli.gen.dao[0].link`数据库配置改为你自己的:
+```yaml
+gfcli:
+ gen:
+ dao:
+ - link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true&charset=utf8mb4"
+ group: "default" # 分组 使用hotgo代码生成功能时必须填
+ # tables: "" # 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。
+ tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。
+ removePrefix: "hg_"
+ descriptionTag: true
+ noModelComment: true
+ jsonCase: "CamelLower"
+ gJsonSupport: true
+ clear: false
+```
+
+2、web前端:
+- 配置服务端地址,包含在以下文件中:
+* /hotgo/web/.env.development
+* /hotgo/web/.env.production
+* /hotgo/web/.env
+
+
+三、 启动服务
+
+1、服务端:
+```shell
+ cd server
+
+ # 设置国内代理,如果已经设置好了代理可以跳过
+ go env -w GOPROXY=https://goproxy.io,direct
+
+ # 更新包
+ go mod tidy
+
+ # 查看命令行方法
+ go run main.go help
+
+ # 启动所有服务
+ go run main.go # 热编译启动: gf run main.go
+```
+
+2、web前端:
+```shell
+ cd web
+ # 首先确定你以安装node16.0以上版本并安装了包[npm、pnpm],否则可能会出现一些未知报错
+
+ # 安装依赖
+ pnpm install
+
+ # 启动web项目
+ pnpm run dev
+
+ # 如果顺利,至此到浏览器打开:http://你的IP:8001/admin
+ # 登录账号:admin, 密码:123456
+```
+
+
+
+
+
diff --git a/docs/guide-zh-CN/start-issue.md b/docs/guide-zh-CN/start-issue.md
new file mode 100644
index 0000000..08017c0
--- /dev/null
+++ b/docs/guide-zh-CN/start-issue.md
@@ -0,0 +1,93 @@
+## 常见问题
+
+目录
+
+- 一、后台相关
+- 二、数据库相关
+- 三、环境相关
+
+
+### 一、后台相关
+
+#### 1、连接超时,请刷新重试。如仍未解决请检查websocket连接是否正确!
+
+线上或非本地运行时,请到 系统设置 -> 配置管理 -> 基本设置 -> 找到网站域名和websocket地址,改成你自己实际的地址,保存刷新页面即可
+
+#### 2、web页面菜单切换后页面出现白屏
+
+请参考:https://github.com/jekip/naive-ui-admin/issues/183
+
+
+### 二、数据库相关
+
+#### 1、安装数据库出现 json 报错不支持
+
+请安装 mysql5.7 及以上版本的数据库。如果你使用的是mariadb请确认版本号,mariadb从 10.2 版本开始支持 json 数据类型。
+
+
+
+### 三、环境相关
+
+#### 1、not found in resource manager or following system searching paths
+
+> 报错信息:panic: possible config files "config" or "config.toml/yaml/yml/json/ini/xml/properties" not found in resource manager or following system searching paths:
+
+系统没有找到配置文件,将配置文件 `manifest/config/config.yaml.bak` 复制后改为`manifest/config/config.yaml`
+
+
+#### 2、net.DialTimeout failed with network
+
+> 报错信息:connect to 127.0.0.1:8099 error: net.DialTimeout failed with network "tcp", address "127.0.0.1:8099", timeout "10s": dial tcp
+
+- http服务没有启动或正在启动
+- 通过一键启动所有服务运行时属正常情况,多服务启动时存在先后顺序问题,`tcpClient`比`tcpServer`先启动完成导致的,等`tcpServer`启动完成后会自动重连
+
+详细请参考 - [系统安装](start-installation.md)
+
+
+#### 3、cannot find "hack/config.yaml" in following paths:
+> 报错信息:get cli configuration file:hack/config.yaml, err:cannot find "hack/config.yaml" in following paths:
+
+系统运行目录下配置hack/config.yaml文件。如果是生产环境运行,并且不需要开发工具相关功能,可以将`manifest/config/config.yaml`配置文件中的`system.mode`值改为`product`,这样启动时不会加载开发工具相关功能
+
+#### 4、非超管角色提示:你没有访问权限!
+
+
+此问题因当前角色访问的页面包含未分配权限的接口所致,在多角色场景中较为常见,解决步骤如下:
+
+1. 定位缺失权限的接口
+- 用超管账号进入系统应用 -> 日志管理 -> 全局日志,搜索状态码为`62 无访问权限`的记录
+- 示例:若请求接口为`/admin/hgexample/treeTable/list`,需处理的权限路径为`/hgexample/treeTable/list`(去除`/admin`前缀)
+
+
+
+假如查到请求接口是:`/admin/hgexample/treeTable/list`,那需要分配的菜单权限就是:`/hgexample/treeTable/list`,要把`/admin`去掉
+
+2. 配置菜单权限
+- 进入权限管理 -> 菜单权限:
+- 若目标菜单不存在,先新增菜单
+- 若菜单已存在但未配置接口权限,就把步骤1中的权限路径添加到【分配权限】中(已配置则跳过)
+
+
+
+3. 分配权限给角色
+- 进入权限管理 -> 角色权限,找到对应角色并点击【菜单权限】
+- 勾选步骤2中配置的菜单权限,保存即可
+
+
+
+### 四、前端相关
+
+#### 1、Error: connect ECONNREFUSED ::1:8000
+
+```text
+11:44:52 [vite] http proxy error at /member/info:
+Error: connect ECONNREFUSED ::1:8000
+ at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1246:16)
+```
+
+- 服务端没有启动
+- `.\wen\.env.development`中的`VITE_PROXY`配置的服务器地址或端口与实际不一致
+
+
+
diff --git a/docs/guide-zh-CN/start-questions.md b/docs/guide-zh-CN/start-questions.md
new file mode 100644
index 0000000..39374f2
--- /dev/null
+++ b/docs/guide-zh-CN/start-questions.md
@@ -0,0 +1,21 @@
+## 如何提问
+
+#### 说明环境情况
+
+- 平台: windows/linux
+- 软件与版本:golang 1.19, Mysql 5.7 ...
+- 系统版本:hotgo 2.6.2
+
+#### 你做了什么?
+
+- 我按文档(附链接)上写了一个控制器xxx,代码如下:xxxx
+- 然后我使用xxx访问
+- 这其中我还做了啥
+- ...
+
+#### 出现什么错误?
+
+- 当我试图xxx的时候,xxx报了如下错误:(截图)
+- 我确认过我的目录权限是正确的,xxx是正确的(必要时带上截图)
+
+以上是举例提问时所应该描述的情况,当别人看到详细的情况时,也便于快速定位问题所在。
\ No newline at end of file
diff --git a/docs/guide-zh-CN/start-update-log.md b/docs/guide-zh-CN/start-update-log.md
new file mode 100644
index 0000000..6711f6c
--- /dev/null
+++ b/docs/guide-zh-CN/start-update-log.md
@@ -0,0 +1,333 @@
+## 更新历史
+
+升级说明:
+
+> 创建一个Git版本库,并创建二个分支比如A、B,A分支默认为你的二开分支、B分支为你的版本库分支。
+> 等需要升级的时候,把版本库分支(B)升级为最新的版本,然后切换到A分支,把B分支合并过来,解决掉合并冲突即可。
+
+注意:
+
+> 各个小版本升级例如 2.1.x 升级到 2.2.x 以上不能完美升级最好重新安装
+
+> 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整
+
+
+### v2.18.9
+updated 2026.5.9
+
+- 新增:新增 `AGENTS.md` 项目开发规范,统一前后端开发约定,作为 AI 辅助开发的唯一事实来源
+- 优化:naive-ui版本升级到2.44.1
+- 优化:gf版本升级到v2.10.0
+
+
+### v2.18.6
+updated 2025.10.25
+
+- 新增:国际化(i18n)支持,内置简体中文、繁体中文、英文三种语言包
+- 新增:附件管理支持外链图片转存至系统存储驱动
+- 优化:全局微信公众号实例初始化逻辑,`AccessToken` 获取方式调整为稳定版接口
+- 优化:菜单权限搜索功能,支持按菜单名称或路由地址进行检索
+- 优化:角色权限管理中的菜单权限分配交互体验
+- 优化:naive-ui版本升级到2.43.1
+- 优化:gf版本升级到v2.9.4
+- 修复:删除角色导致关联用户无法登录的问题,新增角色删除前置校验(检查是否存在关联用户)
+
+
+### v2.17.8
+updated 2025.7.13
+
+- 优化:表格排序处理器兼容关联表别名
+- 优化:优化动态统计数字在0值时显示问题
+- 优化:优化首页快捷菜单点击事件范围
+- 优化:优化短信、邮件验证码相关验证类数据排序
+- 优化:优化Nginx配置,支持流式请求和兼容部分版本无法匹配到websocket规则问题
+- 优化:naive-ui版本升级到2.42.0
+- 优化:vue3-json-viewer版本升级到2.4.1
+- 修复:修复可选用户选项`Fields`生成错误问题
+
+
+### v2.16.10
+updated 2025.3.22
+
+- 增加:增加组合下拉用户筛选组件
+- 优化:文件上传类型限制改为统一由后台配置控制
+- 优化:websocket重连时间调整为10秒,初始化数据库中的网站地址调整为`127.0.0.1`
+- 优化:优化访问日志字段展示方式
+- 优化:系统公告发送编辑模态框调整为抽屉
+- 优化:gf版本升级到v2.9.0
+- 优化:naive-ui版本升级到2.41.0
+- 修复:修复vue路由`Redirect`命名重复问题
+- 修复:优化代码生成在插件中`使用生成字典选项`时model包名重复问题
+
+
+### v2.15.11
+updated 2024.11.27
+
+- 增加:增加配置管理子页面选项参数记忆
+- 修复:修复定时任务中日志配置的读取并发读问题
+- 优化:gf版本升级到v2.8.2
+- 优化:优化数据卡片展示
+
+
+### v2.15.7
+updated 2024.7.21
+
+- 增加:访问日志、服务日志增加关键词搜索
+- 增加:web端增加字典状态管理,重构字典选项使用方式,大幅减少冗余代码
+- 修复:修复生成代码选项式树表已知的一些小bug
+- 优化:gf版本升级到v2.7.2
+- 优化:naive-ui版本升级到2.39.0
+- 优化:访问日志不再记录过大的请求头参数,减少日志大小
+
+
+### v2.15.1
+updated 2024.4.22
+
+- 增加:生成代码增加树表生成、字段排序、字段重置、操作人维护,调整关联表生成方式
+- 增加:角色菜单权限增加一键导入支持
+- 增加:访问日志增加忽略请求方式
+- 增加:插件生成增加`consts`目录维护
+- 增加:IP归属地定位增加默认重试,增加新的缓存机制
+- 增加:登录日志增加UA信息、IP归属信息,解藕访问日志
+- 增加:消息队列`rocketmq`驱动更新版本问题,增加延迟队列,支持自动创建主题
+- 增加:部门增加类型支持,通过部门类型实现多租户业务支持
+- 增加:增加多租户业务开发演示
+- 修复:修复部门列表搜索算法在部分情况下无效问题
+- 修复:修复短信、邮件IP发送数量限制
+- 修复:修复分布式锁内存泄漏问题
+- 优化:gf版本升级到v2.7.0
+- 优化:naive-ui版本升级到2.38.1
+- 优化:优化`cmd`服务退出流程
+- 优化:优化生成代码格式化和移除未使用的包
+- 优化:服务端配置文件参数`hotgo`改为`system`
+- 优化:web端表格/表单增加自适应宽度计算
+- 优化:日期选择组件不再使用默认值
+- 优化:优化菜单添加/编辑表单,使其操作更加简单方便
+
+
+### v2.13.1
+updated 2024.3.7
+
+- 增加:增加内置数据字典类型:`枚举字典`和`自定义方法字典`,支持代码生成时关联选项使用
+- 增加:增加大文件上传,支持分片上传、断点续传,存储驱动已适配`本地存储`
+- 增加:插件模块增加停止服务回调接口,调整静态资源默认存放位置,创建插件选项增加可选扩展功能
+- 增加:功能案例插件增加`30+`常用组件示例,增加`websocket`消息收发测试
+- 增加:文档增`加功能扩展库`、`websocket服务器`、`websocket客户端`使用说明,当前版本文档已完善
+- 修复:修复省市区无法添加地区问题
+- 优化:gf版本升级到v2.6.4
+- 优化:优化缓存组件依赖关系
+- 优化:调整部分前端表格自适应宽度
+- 优化:HTTP错误码接管统一改为由响应中间件处理
+
+### v2.12.1
+updated 2023.12.29
+
+- 修复:修复访问日志权限过滤
+- 优化:gf版本升级到v2.6.1
+- 优化:naive-ui版本升级到2.36.0,vue版本升级到3.4.0,vite版本升级到4.2.7
+- 优化:优化curd代码生成,编辑表单增加自适应,详情改为`抽屉`,修复菜单权限关系树,简化`State`
+- 优化:优化字典编辑和查询
+- 优化:优化角色列表数据加载缓慢问题
+
+### v2.11.5
+updated 2023.11.25
+
+- 增加`minio`上传驱动支持
+- 增加定时任务调度日志,增加同方法多任务支持
+- 增加gf运行模式控制,生产环境时隐藏开发相关菜单
+- 增加树形表格新增/修改自动维护上下级关系通用处理
+- 增加树形表格使用例子
+- 优化:gf版本升级到v2.5.7
+- 优化`websocket`默认路径配置
+- 优化预处理中间件错误码跟随
+- 优化插件静态目录为可选项
+- 修复升级gf版本后服务日志记录内容为空问题
+- 修复角色权限选择数据重复问题
+- 修复服务日志无日志内容问题
+- 修复用户批量删除可以删除超管问题
+- 修复代码生成时偶尔找不到主键索引问题
+- 修复树形选项组件在`BasicForm`无法使用问题
+- 修复表格批量删除重复传参问题
+- 修复文件缓存`GetOrSet`和`GetOrSetFunc`缓存过期不刷新问题
+
+### v2.9.8
+updated 2023.10.21
+
+- 优化:gf版本升级到v2.5.5
+- 优化:优化代码生成表单滑动
+- 优化:优化字典列表编辑生效时机
+- 修复:修复日期组件默认值无效问题
+### v2.9.3
+updated 2023.10.08
+
+- 优化:gf版本升级到v2.5.4
+- 优化:优化上传文件资源复用策略
+- 修复:修复登录角色的部门状态检查
+- 修复:修复配置参数`exceptLogin`命名
+
+### v2.8.9
+updated 2023.09.06
+
+- 优化:gf版本升级到v2.5.2
+- 优化:优化代码生成,自定义模板时自动过滤前缀,菜单权限生成预检查
+- 优化:服务日志内容长度超出最大限制截取
+- 修复:修复tcp服务器定时任务执行异常
+- 修复:修复文件选择器错误传参导致的显示异常问题
+
+### v2.8.4
+updated 2023.07.20
+
+- 增加:增加输入预处理中间件
+- 增加:增加文件选择器
+- 增加:增加在线服务监控,服务许可证管理
+- 增加:TCP服务器增加RPC路由消息注册、路由分发、拦截器注册,更方便的进行应用开发
+- 优化:gf版本升级到v2.5.0
+- 优化:优化CURD代码生成,简化控制器代码逻辑,升级列表数据查询方式
+- 修复:修复角色菜单子权限取消导致父级权限失效问题
+- 修复:修复上传驱动路径错误
+- 修复:修复CURD代码生成时间类型字段默认值获取异常
+
+### v2.7.6
+updated 2023.06.19
+
+- 优化:gf版本升级到v2.4.3
+- 修复:部门管理查询空指针问题
+- 优化:附件md5生成方式调整(与更新前已上传的文件md5不兼容,如果业务有影响请注意调整)
+
+### v2.7.3
+updated 2023.05.14
+
+- 增加:增加注册、手机号登录、二维码邀请注册功能
+- 优化:优化管理员业务模块验证唯一属性接口,将登录相关功能拆分到管理员基础模块中
+- 移除:移除web端mock插件
+
+### v2.6.10
+updated 2023.05.12
+
+- 增加:增加jwt+缓存驱动实现的令牌认证,支持自动续约、可控过期失效策略
+- 移除:移除旧jwt功能库
+- 移除:移除`decimal`、`mahonia` package
+
+### v2.6.7
+updated 2023.05.10
+
+- 增加:增加支付网关:集成支付宝、微信支付、QQ支付,可通过后台直接配置参数
+- 增加:增加资金管理模块,包含在线充值、申请提现、资金变动明细功能
+- 增加:增加redis延迟队列
+- 增加:tcp服务增加rpc协议通讯支持
+- 增加:通过微信访问后台自动获取openid,后续微信相关业务使用
+- 优化:gf版本升级到v2.4.1
+- 优化:优化CURD代码生成单表列表
+- 优化:优化菜单权限路由,解决偶尔修改权限不能实时生效的情况
+- 优化:优化后台导出功能搜索参数无效问题
+- 优化:将定时任务拆分成可独立部署的程序,通过tcp长连接方式与后台交互
+- 修复:修复相同文件多次上传页面无响应问题
+- 修复:修复新用户不更新活跃时间问题
+- 修复:修复本地缓存当缓存不存在时的异常错误问题
+- 修复:修复访问日志偶尔出现无法记录问题
+
+### v2.5.3
+updated 2023.04.10
+
+- 优化:优化IP地理位置定位,增加地理位置缓存,避免相同IP并发操作
+- 优化:优化日志管理中相关列表字段过多在小屏设备列表不显示滚动条情况
+- 增加:增加短信驱动:腾讯云短信,可通过后台一键切换
+- 修复:修复角色权限选择自定义部门时,部门选项无法显示问题
+
+### v2.4.9
+updated 2023.04.05
+
+- 优化:优化全局日志数据加载和分页加载,大分页增加分批次加载
+- 优化:优化TCP服务认证,超出多端登录上限时直接踢掉所有在线让其重连
+- 增加:增加上传驱动:腾讯云cos、阿里云oss、七牛云对象存储
+- 优化:优化代码生成文档,数据库文档增加多数据库生成配置
+- 修复:修复系统监控在苹果m1芯片空指针以及显示问题
+
+### v2.4.4
+updated 2023.03.16
+
+- 优化:优化代码生成多库生成时的菜单sql默认指向默认数据库分组
+- 优化:优化TCP服务认证机制
+
+### v2.4.2
+updated 2023.03.11
+
+- 修复:修复字典管理列表无法添加/编辑问题
+- 优化:优化代码生成文档
+- 优化:优化部门树形选项排序问题
+- 优化:优化基础设置中的LOGO图片上传组件
+- 优化:优化黑名单IP过滤策略
+- 增加:增加基于gtcp实现的C/S服务器,为后续多服务通讯建立基础库
+- 优化:gf版本升级到v2.3.3
+
+### v2.3.5
+updated 2023.02.26
+
+- 优化: 调整消息队列消费初始化方式,支持在插件模块下注册消费者
+- 修复:后台用户添加模态框无法正常显示问题
+- 优化:创建新插件生成增加web页面的生成
+- 增加:增加生产部署、开发规范、生成代码、表单组件等相关文档
+- 修复:修复后台已知的一些小bug
+
+### v2.2.10
+updated 2023.02.23
+
+- 增加: 增加插件管理、设计新插件等插件模块
+- 增加: 增加插件应用:`功能案例`
+- 增加: 增加使用文档
+- 优化: 生成代码适配插件模块
+- 优化:消息队列增加磁盘队列,默认队列从`redis`改为`disk`
+- 优化:缓存驱动增加文件适配器,默认驱动从`redis`改为`file`,项目安装不再依赖`redis`
+- 优化:优化系统监控加载流程
+- 优化:gf版本升级到v2.3.2
+- 修复:生成代码刷新后偶尔出现加载失败问题
+
+### v2.2.1
+updated 2023.01.12
+
+- 优化: 缓存清理各个应用的缓存文件夹读写判断
+- 修复: Linux 环境下创建插件报找不到模板文件
+- 修复: Excel 导入找不到最后一列数据
+- 增加: 无权限菜单不显示
+- 优化: 省市区数据为最新的 2023.01.11 的国家统计局省市区数据
+- 优化: 前台关于图片上传的 js 和 css 引入,避免资源依赖找不到
+- 优化: 插件模块查询机制, 增加数据缓存依赖,依赖时间为 360 秒
+- 优化: 文件上传的处理
+- 修复: 网站配置的多图上传引入路径错误
+- 修复: 定时任务协程问题导致执行失败
+-
+### v2.1.1
+updated 2022.9.26
+
+- 优化: 多图上传的显示样式及功能
+- 修复: 由于上传视频和语音开启了全域名返回导致的上传到服务器错误
+- 增加: 由增加home页面入口,前台页面
+
+### v2.0.8
+updated 2022.9.21
+
+- 优化: 优化菜单和角色数据权限,支持数据权限和按钮细分权限
+- 优化: 优化附件上传,增加文件上传选项
+
+### v2.0.6
+updated 2022.9.18
+
+- 增加: 增加阿里云短信配置和发送短信API
+- 增加: 增加高德地图配置
+- 优化: 优化数据字典,增加数据类型和标签支持
+-
+### v2.0.3
+updated 2022.9.10
+
+- 2.0 全新上线
+
+### v2.0.2
+updated 2022.6.11
+
+- 增加: 增加生成代码功能,目前已支持一键生成CURD和关联表
+- 增加: 增加云存储UCloud配置,后台一键切换驱动
+
+### v2.0.0
+updated 2022.5.20
+
+ - 初始化: 2.0 基础框架
diff --git a/docs/guide-zh-CN/sys-auth.md b/docs/guide-zh-CN/sys-auth.md
new file mode 100644
index 0000000..27ac252
--- /dev/null
+++ b/docs/guide-zh-CN/sys-auth.md
@@ -0,0 +1,155 @@
+## 权限控制
+
+目录
+
+- 一、菜单权限
+- 二、数据权限
+
+
+### 一、菜单权限
+
+> 菜单权限可以控制web后台菜单功能,每个菜单可以绑定一个或多个API权限,API权限决定了用户是否可以调用服务端接口。
+
+#### 为角色添加菜单权限
+
+1、HotGo后台 -> 权限管理 -> 菜单权限 -> 找到添加菜单,按照表单提示添加你的菜单信息。
+
+2、添加菜单完成后,到 权限管理 -> 角色权限 -> 找到一位已有角色或者添加新角色 -> 在列表右侧操作栏找到菜单权限打开 -> 将第1步中添加的菜单分配给该角色即可。
+
+#### 细粒度权限
+
+> 一般用于web后台页面上的功能按钮,对不同的角色展示不同的按钮时会用到。
+
+1、参考【为角色添加菜单权限】添加一个按钮类型的菜单。并为菜单分配API权限,假设你分配权限是:/test/index
+
+2、在web页面中创建一个按钮,如下:
+
+```vue
+
+
server/internal/logic/middleware/admin_auth.go)
+ B -->|没有登录,但API需要登录| H(提示登录)
+ B -->|没有登录,但API不需要登录| G(验证通过,进入业务)
+ B -->|已登录| C(检查用户角色是否拥有API权限
server/internal/logic/admin/role.go,方法:Verify) -->|有权限| G(验证通过,进入业务)
+ C -->|API无需验证权限| G(验证通过,进入业务流程)
+ C -->|无权限| D(提示无权限)
+```
+
+#### 菜单权限添加或修改后多久生效?
+
+- API权限实时生效,web后台菜单刷新页面后生效,无需重启服务
+
+
+### 二、数据权限
+
+> 数据权限是某人只能看到某些数据,可以为某人设置一定的数据范围,让其只能看到允许他看到的数据。
+
+> 例如:公司存在多个销售部门,不同的部门仅能查看到自己所属部门下的数据;再如:用户有多级代理商,只能查看自己和自己下级的数据。
+
+#### 目前已经支持的数据权限如下
+
+| 数据范围 | 描述 |
+|---------|--------------------------------------------|
+| 全部权限 | 不做过滤,可以查看所有数据 |
+| 当前部门 | 仅可以看到所属部门下的数据 |
+| 当前以及下部门 | 仅可以看到所属以及下级部门的数据 |
+| 自定义部门 | 可以看到设置的指定部门,支持多个 |
+| 仅自己 | 仅可以看到自己的数据 |
+| 自己和直属下级 | 仅可以看到自己和直属下级的数据,直属下级是指当前用户往下1级的用户 |
+| 自己和全部下级 | 仅可以看到自己和全部下级的数据,全部下级是指当前用户所有的下级用户,包含其下级的下级 |
+
+#### 如何区分部门和下级用户?
+
+- 在实际使用时,部门更多的是在公司或机构中使用,可以通过在 组织管理 -> 后台用户 ->为用户绑定部门
+- 下级用户在代理商或分销系统中比较常见,后台用户由谁添加的,那么被添加的用户就是其下级用户
+
+#### 如何判断数据是谁的?
+
+- 在数据库建表时,只要表中包含字段:`created_by`或`member_id`即可过滤 [仅自己、自己和直属下级、自己和全部下级] 类型的数据权限
+
+#### 如何在具体业务中使用数据权限过滤?
+
+- 只需在查询、更新或删除等ORM链式操作中加入相应`Handler`方法即可
+
+- 如果你想对Handler有更多详细了解,请查看:https://goframe.org/pages/viewpage.action?pageId=20087340
+
+- 下面提供一个简单使用例子:
+
+```go
+package main
+
+import (
+ "context"
+ "hotgo/internal/dao"
+ "hotgo/internal/library/hgorm/handler"
+)
+
+func test(ctx context.Context) {
+ dao.AdminPost.Ctx(ctx).Where("id", 1).Handler(handler.FilterAuth).Scan(&res)
+}
+```
+
+- 如果表中没有字段:`created_by`或`member_id`,也可以使用自定义字段方法来过滤数据权限,如下:
+
+```go
+package main
+
+import (
+ "context"
+ "hotgo/internal/dao"
+ "hotgo/internal/library/hgorm/handler"
+)
+
+func test(ctx context.Context) {
+ dao.AdminPost.Ctx(ctx).Where("id", 1).Handler(handler.FilterAuthWithField("test_field")).Scan(&res)
+}
+```
+
+
+- 过滤方法实现请参考:[server/internal/library/hgorm/handler/filter_auth.go](../../server/internal/library/hgorm/handler/filter_auth.go)
+
+
diff --git a/docs/guide-zh-CN/sys-catalog.md b/docs/guide-zh-CN/sys-catalog.md
new file mode 100644
index 0000000..bf9d040
--- /dev/null
+++ b/docs/guide-zh-CN/sys-catalog.md
@@ -0,0 +1,176 @@
+## 目录结构
+
+目录
+
+- 服务端
+- web前端
+- uniapp端(待开放)
+
+
+#### 服务端
+```
+/server
+├── addons
+│ ├── modules
+│ ├── xxx插件
+│ | ├── api
+│ | ├── controller
+│ | ├── crons
+│ | ├── global
+│ | ├── logic
+│ | ├── model
+│ | ├── queues
+│ | ├── resource
+│ | ├── router
+│ | ├── service
+│ | ├── main.go
+│ | └── README.md
+├── api
+│ ├── admin
+│ ├── api
+│ ├── home
+│ ├── websocket
+├── hack
+├── internal
+│ ├── cmd
+│ ├── consts
+│ ├── controller
+│ ├── crons
+│ ├── dao
+│ ├── global
+│ ├── library
+│ ├── logic
+│ ├── model
+│ | ├── do
+│ │ ├── entity
+│ │ └── input
+│ ├── packed
+│ ├── queues
+│ ├── router
+│ ├── service
+│ └── websocket
+├── manifest
+├── resource
+├── storage
+├── utility
+├── go.mod
+├── main.go
+├── Makefile
+└── README.md
+```
+
+| 目录 | 描述 |
+|--------------------------|-----------------------------------------------------------------|
+| 基于gf的工程目录结构做了部分调整 | 参考地址: https://goframe.org/pages/viewpage.action?pageId=30740166 |
+| **addons** | 所有的插件模块都放在这里 |
+| --- modules | 为插件模块提供隐式初始化 |
+| --- xxx插件 | 插件模块名称 |
+| --- --- api | 对外接口。提供服务的输入/输出数据结构定义 |
+| --- --- --- admin | 后台接口 |
+| --- --- --- api | 前台通用接口,包含PC端、移动端接口等 |
+| --- --- --- home | 前台PC端、H5端页面 |
+| --- --- --- websocket | 可同时为多应用提供websocket接口 |
+| --- --- consts | 插件内主要的常量定义 |
+| --- --- controller | 接收/解析用户输入参数的入口/接口层,也可以理解为控制器 |
+| --- --- crons | 项目中由系统统一接管的定时任务处理 |
+| --- --- global | 项目内主要的全局变量和系统的一些初始化操作 |
+| --- --- logic | 业务逻辑封装管理,特定的业务逻辑实现和封装往往是项目中最复杂的部分 |
+| --- --- model | 数据结构管理模块,管理数据实体对象,以及输入与输出数据结构定义 |
+| --- --- --- input | 对内接口。用于controller调用service或service之间调用时的输入/输出结构定义,以及输入过滤和预处理 |
+| --- queues | 为项目内所有的消息队列的消费者提供统一的初始化和处理 |
+| --- resource | 静态资源文件。这些文件往往可以通过 资源打包/镜像编译 的形式注入到发布文件中 |
+| --- --- router | 注册对外接口和分组中间件 |
+| --- --- service | 用于业务模块解耦的接口定义层具体的接口实现在logic中进行注入 |
+| --- main.go | 插件始化文件和模块插拔接口 |
+| **api** | 对外接口。提供服务的输入/输出数据结构定义 |
+| --- admin | 后台接口 |
+| --- api | 前台通用接口,包含PC端、移动端接口等 |
+| --- home | 前台PC端、H5端页面 |
+| --- websocket | 可同时为多应用提供websocket接口 |
+| **hack** | 存放项目开发工具、脚本等内容例如,CLI工具的配置,各种shell/bat脚本等文件 |
+| **internal** | 业务逻辑存放目录通过Golang internal特性对外部隐藏可见性 |
+| --- cmd | 命令行管理目录可以管理维护多个命令行 |
+| --- consts | 项目内主要的常量定义 |
+| --- controller | 接收/解析用户输入参数的入口/接口层,也可以理解为控制器 |
+| --- crons | 项目中由系统统一接管的定时任务处理 |
+| --- dao | 数据访问对象,这是一层抽象对象,用于和底层数据库交互,仅包含最基础的 CURD 方法 |
+| --- global | 项目内主要的全局变量和系统的一些初始化操作 |
+| --- library | 项目内常用功能的扩展库 |
+| --- logic | 业务逻辑封装管理,特定的业务逻辑实现和封装往往是项目中最复杂的部分 |
+| --- model | 数据结构管理模块,管理数据实体对象,以及输入与输出数据结构定义 |
+| --- --- do | 用于dao数据操作中业务模型与实例模型转换,由工具维护,用户不能修改 |
+| --- --- entity | 与数据集合绑定的程序数据结构定义,通常和数据表一一对应 |
+| --- --- input | 对内接口。用于controller调用service或service之间调用时的输入/输出结构定义,以及输入过滤和预处理 |
+| --- packed | 将静态资源打包进可执行文件,无需单独部署 |
+| --- queues | 为项目内所有的消息队列的消费者提供统一的初始化和处理 |
+| --- router | 注册对外接口和分组中间件 |
+| --- service | 用于业务模块解耦的接口定义层具体的接口实现在logic中进行注入 |
+| **manifest** | 包含程序编译、部署、运行、配置的文件常见内容如下: |
+| --- config | 配置文件存放目录 |
+| --- docker | Docker镜像相关依赖文件,脚本文件等等 |
+| --- deploy | 部署相关的文件默认提供了Kubernetes集群化部署的Yaml模板,通过kustomize管理 |
+| **resource** | 静态资源文件。这些文件往往可以通过 资源打包/镜像编译 的形式注入到发布文件中 |
+| **storage** | 本地数据存储目录,例如文件缓存、磁盘队列数据、sql数据文件、SSL证书等 |
+| **utility** | 一些常用的工具方法 |
+| go.mod | 使用Go Module包管理的依赖描述文件 |
+| main.go | 程序入口文件 |
+| Makefile | 程序构建发布和开发快捷指令 |
+| README.md | 项目介绍文件 |
+
+
+
+
+#### web前端
+```
+/web
+├── build # 打包脚本相关
+│ ├── config # 配置文件
+│ ├── generate # 生成器
+│ ├── script # 脚本
+│ └── vite # vite配置
+├── mock # mock文件夹
+├── public # 公共静态资源目录
+├── src # 主目录
+│ ├── api # 接口文件
+│ ├── assets # 资源文件
+│ │ ├── icons # icon sprite 图标文件夹
+│ │ ├── images # 项目存放图片的文件夹
+│ │ └── svg # 项目存放svg图片的文件夹
+│ ├── components # 公共组件
+│ ├── design # 样式文件
+│ ├── directives # 指令
+│ ├── enums # 枚举/常量
+│ ├── hooks # hook
+│ │ ├── component # 组件相关hook
+│ │ ├── core # 基础hook
+│ │ ├── event # 事件相关hook
+│ │ ├── setting # 配置相关hook
+│ │ └── web # web相关hook
+│ ├── layouts # 布局文件
+│ │ ├── default # 默认布局
+│ │ ├── iframe # iframe布局
+│ │ └── page # 页面布局
+│ ├── locales # 多语言
+│ ├── logics # 逻辑
+│ ├── main.ts # 主入口
+│ ├── router # 路由配置
+│ ├── settings # 项目配置
+│ │ ├── componentSetting.ts # 组件配置
+│ │ ├── designSetting.ts # 样式配置
+│ │ ├── encryptionSetting.ts # 加密配置
+│ │ ├── localeSetting.ts # 多语言配置
+│ │ ├── projectSetting.ts # 项目配置
+│ │ └── siteSetting.ts # 站点配置
+│ ├── store # 数据仓库
+│ ├── utils # 工具类
+│ └── views # 页面
+├── types # 类型文件
+├── vite.config.ts # vite配置文件
+└── windi.config.ts # windcss配置文件
+```
+
+
+#### uniapp端
+```
+// 待开放
+```
\ No newline at end of file
diff --git a/docs/guide-zh-CN/sys-code.md b/docs/guide-zh-CN/sys-code.md
new file mode 100644
index 0000000..d76d2a3
--- /dev/null
+++ b/docs/guide-zh-CN/sys-code.md
@@ -0,0 +1,379 @@
+## 代码生成
+
+目录
+
+- 使用条件
+- 模板配置
+- CLI配置
+- 生成CRUD表格
+- 生成树形表格
+- 多数据库使用
+- 自定义生成模板
+- 内置gf-cli
+- 指定gf-cli版本
+- 指定数据库驱动
+
+
+> 在HotGo中可以通过后台开发工具快速的一键生成CRUD,自动生成Api、控制器、业务逻辑、Web页面、表单组件、菜单权限等。
+
+
+### 使用条件
+
+- hotgo 版本号 >= 2.13.1
+- 使用前必须先看 [数据库](sys-db.md)
+
+
+### 生成模板配置
+
+- 配置路径:server/manifest/config/config.yaml
+```yaml
+# 生成代码
+hggen:
+ allowedIPs: [ "127.0.0.1", "*" ] # 白名单,*代表所有,只有允许的IP后台才能使用生成代码功能
+ selectDbs: [ "default" ] # 可选生成表的数据库配置名称,支持多库
+ disableTables: [ "hg_sys_gen_codes","hg_admin_role_casbin" ] # 禁用的表,禁用以后将不会在选择表中看到
+ delimiters: [ "@{", "}" ] # 模板引擎变量分隔符号
+ # 生成应用模型,所有生成模板允许自定义,可以参考default模板进行改造
+ application:
+ # CRUD和关系树列表模板
+ crud:
+ templates:
+ # 默认的主包模板
+ - group: "default" # 分组名称
+ isAddon: false # 是否为插件模板 false|true
+ masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
+ templatePath: "./resource/generate/default/curd" # 模板路径
+ apiPath: "./api/admin" # goApi生成路径
+ controllerPath: "./internal/controller/admin/sys" # 控制器生成路径
+ logicPath: "./internal/logic/sys" # 主要业务生成路径
+ inputPath: "./internal/model/input/sysin" # 表单过滤器生成路径
+ routerPath: "./internal/router/genrouter" # 生成路由表路径
+ sqlPath: "./storage/data/generate" # 生成sql语句路径
+ webApiPath: "../web/src/api" # webApi生成路径
+ webViewsPath: "../web/src/views" # web页面生成路径
+
+ # 默认的插件包模板,{$name}会自动替换成实际的插件名称
+ - group: "addon" # 分组名称
+ isAddon: true # 是否为插件模板 false|true
+ masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
+ templatePath: "./resource/generate/default/curd" # 模板路径
+ apiPath: "./addons/{$name}/api/admin" # goApi生成路径
+ controllerPath: "./addons/{$name}/controller/admin/sys" # 控制器生成路径
+ logicPath: "./addons/{$name}/logic/sys" # 主要业务生成路径
+ inputPath: "./addons/{$name}/model/input/sysin" # 表单过滤器生成路径
+ routerPath: "./addons/{$name}/router/genrouter" # 生成路由表路径
+ sqlPath: "./storage/data/generate/addons" # 生成sql语句路径
+ webApiPath: "../web/src/api/addons/{$name}" # webApi生成路径
+ webViewsPath: "../web/src/views/addons/{$name}" # web页面生成路径
+
+ # 消息队列模板
+ queue:
+ templates:
+ - group: "default"
+ templatePath: "./resource/generate/default/queue"
+
+ # 定时任务模板
+ cron:
+ templates:
+ - group: "default"
+ templatePath: "./resource/generate/default/cron"
+
+ # 生成插件模块,通过后台创建新插件时使用的模板,允许自定义,可以参考default模板进行改造
+ addon:
+ srcPath: "./resource/generate/default/addon" # 生成模板路径
+ webApiPath: "../web/src/api/addons/{$name}" # webApi生成路径
+ webViewsPath: "../web/src/views/addons/{$name}" # web页面生成路径
+```
+
+### 生成CLI配置
+
+- hotgo在生成dao、service配置时,默认了和gf官方一致的配置方式和代码生成规则。所以无论你是通过hotgo亦或gf命令生成,最终代码格式完全一致,遵循一致的代码规范。
+
+- 配置路径:[server/hack/config.yaml](../../server/hack/config.yaml)
+
+```yaml
+gfcli:
+ build:
+ name: "hotgo" # 编译后的可执行文件名称
+ # arch: "all" #不填默认当前系统架构,可选:386,amd64,arm,all
+ # system: "all" #不填默认当前系统平台,可选:linux,darwin,windows,all
+ mod: "none"
+ cgo: 0
+ packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署
+ packDst: "internal/packed/packed.go" # 打包后生成的Go文件路径,一般使用相对路径指定到本项目目录中
+ version: ""
+ output: "./temp/hotgo" # 可执行文件生成路径
+ extra: ""
+
+ gen:
+ dao:
+ - link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true"
+# - link: "pgsql:postgres:hg123456@tcp(127.0.0.1:5432)/hotgo"
+ group: "default" # 分组 使用hotgo代码生成功能时必须填
+ # tables: "" # 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。
+ tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。
+ removePrefix: "hg_"
+ descriptionTag: true
+ noModelComment: true
+ jsonCase: "CamelLower"
+ gJsonSupport: true
+ clear: true
+
+ service: # 生成业务配置
+ srcFolder: "internal/logic"
+ dstFolder: "internal/service"
+ dstFileNameCase: "CamelLower"
+ clear: true
+```
+
+### 生成CRUD表格
+
+- 推荐使用热编译方式启动HotGo,这样生成完成页面自动刷新即可看到新生成内容,无需手动重启
+- 服务端热编译启动:`gf run main.go`, web前端启动:`pnpm run dev` 或 `npm run dev`
+
+1、创建数据表
+
+1.1 创建测试表格表`hg_test_table`
+```mysql
+CREATE TABLE `hg_test_table` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `category_id` bigint(20) NOT NULL COMMENT '分类ID',
+ `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 '状态',
+ `created_by` bigint(20) DEFAULT '0' COMMENT '创建者',
+ `updated_by` bigint(20) DEFAULT '0' COMMENT '更新者',
+ `created_at` datetime DEFAULT NULL COMMENT '创建时间',
+ `updated_at` datetime DEFAULT NULL COMMENT '修改时间',
+ `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='测试表格';
+
+```
+
+1.2 测试分类表`hg_test_category`:
+- 注意:该表为了方便功能演示已经内置无需再次创建,此处提示表结构只是为了方便大家梳理关联表关系
+```mysql
+CREATE TABLE `hg_test_category` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
+ `name` varchar(255) NOT NULL COMMENT '分类名称',
+ `description` varchar(255) DEFAULT NULL COMMENT '描述',
+ `sort` int(11) NOT NULL COMMENT '排序',
+ `remark` varchar(255) DEFAULT NULL COMMENT '备注',
+ `status` tinyint(1) DEFAULT '1' COMMENT '状态',
+ `created_at` datetime DEFAULT NULL COMMENT '创建时间',
+ `updated_at` datetime DEFAULT NULL COMMENT '修改时间',
+ `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='测试分类';
+
+```
+
+1.3 插入测试数据
+```mysql
+INSERT INTO `hg_test_table` (`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, '测试标题', '描述', '

"` +} diff --git a/server/addons/hgexample/api/websocket/index/index.go b/server/addons/hgexample/api/websocket/index/index.go new file mode 100644 index 0000000..764eaa8 --- /dev/null +++ b/server/addons/hgexample/api/websocket/index/index.go @@ -0,0 +1,21 @@ +// Package index +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package index + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/addons/hgexample/model/input/sysin" +) + +// TestReq 测试 +type TestReq struct { + g.Meta `path:"/index/test" method:"get" tags:"功能案例" summary:"测试"` + sysin.IndexTestInp +} + +type TestRes struct { + *sysin.IndexTestModel +} diff --git a/server/addons/hgexample/controller/admin/sys/comp.go b/server/addons/hgexample/controller/admin/sys/comp.go new file mode 100644 index 0000000..ba57d0b --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/comp.go @@ -0,0 +1,46 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sys + +import ( + "context" + "github.com/xuri/excelize/v2" + "hotgo/addons/hgexample/api/admin/comp" +) + +var ( + Comp = cComp{} +) + +type cComp struct{} + +// ImportExcel 导入Excel +func (c *cComp) ImportExcel(ctx context.Context, req *comp.ImportExcelReq) (res *comp.ImportExcelRes, err error) { + file, err := req.File.Open() + if err != nil { + return + } + defer file.Close() + + excel, err := excelize.OpenReader(file) + if err != nil { + return + } + defer excel.Close() + + res = new(comp.ImportExcelRes) + sheetList := excel.GetSheetList() + for _, sheet := range sheetList { + item := new(comp.ImportExcelSheet) + item.Sheet = sheet + item.Rows, err = excel.GetRows(sheet) + if err != nil { + return nil, err + } + res.Sheets = append(res.Sheets, item) + } + return +} diff --git a/server/addons/hgexample/controller/admin/sys/config.go b/server/addons/hgexample/controller/admin/sys/config.go new file mode 100644 index 0000000..ef40a69 --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/config.go @@ -0,0 +1,33 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sys + +import ( + "context" + "hotgo/addons/hgexample/api/admin/config" + "hotgo/addons/hgexample/service" +) + +var ( + Config = cConfig{} +) + +type cConfig struct{} + +// GetConfig 获取指定分组的配置 +func (c *cConfig) GetConfig(ctx context.Context, req *config.GetReq) (res *config.GetRes, err error) { + data, err := service.SysConfig().GetConfigByGroup(ctx, &req.GetConfigInp) + + res = new(config.GetRes) + res.GetConfigModel = data + return +} + +// UpdateConfig 更新指定分组的配置 +func (c *cConfig) UpdateConfig(ctx context.Context, req *config.UpdateReq) (res *config.UpdateRes, err error) { + err = service.SysConfig().UpdateConfigByGroup(ctx, &req.UpdateConfigInp) + return +} diff --git a/server/addons/hgexample/controller/admin/sys/index.go b/server/addons/hgexample/controller/admin/sys/index.go new file mode 100644 index 0000000..b378b1d --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/index.go @@ -0,0 +1,30 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sys + +import ( + "context" + "hotgo/addons/hgexample/api/admin/index" + "hotgo/addons/hgexample/service" +) + +var ( + Index = cIndex{} +) + +type cIndex struct{} + +// Test 测试 +func (c *cIndex) Test(ctx context.Context, req *index.TestReq) (res *index.TestRes, err error) { + data, err := service.SysIndex().Test(ctx, &req.IndexTestInp) + if err != nil { + return + } + + res = new(index.TestRes) + res.IndexTestModel = data + return +} diff --git a/server/addons/hgexample/controller/admin/sys/table.go b/server/addons/hgexample/controller/admin/sys/table.go new file mode 100644 index 0000000..03188cf --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/table.go @@ -0,0 +1,85 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sys + +import ( + "context" + "hotgo/addons/hgexample/api/admin/table" + "hotgo/addons/hgexample/service" +) + +var ( + Table = cTable{} +) + +type cTable struct{} + +// List 查看列表 +func (c *cTable) List(ctx context.Context, req *table.ListReq) (res *table.ListRes, err error) { + list, totalCount, err := service.SysTable().List(ctx, &req.TableListInp) + if err != nil { + return + } + + res = new(table.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Export 导出列表 +func (c *cTable) Export(ctx context.Context, req *table.ExportReq) (res *table.ExportRes, err error) { + err = service.SysTable().Export(ctx, &req.TableListInp) + return +} + +// Edit 更新 +func (c *cTable) Edit(ctx context.Context, req *table.EditReq) (res *table.EditRes, err error) { + err = service.SysTable().Edit(ctx, &req.TableEditInp) + return +} + +// MaxSort 最大排序 +func (c *cTable) MaxSort(ctx context.Context, req *table.MaxSortReq) (res *table.MaxSortRes, err error) { + data, err := service.SysTable().MaxSort(ctx, &req.TableMaxSortInp) + if err != nil { + return + } + + res = new(table.MaxSortRes) + res.TableMaxSortModel = data + return +} + +// View 获取指定信息 +func (c *cTable) View(ctx context.Context, req *table.ViewReq) (res *table.ViewRes, err error) { + data, err := service.SysTable().View(ctx, &req.TableViewInp) + if err != nil { + return + } + + res = new(table.ViewRes) + res.TableViewModel = data + return +} + +// Delete 删除 +func (c *cTable) Delete(ctx context.Context, req *table.DeleteReq) (res *table.DeleteRes, err error) { + err = service.SysTable().Delete(ctx, &req.TableDeleteInp) + return +} + +// Status 更新状态 +func (c *cTable) Status(ctx context.Context, req *table.StatusReq) (res *table.StatusRes, err error) { + err = service.SysTable().Status(ctx, &req.TableStatusInp) + return +} + +// Switch 更新开关状态 +func (c *cTable) Switch(ctx context.Context, req *table.SwitchReq) (res *table.SwitchRes, err error) { + err = service.SysTable().Switch(ctx, &req.TableSwitchInp) + return +} diff --git a/server/addons/hgexample/controller/admin/sys/tenant_order.go b/server/addons/hgexample/controller/admin/sys/tenant_order.go new file mode 100644 index 0000000..33f98b0 --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/tenant_order.go @@ -0,0 +1,67 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.13.1 +package sys + +import ( + "context" + "hotgo/addons/hgexample/api/admin/tenantorder" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" +) + +var ( + TenantOrder = cTenantOrder{} +) + +type cTenantOrder struct{} + +// List 查看多租户功能演示列表 +func (c *cTenantOrder) List(ctx context.Context, req *tenantorder.ListReq) (res *tenantorder.ListRes, err error) { + list, totalCount, err := service.SysTenantOrder().List(ctx, &req.TenantOrderListInp) + if err != nil { + return + } + + if list == nil { + list = []*sysin.TenantOrderListModel{} + } + + res = new(tenantorder.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Export 导出多租户功能演示列表 +func (c *cTenantOrder) Export(ctx context.Context, req *tenantorder.ExportReq) (res *tenantorder.ExportRes, err error) { + err = service.SysTenantOrder().Export(ctx, &req.TenantOrderListInp) + return +} + +// Edit 更新多租户功能演示 +func (c *cTenantOrder) Edit(ctx context.Context, req *tenantorder.EditReq) (res *tenantorder.EditRes, err error) { + err = service.SysTenantOrder().Edit(ctx, &req.TenantOrderEditInp) + return +} + +// View 获取指定多租户功能演示信息 +func (c *cTenantOrder) View(ctx context.Context, req *tenantorder.ViewReq) (res *tenantorder.ViewRes, err error) { + data, err := service.SysTenantOrder().View(ctx, &req.TenantOrderViewInp) + if err != nil { + return + } + + res = new(tenantorder.ViewRes) + res.TenantOrderViewModel = data + return +} + +// Delete 删除多租户功能演示 +func (c *cTenantOrder) Delete(ctx context.Context, req *tenantorder.DeleteReq) (res *tenantorder.DeleteRes, err error) { + err = service.SysTenantOrder().Delete(ctx, &req.TenantOrderDeleteInp) + return +} diff --git a/server/addons/hgexample/controller/admin/sys/tree_table.go b/server/addons/hgexample/controller/admin/sys/tree_table.go new file mode 100644 index 0000000..0d2dd86 --- /dev/null +++ b/server/addons/hgexample/controller/admin/sys/tree_table.go @@ -0,0 +1,92 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sys + +import ( + "context" + "hotgo/addons/hgexample/api/admin/treetable" + "hotgo/addons/hgexample/service" +) + +var ( + TreeTable = cTreeTable{} +) + +type cTreeTable struct{} + +// List 查看列表 +func (c *cTreeTable) List(ctx context.Context, req *treetable.ListReq) (res *treetable.ListRes, err error) { + list, totalCount, err := service.SysTreeTable().List(ctx, &req.TreeTableListInp) + if err != nil { + return + } + + res = new(treetable.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Export 导出列表 +func (c *cTreeTable) Export(ctx context.Context, req *treetable.ExportReq) (res *treetable.ExportRes, err error) { + err = service.SysTable().Export(ctx, &req.TableListInp) + return +} + +// Edit 更新 +func (c *cTreeTable) Edit(ctx context.Context, req *treetable.EditReq) (res *treetable.EditRes, err error) { + err = service.SysTreeTable().Edit(ctx, &req.TableEditInp) + return +} + +// MaxSort 最大排序 +func (c *cTreeTable) MaxSort(ctx context.Context, req *treetable.MaxSortReq) (res *treetable.MaxSortRes, err error) { + data, err := service.SysTable().MaxSort(ctx, &req.TableMaxSortInp) + if err != nil { + return + } + + res = new(treetable.MaxSortRes) + res.TableMaxSortModel = data + return +} + +// View 获取指定信息 +func (c *cTreeTable) View(ctx context.Context, req *treetable.ViewReq) (res *treetable.ViewRes, err error) { + data, err := service.SysTable().View(ctx, &req.TableViewInp) + if err != nil { + return + } + + res = new(treetable.ViewRes) + res.TableViewModel = data + return +} + +// Delete 删除 +func (c *cTreeTable) Delete(ctx context.Context, req *treetable.DeleteReq) (res *treetable.DeleteRes, err error) { + err = service.SysTreeTable().Delete(ctx, &req.TableDeleteInp) + return +} + +// Status 更新状态 +func (c *cTreeTable) Status(ctx context.Context, req *treetable.StatusReq) (res *treetable.StatusRes, err error) { + err = service.SysTable().Status(ctx, &req.TableStatusInp) + return +} + +// Switch 更新开关状态 +func (c *cTreeTable) Switch(ctx context.Context, req *treetable.SwitchReq) (res *treetable.SwitchRes, err error) { + err = service.SysTable().Switch(ctx, &req.TableSwitchInp) + return +} + +// Select 树形选项 +func (c *cTreeTable) Select(ctx context.Context, _ *treetable.SelectReq) (res *treetable.SelectRes, err error) { + res = new(treetable.SelectRes) + res.List, err = service.SysTreeTable().Select(ctx) + return +} diff --git a/server/addons/hgexample/controller/api/index.go b/server/addons/hgexample/controller/api/index.go new file mode 100644 index 0000000..c604f1d --- /dev/null +++ b/server/addons/hgexample/controller/api/index.go @@ -0,0 +1,30 @@ +// Package api +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package api + +import ( + "context" + "hotgo/addons/hgexample/api/api/index" + "hotgo/addons/hgexample/service" +) + +var ( + Index = cIndex{} +) + +type cIndex struct{} + +// Test 测试 +func (c *cIndex) Test(ctx context.Context, req *index.TestReq) (res *index.TestRes, err error) { + data, err := service.SysIndex().Test(ctx, &req.IndexTestInp) + if err != nil { + return + } + + res = new(index.TestRes) + res.IndexTestModel = data + return +} diff --git a/server/addons/hgexample/controller/home/index.go b/server/addons/hgexample/controller/home/index.go new file mode 100644 index 0000000..668fc74 --- /dev/null +++ b/server/addons/hgexample/controller/home/index.go @@ -0,0 +1,34 @@ +// Package home +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package home + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "hotgo/addons/hgexample/api/home/index" + "hotgo/addons/hgexample/service" + "hotgo/internal/model" + isc "hotgo/internal/service" +) + +// Index 基础 +var Index = cIndex{} + +type cIndex struct{} + +func (a *cIndex) Index(ctx context.Context, req *index.TestReq) (res *index.TestRes, err error) { + data, err := service.SysIndex().Test(ctx, &req.IndexTestInp) + if err != nil { + return + } + + isc.View().RenderTpl(ctx, "home/index.html", model.View{Data: g.Map{ + "name": data.Name, + "module": data.Module, + "time": data.Time, + }}) + return +} diff --git a/server/addons/hgexample/controller/websocket/handler/index.go b/server/addons/hgexample/controller/websocket/handler/index.go new file mode 100644 index 0000000..0cc74ab --- /dev/null +++ b/server/addons/hgexample/controller/websocket/handler/index.go @@ -0,0 +1,25 @@ +// Package handler +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package handler + +import ( + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/websocket" +) + +var ( + Index = cIndex{} +) + +type cIndex struct{} + +// TestMessage 测试消息 +func (c *cIndex) TestMessage(client *websocket.Client, req *websocket.WRequest) { + g.Log().Infof(client.Context(), "收到客户端测试消息:%v", gjson.New(req).String()) + // 将收到的消息原样发送给客户端 + websocket.SendSuccess(client, req.Event, req.Data) +} diff --git a/server/addons/hgexample/controller/websocket/index.go b/server/addons/hgexample/controller/websocket/index.go new file mode 100644 index 0000000..37b9bbf --- /dev/null +++ b/server/addons/hgexample/controller/websocket/index.go @@ -0,0 +1,30 @@ +// Package websocket +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package websocket + +import ( + "context" + "hotgo/addons/hgexample/api/websocket/index" + "hotgo/addons/hgexample/service" +) + +var ( + Index = cIndex{} +) + +type cIndex struct{} + +// Test 测试 +func (c *cIndex) Test(ctx context.Context, req *index.TestReq) (res *index.TestRes, err error) { + data, err := service.SysIndex().Test(ctx, &req.IndexTestInp) + if err != nil { + return + } + + res = new(index.TestRes) + res.IndexTestModel = data + return +} diff --git a/server/addons/hgexample/crons/crons.go b/server/addons/hgexample/crons/crons.go new file mode 100644 index 0000000..e20bf6c --- /dev/null +++ b/server/addons/hgexample/crons/crons.go @@ -0,0 +1,9 @@ +// Package crons +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package crons + +// 定时任务. +// 插件中的定时任务可以统一在这里注册和处理 diff --git a/server/addons/hgexample/global/global.go b/server/addons/hgexample/global/global.go new file mode 100644 index 0000000..f549f88 --- /dev/null +++ b/server/addons/hgexample/global/global.go @@ -0,0 +1,12 @@ +// Package global +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package global + +import "hotgo/internal/library/addons" + +var ( + skeleton *addons.Skeleton // 插件架子 +) diff --git a/server/addons/hgexample/global/init.go b/server/addons/hgexample/global/init.go new file mode 100644 index 0000000..9db6de9 --- /dev/null +++ b/server/addons/hgexample/global/init.go @@ -0,0 +1,22 @@ +// Package global +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package global + +import ( + "context" + "hotgo/internal/library/addons" +) + +func Init(ctx context.Context, sk *addons.Skeleton) { + skeleton = sk +} + +func GetSkeleton() *addons.Skeleton { + if skeleton == nil { + panic("addon skeleton not initialized.") + } + return skeleton +} diff --git a/server/addons/hgexample/logic/.gitkeep b/server/addons/hgexample/logic/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/server/addons/hgexample/logic/logic.go b/server/addons/hgexample/logic/logic.go new file mode 100644 index 0000000..bd978f2 --- /dev/null +++ b/server/addons/hgexample/logic/logic.go @@ -0,0 +1,9 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package logic + +import ( + _ "hotgo/addons/hgexample/logic/sys" +) diff --git a/server/addons/hgexample/logic/sys/config.go b/server/addons/hgexample/logic/sys/config.go new file mode 100644 index 0000000..73620b2 --- /dev/null +++ b/server/addons/hgexample/logic/sys/config.go @@ -0,0 +1,59 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 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/addons/hgexample/global" + "hotgo/addons/hgexample/model" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" + isc "hotgo/internal/service" +) + +type sSysConfig struct{} + +func NewSysConfig() *sSysConfig { + return &sSysConfig{} +} + +func init() { + service.RegisterSysConfig(NewSysConfig()) +} + +// GetBasic 获取基础配置 +func (s *sSysConfig) GetBasic(ctx context.Context) (conf *model.BasicConfig, err error) { + var in sysin.GetConfigInp + in.GetAddonsConfigInp.AddonName = global.GetSkeleton().Name + in.GetAddonsConfigInp.Group = "basic" + models, err := isc.SysAddonsConfig().GetConfigByGroup(ctx, &in.GetAddonsConfigInp) + if err != nil { + return + } + + err = gconv.Struct(models.List, &conf) + return +} + +// GetConfigByGroup 获取指定分组配置 +func (s *sSysConfig) GetConfigByGroup(ctx context.Context, in *sysin.GetConfigInp) (res *sysin.GetConfigModel, err error) { + in.GetAddonsConfigInp.AddonName = global.GetSkeleton().Name + models, err := isc.SysAddonsConfig().GetConfigByGroup(ctx, &in.GetAddonsConfigInp) + if err != nil { + return + } + + res = new(sysin.GetConfigModel) + res.List = models.List + return +} + +// UpdateConfigByGroup 更新指定分组的配置 +func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in *sysin.UpdateConfigInp) error { + in.UpdateAddonsConfigInp.AddonName = global.GetSkeleton().Name + return isc.SysAddonsConfig().UpdateConfigByGroup(ctx, &in.UpdateAddonsConfigInp) +} diff --git a/server/addons/hgexample/logic/sys/index.go b/server/addons/hgexample/logic/sys/index.go new file mode 100644 index 0000000..d3e8ccd --- /dev/null +++ b/server/addons/hgexample/logic/sys/index.go @@ -0,0 +1,35 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 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/os/gtime" + "hotgo/addons/hgexample/global" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" + "hotgo/internal/library/contexts" +) + +type sSysIndex struct{} + +func NewSysIndex() *sSysIndex { + return &sSysIndex{} +} + +func init() { + service.RegisterSysIndex(NewSysIndex()) +} + +// Test 测试 +func (s *sSysIndex) Test(ctx context.Context, in *sysin.IndexTestInp) (res *sysin.IndexTestModel, err error) { + res = new(sysin.IndexTestModel) + res.Name = in.Name + res.Module = fmt.Sprintf("当前插件模块是:%s,当前应用模块是:%s", global.GetSkeleton().Name, contexts.Get(ctx).Module) + res.Time = gtime.Now() + return +} diff --git a/server/addons/hgexample/logic/sys/table.go b/server/addons/hgexample/logic/sys/table.go new file mode 100644 index 0000000..9c828bb --- /dev/null +++ b/server/addons/hgexample/logic/sys/table.go @@ -0,0 +1,233 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 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/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/util/gconv" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" + "hotgo/internal/dao" + "hotgo/internal/library/contexts" + "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/model/input/form" + "hotgo/utility/convert" + "hotgo/utility/excel" + "hotgo/utility/validate" +) + +type sSysTable struct{} + +func NewSysTable() *sSysTable { + return &sSysTable{} +} + +func init() { + service.RegisterSysTable(NewSysTable()) +} + +// Model Orm模型 +func (s *sSysTable) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.AddonHgexampleTable.Ctx(ctx), option...) +} + +// List 获取列表 +func (s *sSysTable) List(ctx context.Context, in *sysin.TableListInp) (list []*sysin.TableListModel, totalCount int, err error) { + mod := s.Model(ctx) + cols := dao.AddonHgexampleTable.Columns() + + if in.Title != "" { + mod = mod.WhereLike(cols.Title, "%"+in.Title+"%") + } + + if in.Content != "" { + mod = mod.WhereLike(cols.Content, "%"+in.Content+"%") + } + + if in.Status > 0 { + mod = mod.Where(cols.Status, in.Status) + } + + if in.Switch > 0 { + mod = mod.Where(cols.Switch, in.Switch) + } + + if len(in.Price) > 0 { + if in.Price[0] > 0 && in.Price[1] > 0 { + mod = mod.WhereBetween(cols.Price, in.Price[0], in.Price[1]) + } else if in.Price[0] > 0 && in.Price[1] == 0 { + mod = mod.WhereGTE(cols.Price, in.Price[0]) + } else if in.Price[0] == 0 && in.Price[1] > 0 { + mod = mod.WhereLTE(cols.Price, in.Price[1]) + } + } + + if in.ActivityAt != nil { + mod = mod.Where(cols.ActivityAt, in.ActivityAt) + } + + if len(in.CreatedAt) == 2 { + mod = mod.WhereBetween(cols.CreatedAt, in.CreatedAt[0], in.CreatedAt[1]) + } + + if !in.Flag.IsNil() { + mod = mod.Where(fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, cols.Flag, in.Flag)) + } + + if !in.Hobby.IsNil() { + mod = mod.Where(fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, cols.Hobby, in.Hobby)) + } + + totalCount, err = mod.Clone().Count() + if err != nil { + err = gerror.Wrap(err, "获取表格数据行失败,请稍后重试!") + return + } + + if totalCount == 0 { + return + } + + // .OrderAsc(cols.Sort).OrderDesc(cols.Id) + if err = mod.Fields(sysin.TableListModel{}).Page(in.Page, in.PerPage).Handler(handler.Sorter(in)).Scan(&list); err != nil { + err = gerror.Wrap(err, "获取表格列表失败,请稍后重试!") + return + } + return +} + +// Export 导出 +func (s *sSysTable) Export(ctx context.Context, in *sysin.TableListInp) (err error) { + list, totalCount, err := s.List(ctx, in) + if err != nil { + return + } + + // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} + tags, err := convert.GetEntityDescTags(sysin.TableExportModel{}) + if err != nil { + return + } + + var ( + fileName = "表格例子导出-" + gctx.CtxId(ctx) + sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list)) + exports []sysin.TableExportModel + ) + + if err = gconv.Scan(list, &exports); err != nil { + return + } + + if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil { + return + } + return +} + +// Edit 修改/新增 +func (s *sSysTable) Edit(ctx context.Context, in *sysin.TableEditInp) (err error) { + cols := dao.AddonHgexampleTable.Columns() + if err = hgorm.IsUnique(ctx, &dao.AddonHgexampleTable, g.Map{cols.Qq: in.Qq}, "QQ号码已存在,请换一个", in.Id); err != nil { + return + } + + // 修改 + if in.Id > 0 { + in.UpdatedBy = contexts.GetUserId(ctx) + if _, err = s.Model(ctx).WherePri(in.Id).Data(in).Update(); err != nil { + err = gerror.Wrap(err, "修改表格失败,请稍后重试!") + return + } + return + } + + // 新增 + in.CreatedBy = contexts.GetUserId(ctx) + if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).OmitEmptyData().Insert(); err != nil { + err = gerror.Wrap(err, "新增表格失败,请稍后重试!") + return + } + return +} + +// Delete 删除 +func (s *sSysTable) Delete(ctx context.Context, in *sysin.TableDeleteInp) (err error) { + if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil { + err = gerror.Wrap(err, "删除表格失败,请稍后重试!") + return + } + return +} + +// Status 更新状态 +func (s *sSysTable) Status(ctx context.Context, in *sysin.TableStatusInp) (err error) { + update := g.Map{ + dao.AddonHgexampleTable.Columns().Status: in.Status, + dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId(ctx), + } + + if _, err = s.Model(ctx).WherePri(in.Id).Data(update).Update(); err != nil { + err = gerror.Wrap(err, "更新表格状态失败,请稍后重试!") + return + } + return +} + +// Switch 更新开关状态 +func (s *sSysTable) Switch(ctx context.Context, in *sysin.TableSwitchInp) (err error) { + var fields = []string{ + dao.AddonHgexampleTable.Columns().Switch, + // ... + } + + if !validate.InSlice(fields, in.Key) { + err = gerror.New("开关键名不在白名单") + return + } + + update := g.Map{ + in.Key: in.Value, + dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId(ctx), + } + + if _, err = s.Model(ctx).Where(dao.AddonHgexampleTable.Columns().Id, in.Id).Data(update).Update(); err != nil { + err = gerror.Wrap(err, "更新表格开关失败,请稍后重试!") + return + } + return +} + +// MaxSort 最大排序 +func (s *sSysTable) MaxSort(ctx context.Context, in *sysin.TableMaxSortInp) (res *sysin.TableMaxSortModel, err error) { + dx := dao.AddonHgexampleTable + if err = dx.Ctx(ctx).Fields(dx.Columns().Sort).OrderDesc(dx.Columns().Sort).Scan(&res); err != nil { + err = gerror.Wrap(err, "获取表格最大排序,请稍后重试!") + return + } + + if res == nil { + res = new(sysin.TableMaxSortModel) + } + + res.Sort = form.DefaultMaxSort(res.Sort) + return +} + +// View 获取指定信息 +func (s *sSysTable) View(ctx context.Context, in *sysin.TableViewInp) (res *sysin.TableViewModel, err error) { + if err = s.Model(ctx).WherePri(in.Id).Scan(&res); err != nil { + err = gerror.Wrap(err, "获取生成演示信息,请稍后重试!") + return + } + return +} diff --git a/server/addons/hgexample/logic/sys/tenant_order.go b/server/addons/hgexample/logic/sys/tenant_order.go new file mode 100644 index 0000000..ac8094d --- /dev/null +++ b/server/addons/hgexample/logic/sys/tenant_order.go @@ -0,0 +1,174 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.13.1 +package sys + +import ( + "context" + "fmt" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" + "hotgo/internal/dao" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/library/hgorm/hook" + "hotgo/internal/model/input/form" + "hotgo/utility/convert" + "hotgo/utility/excel" + + "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/util/gconv" +) + +type sSysTenantOrder struct{} + +func NewSysTenantOrder() *sSysTenantOrder { + return &sSysTenantOrder{} +} + +func init() { + service.RegisterSysTenantOrder(NewSysTenantOrder()) +} + +// Model 多租户功能演示ORM模型 +func (s *sSysTenantOrder) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + if len(option) == 0 { + // 过滤多租户数据权限 + option = append(option, &handler.Option{ + FilterTenant: true, + //FilterAuth: true, // 如果还需要维护created_by、member_id等部门数据权限范围可放开注释 + }) + } + return handler.Model(dao.AddonHgexampleTenantOrder.Ctx(ctx), option...) +} + +// List 获取多租户功能演示列表 +func (s *sSysTenantOrder) List(ctx context.Context, in *sysin.TenantOrderListInp) (list []*sysin.TenantOrderListModel, totalCount int, err error) { + mod := s.Model(ctx) + + // 字段过滤 + mod = mod.Fields(sysin.TenantOrderListModel{}) + + // 查询主键 + if in.Id > 0 { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().Id, in.Id) + } + + // 查询租户ID + if in.TenantId > 0 { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().TenantId, in.TenantId) + } + + // 查询商户ID + if in.MerchantId > 0 { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().MerchantId, in.MerchantId) + } + + // 查询用户ID + if in.UserId > 0 { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().UserId, in.UserId) + } + + // 查询关联订单号 + if in.OrderSn != "" { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().OrderSn, in.OrderSn) + } + + // 查询支付状态 + if in.Status > 0 { + mod = mod.Where(dao.AddonHgexampleTenantOrder.Columns().Status, in.Status) + } + + // 查询创建时间 + if len(in.CreatedAt) == 2 { + mod = mod.WhereBetween(dao.AddonHgexampleTenantOrder.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1]) + } + + // 分页 + mod = mod.Page(in.Page, in.PerPage) + + // 排序 + mod = mod.OrderDesc(dao.AddonHgexampleTenantOrder.Columns().Id) + + // 查询数据 + if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { + err = gerror.Wrap(err, "获取多租户功能演示列表失败,请稍后重试!") + return + } + return +} + +// Export 导出多租户功能演示 +func (s *sSysTenantOrder) Export(ctx context.Context, in *sysin.TenantOrderListInp) (err error) { + list, totalCount, err := s.List(ctx, in) + if err != nil { + return + } + + // 字段的排序是依据tags的字段顺序,如果你不想使用默认的排序方式,可以直接定义 tags = []string{"字段名称", "字段名称2", ...} + tags, err := convert.GetEntityDescTags(sysin.TenantOrderExportModel{}) + if err != nil { + return + } + + var ( + fileName = "导出多租户功能演示-" + gctx.CtxId(ctx) + sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list)) + exports []sysin.TenantOrderExportModel + ) + + if err = gconv.Scan(list, &exports); err != nil { + return + } + + err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName) + return +} + +// Edit 修改/新增多租户功能演示 +func (s *sSysTenantOrder) Edit(ctx context.Context, in *sysin.TenantOrderEditInp) (err error) { + return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + // 修改 + if in.Id > 0 { + if _, err = s.Model(ctx). + Fields(sysin.TenantOrderUpdateFields{}). + WherePri(in.Id).Data(in). + Hook(hook.SaveTenant). // 自动维护租户关系更新 + Update(); err != nil { + } + return + } + + // 新增 + if _, err = dao.AddonHgexampleTenantOrder.Ctx(ctx). + Fields(sysin.TenantOrderInsertFields{}). + Hook(hook.SaveTenant). // 自动维护租户关系更新 + Data(in). + Insert(); err != nil { + } + return + }) +} + +// Delete 删除多租户功能演示 +func (s *sSysTenantOrder) Delete(ctx context.Context, in *sysin.TenantOrderDeleteInp) (err error) { + if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil { + err = gerror.Wrap(err, "删除多租户功能演示失败,请稍后重试!") + return + } + return +} + +// View 获取多租户功能演示指定信息 +func (s *sSysTenantOrder) View(ctx context.Context, in *sysin.TenantOrderViewInp) (res *sysin.TenantOrderViewModel, err error) { + if err = s.Model(ctx).WherePri(in.Id).Scan(&res); err != nil { + err = gerror.Wrap(err, "获取多租户功能演示信息,请稍后重试!") + return + } + return +} diff --git a/server/addons/hgexample/logic/sys/tree_table.go b/server/addons/hgexample/logic/sys/tree_table.go new file mode 100644 index 0000000..2f09057 --- /dev/null +++ b/server/addons/hgexample/logic/sys/tree_table.go @@ -0,0 +1,186 @@ +// Package sys +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 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/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/addons/hgexample/service" + "hotgo/internal/consts" + "hotgo/internal/dao" + "hotgo/internal/library/contexts" + "hotgo/internal/library/hgorm" + "hotgo/internal/library/hgorm/handler" + "hotgo/internal/model/entity" +) + +type sSysTreeTable struct{} + +func NewSysTreeTable() *sSysTreeTable { + return &sSysTreeTable{} +} + +func init() { + service.RegisterSysTreeTable(NewSysTreeTable()) +} + +// Model Orm模型 +func (s *sSysTreeTable) Model(ctx context.Context, option ...*handler.Option) *gdb.Model { + return handler.Model(dao.AddonHgexampleTable.Ctx(ctx), option...) +} + +// List 获取列表 +func (s *sSysTreeTable) List(ctx context.Context, in *sysin.TreeTableListInp) (list []*sysin.TreeTableListModel, totalCount int, err error) { + mod := s.Model(ctx) + cols := dao.AddonHgexampleTable.Columns() + + if in.Title != "" { + mod = mod.WhereLike(cols.Title, "%"+in.Title+"%") + } + + if in.Content != "" { + mod = mod.WhereLike(cols.Content, "%"+in.Content+"%") + } + + if in.Status > 0 { + mod = mod.Where(cols.Status, in.Status) + } + + if in.Switch > 0 { + mod = mod.Where(cols.Switch, in.Switch) + } + + if in.Pid > 0 { + mod = mod.Where(cols.Pid, in.Pid) + } + + if len(in.Price) > 0 { + if in.Price[0] > 0 && in.Price[1] > 0 { + mod = mod.WhereBetween(cols.Price, in.Price[0], in.Price[1]) + } else if in.Price[0] > 0 && in.Price[1] == 0 { + mod = mod.WhereGTE(cols.Price, in.Price[0]) + } else if in.Price[0] == 0 && in.Price[1] > 0 { + mod = mod.WhereLTE(cols.Price, in.Price[1]) + } + } + + if in.ActivityAt != nil { + mod = mod.Where(cols.ActivityAt, in.ActivityAt) + } + + if len(in.CreatedAt) == 2 { + mod = mod.WhereBetween(cols.CreatedAt, in.CreatedAt[0], in.CreatedAt[1]) + } + + if !in.Flag.IsNil() { + mod = mod.Where(fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, cols.Flag, in.Flag)) + } + + if !in.Hobby.IsNil() { + mod = mod.Where(fmt.Sprintf(`JSON_CONTAINS(%s,'%v')`, cols.Hobby, in.Hobby)) + } + + totalCount, err = mod.Clone().Count() + if err != nil { + err = gerror.Wrap(err, "获取表格数据行失败,请稍后重试!") + return + } + + if totalCount == 0 { + return + } + + if err = mod.Fields(sysin.TableListModel{}).Page(in.Page, in.PerPage).Handler(handler.Sorter(in)).Scan(&list); err != nil { + err = gerror.Wrap(err, "获取表格列表失败,请稍后重试!") + return + } + return +} + +// Edit 修改/新增 +func (s *sSysTreeTable) Edit(ctx context.Context, in *sysin.TableEditInp) (err error) { + cols := dao.AddonHgexampleTable.Columns() + if err = hgorm.IsUnique(ctx, &dao.AddonHgexampleTable, g.Map{cols.Qq: in.Qq}, "QQ号码已存在,请换一个", in.Id); err != nil { + return + } + + return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + in.Pid, in.Level, in.Tree, err = hgorm.AutoUpdateTree(ctx, &dao.AddonHgexampleTable, in.Id, in.Pid) + if err != nil { + return err + } + + if in.Id > 0 { + in.UpdatedBy = contexts.GetUserId(ctx) + if _, err = s.Model(ctx).WherePri(in.Id).Data(in).Update(); err != nil { + err = gerror.Wrap(err, "修改表格失败,请稍后重试!") + return err + } + } else { + in.CreatedBy = contexts.GetUserId(ctx) + if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).OmitEmptyData().Insert(); err != nil { + err = gerror.Wrap(err, "新增表格失败,请稍后重试!") + return err + } + } + return + }) +} + +// Delete 删除 +func (s *sSysTreeTable) Delete(ctx context.Context, in *sysin.TableDeleteInp) (err error) { + count, err := dao.AdminMenu.Ctx(ctx).Where("pid", in.Id).Count() + if err != nil { + err = gerror.Wrap(err, consts.ErrorORM) + return err + } + if count > 0 { + return gerror.New("请先删除该表格下的所有下级!") + } + + if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil { + err = gerror.Wrap(err, "删除表格失败,请稍后重试!") + return + } + return +} + +// Select 关系树选项列表 +func (s *sSysTreeTable) Select(ctx context.Context) (list []*sysin.TableTree, err error) { + var models []*entity.AddonHgexampleTable + if err = dao.AddonHgexampleTable.Ctx(ctx).Order("pid asc,id asc,sort asc").Scan(&models); err != nil { + err = gerror.Wrap(err, "获取关系树选项列表失败!") + return + } + + list = s.treeList(0, models) + return +} + +// treeList 树状列表 +func (s *sSysTreeTable) treeList(pid int64, nodes []*entity.AddonHgexampleTable) (list []*sysin.TableTree) { + list = make([]*sysin.TableTree, 0) + for _, v := range nodes { + if v.Pid == pid { + item := new(sysin.TableTree) + item.AddonHgexampleTable = *v + item.Label = v.Title + item.Value = v.Id + item.Key = v.Id + + child := s.treeList(v.Id, nodes) + if len(child) > 0 { + item.Children = child + } + list = append(list, item) + } + } + return +} diff --git a/server/addons/hgexample/main.go b/server/addons/hgexample/main.go new file mode 100644 index 0000000..2cccd3a --- /dev/null +++ b/server/addons/hgexample/main.go @@ -0,0 +1,97 @@ +// Package hgexample +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package hgexample + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + _ "hotgo/addons/hgexample/crons" + "hotgo/addons/hgexample/global" + _ "hotgo/addons/hgexample/logic" + _ "hotgo/addons/hgexample/queues" + "hotgo/addons/hgexample/router" + "hotgo/internal/library/addons" + "hotgo/internal/service" + "sync" +) + +type module struct { + skeleton *addons.Skeleton + ctx context.Context + sync.Mutex +} + +func init() { + newModule() +} + +func newModule() { + m := &module{ + skeleton: &addons.Skeleton{ + Label: "功能案例", + Name: "hgexample", + Group: 1, + Logo: "", + Brief: "系统的一些功能案例", + Description: "系统自带的功能使用示例及其说明,包含一些简单的交互", + Author: "孟帅", + Version: "v1.0.0", // 当该版本号高于已安装的版本号时,会提示可以更新 + }, + ctx: gctx.New(), + } + + addons.RegisterModule(m) +} + +// Start 启动模块 +func (m *module) Start(option *addons.Option) (err error) { + // 初始化模块 + global.Init(m.ctx, m.skeleton) + + // 注册插件路由 + option.Server.Group("/", func(group *ghttp.RouterGroup) { + group.Middleware(service.Middleware().Addon) + router.Admin(m.ctx, group) + router.Api(m.ctx, group) + router.Home(m.ctx, group) + router.WebSocket(m.ctx, group) + }) + return +} + +// Stop 停止模块 +func (m *module) Stop() (err error) { + return +} + +// Ctx 上下文 +func (m *module) Ctx() context.Context { + return m.ctx +} + +// GetSkeleton 获取模块 +func (m *module) GetSkeleton() *addons.Skeleton { + return m.skeleton +} + +// Install 安装模块 +func (m *module) Install(ctx context.Context) (err error) { + // ... + return +} + +// Upgrade 更新模块 +func (m *module) Upgrade(ctx context.Context) (err error) { + // ... + return +} + +// UnInstall 卸载模块 +func (m *module) UnInstall(ctx context.Context) (err error) { + // ... + return +} diff --git a/server/addons/hgexample/model/config.go b/server/addons/hgexample/model/config.go new file mode 100644 index 0000000..7496b4b --- /dev/null +++ b/server/addons/hgexample/model/config.go @@ -0,0 +1,11 @@ +// Package model +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package model + +// BasicConfig 基础配置 +type BasicConfig struct { + Test string `json:"basicTest"` +} diff --git a/server/addons/hgexample/model/input/sysin/config.go b/server/addons/hgexample/model/input/sysin/config.go new file mode 100644 index 0000000..05c4fc1 --- /dev/null +++ b/server/addons/hgexample/model/input/sysin/config.go @@ -0,0 +1,24 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 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/input/sysin" +) + +// UpdateConfigInp 更新指定配置 +type UpdateConfigInp struct { + sysin.UpdateAddonsConfigInp +} + +type GetConfigInp struct { + sysin.GetAddonsConfigInp +} + +type GetConfigModel struct { + List g.Map `json:"list"` +} diff --git a/server/addons/hgexample/model/input/sysin/index.go b/server/addons/hgexample/model/input/sysin/index.go new file mode 100644 index 0000000..8fb45c7 --- /dev/null +++ b/server/addons/hgexample/model/input/sysin/index.go @@ -0,0 +1,26 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sysin + +import ( + "context" + "github.com/gogf/gf/v2/os/gtime" +) + +// IndexTestInp 测试 +type IndexTestInp struct { + Name string `json:"name" d:"HotGo" dc:"名称"` +} + +func (in *IndexTestInp) Filter(ctx context.Context) (err error) { + return +} + +type IndexTestModel struct { + Name string `json:"name" dc:"名称"` + Module string `json:"module" dc:"当前插件模块"` + Time *gtime.Time `json:"time" dc:"当前时间"` +} diff --git a/server/addons/hgexample/model/input/sysin/table.go b/server/addons/hgexample/model/input/sysin/table.go new file mode 100644 index 0000000..e8d9f58 --- /dev/null +++ b/server/addons/hgexample/model/input/sysin/table.go @@ -0,0 +1,180 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sysin + +import ( + "context" + "errors" + "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/os/gtime" + "hotgo/internal/consts" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" + "hotgo/utility/validate" +) + +// TableEditInp 修改/新增 +type TableEditInp struct { + entity.AddonHgexampleTable +} + +type TableEditModel struct{} + +func (in *TableEditInp) Filter(ctx context.Context) (err error) { + if in.Map.IsNil() { + in.Map = gjson.New(consts.NilJsonToString) + } + if in.Flag.IsNil() { + in.Flag = gjson.New(consts.NilJsonToString) + } + if in.Images.IsNil() { + in.Images = gjson.New(consts.NilJsonToString) + } + if in.Attachfiles.IsNil() { + in.Attachfiles = gjson.New(consts.NilJsonToString) + } + if in.Hobby.IsNil() { + in.Hobby = gjson.New(consts.NilJsonToString) + } + + if in.Title == "" { + return errors.New("标题不能为空") + } + + if in.Email != "" && !validate.IsEmail(in.Email) { + return errors.New("邮箱格式不正确") + } + + if err := g.Validator().Rules("float|between:0,5").Messages("请输入一个浮点数|推荐星只能是0~5星").Data(in.Star).Run(ctx); err != nil { + return err.Current() + } + return +} + +// TableDeleteInp 删除类型 +type TableDeleteInp struct { + Id interface{} `json:"id" v:"required#表格ID不能为空" dc:"表格ID"` +} + +type TableDeleteModel struct{} + +// TableViewInp 获取信息 +type TableViewInp struct { + Id int64 `json:"id" v:"required#表格ID不能为空" dc:"表格ID"` +} + +type TableViewModel struct { + entity.AddonHgexampleTable +} + +// TableListInp 获取列表 +type TableListInp struct { + form.PageReq + form.Sorters + Id int64 `json:"id" description:""` + Flag *gjson.Json `json:"flag" description:"标签"` + Title string `json:"title" description:"标题"` + Content string `json:"content" description:"内容"` + Price []float64 `json:"price" description:"价格"` + ActivityAt *gtime.Time `json:"activityAt" description:"活动时间"` + Switch int `json:"switch" description:"开关"` + Hobby *gjson.Json `json:"hobby" description:"爱好"` + Status int `json:"status" description:"状态"` + CreatedAt []*gtime.Time `json:"createdAt" description:"创建时间"` +} + +type TableListModel struct { + entity.AddonHgexampleTable + TableCategoryName string `json:"TableCategoryName" description:"分类名称"` + TableCategoryDescription string `json:"TableCategoryDescription" description:"分类描述"` + TableCategoryRemark string `json:"TableCategoryRemark" description:"分类备注"` + SysProvincesTitle string `json:"sysProvincesTitle" description:""` +} + +func (in *TableListInp) Filter(ctx context.Context) (err error) { + if !in.Flag.IsNil() { + in.Flag = gjson.New(in.Flag.Var().Ints()) + } + if !in.Hobby.IsNil() { + in.Hobby = gjson.New(in.Hobby.Var().Ints()) + } + return +} + +type TableExportModel struct { + Id int64 `json:"id" description:""` + CategoryId int64 `json:"categoryId" description:"分类ID"` + Flag *gjson.Json `json:"flag" description:"标签"` + Title string `json:"title" description:"标题"` + Star float64 `json:"star" description:"推荐星"` + Price float64 `json:"price" description:"价格"` + Views int64 `json:"views" description:"浏览次数"` + ActivityAt *gtime.Time `json:"activityAt" description:"活动时间"` + StartAt *gtime.Time `json:"startAt" description:"开启时间"` + EndAt *gtime.Time `json:"endAt" description:"结束时间"` + Switch int `json:"switch" description:"开关"` + Sort int `json:"sort" 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:"手机号码"` + Hobby *gjson.Json `json:"hobby" description:"爱好"` + Channel int `json:"channel" description:"渠道"` + Pid int64 `json:"pid" description:"上级ID"` + Level int `json:"level" description:"树等级"` + Tree string `json:"tree" description:"关系树"` + Remark string `json:"remark" 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:"删除时间"` +} + +// TableMaxSortInp 最大排序 +type TableMaxSortInp struct{} + +type TableMaxSortModel struct { + Sort int `json:"sort" description:"排序"` +} + +// TableStatusInp 更新状态 +type TableStatusInp struct { + Id int64 `json:"id" v:"required#表格ID不能为空" dc:"表格ID"` + Status int `json:"status" dc:"状态"` +} + +func (in *TableStatusInp) Filter(ctx context.Context) (err error) { + if in.Id <= 0 { + err = gerror.New("ID不能为空") + return + } + + if in.Status <= 0 { + err = gerror.New("状态不能为空") + return + } + + if !validate.InSlice(consts.StatusSlice, in.Status) { + err = gerror.New("状态不正确") + return + } + return +} + +type TableStatusModel struct{} + +// TableSwitchInp 更新开关状态 +type TableSwitchInp struct { + form.SwitchReq + Id int64 `json:"id" v:"required#表格ID不能为空" dc:"表格ID"` +} + +type TableSwitchModel struct{} diff --git a/server/addons/hgexample/model/input/sysin/tenant_order.go b/server/addons/hgexample/model/input/sysin/tenant_order.go new file mode 100644 index 0000000..61b44a6 --- /dev/null +++ b/server/addons/hgexample/model/input/sysin/tenant_order.go @@ -0,0 +1,123 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.13.1 +package sysin + +import ( + "context" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// TenantOrderUpdateFields 修改多租户功能演示字段过滤 +type TenantOrderUpdateFields struct { + TenantId int64 `json:"tenantId" dc:"租户ID"` + MerchantId int64 `json:"merchantId" dc:"商户ID"` + UserId int64 `json:"userId" dc:"用户ID"` + ProductName string `json:"productName" dc:"购买产品"` + OrderSn string `json:"orderSn" dc:"关联订单号"` + Money float64 `json:"money" dc:"充值金额"` + Remark string `json:"remark" dc:"备注"` + Status int `json:"status" dc:"支付状态"` +} + +// TenantOrderInsertFields 新增多租户功能演示字段过滤 +type TenantOrderInsertFields struct { + TenantId int64 `json:"tenantId" dc:"租户ID"` + MerchantId int64 `json:"merchantId" dc:"商户ID"` + UserId int64 `json:"userId" dc:"用户ID"` + ProductName string `json:"productName" dc:"购买产品"` + OrderSn string `json:"orderSn" dc:"关联订单号"` + Money float64 `json:"money" dc:"充值金额"` + Remark string `json:"remark" dc:"备注"` + Status int `json:"status" dc:"支付状态"` +} + +// TenantOrderEditInp 修改/新增多租户功能演示 +type TenantOrderEditInp struct { + entity.AddonHgexampleTenantOrder +} + +func (in *TenantOrderEditInp) Filter(ctx context.Context) (err error) { + // 验证充值金额 + if err := g.Validator().Rules("required").Data(in.Money).Messages("充值金额不能为空").Run(ctx); err != nil { + return err.Current() + } + + return +} + +type TenantOrderEditModel struct{} + +// TenantOrderDeleteInp 删除多租户功能演示 +type TenantOrderDeleteInp struct { + Id interface{} `json:"id" v:"required#主键不能为空" dc:"主键"` +} + +func (in *TenantOrderDeleteInp) Filter(ctx context.Context) (err error) { + return +} + +type TenantOrderDeleteModel struct{} + +// TenantOrderViewInp 获取指定多租户功能演示信息 +type TenantOrderViewInp struct { + Id int64 `json:"id" v:"required#主键不能为空" dc:"主键"` +} + +func (in *TenantOrderViewInp) Filter(ctx context.Context) (err error) { + return +} + +type TenantOrderViewModel struct { + entity.AddonHgexampleTenantOrder +} + +// TenantOrderListInp 获取多租户功能演示列表 +type TenantOrderListInp struct { + form.PageReq + Id int64 `json:"id" dc:"主键"` + TenantId int64 `json:"tenantId" dc:"租户ID"` + MerchantId int64 `json:"merchantId" dc:"商户ID"` + UserId int64 `json:"userId" dc:"用户ID"` + OrderSn string `json:"orderSn" dc:"关联订单号"` + Status int `json:"status" dc:"支付状态"` + CreatedAt []*gtime.Time `json:"createdAt" dc:"创建时间"` +} + +func (in *TenantOrderListInp) Filter(ctx context.Context) (err error) { + return +} + +type TenantOrderListModel struct { + Id int64 `json:"id" dc:"主键"` + TenantId int64 `json:"tenantId" dc:"租户ID"` + MerchantId int64 `json:"merchantId" dc:"商户ID"` + UserId int64 `json:"userId" dc:"用户ID"` + ProductName string `json:"productName" dc:"购买产品"` + OrderSn string `json:"orderSn" dc:"关联订单号"` + Money float64 `json:"money" dc:"充值金额"` + Remark string `json:"remark" dc:"备注"` + Status int `json:"status" dc:"支付状态"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` +} + +// TenantOrderExportModel 导出多租户功能演示 +type TenantOrderExportModel struct { + Id int64 `json:"id" dc:"主键"` + TenantId int64 `json:"tenantId" dc:"租户ID"` + MerchantId int64 `json:"merchantId" dc:"商户ID"` + UserId int64 `json:"userId" dc:"用户ID"` + ProductName string `json:"productName" dc:"购买产品"` + OrderSn string `json:"orderSn" dc:"关联订单号"` + Money float64 `json:"money" dc:"充值金额"` + Remark string `json:"remark" dc:"备注"` + Status int `json:"status" dc:"支付状态"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` +} diff --git a/server/addons/hgexample/model/input/sysin/tree_table.go b/server/addons/hgexample/model/input/sysin/tree_table.go new file mode 100644 index 0000000..02702c4 --- /dev/null +++ b/server/addons/hgexample/model/input/sysin/tree_table.go @@ -0,0 +1,47 @@ +// Package sysin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package sysin + +import ( + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/os/gtime" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" +) + +// TreeTableListInp 获取列表 +type TreeTableListInp struct { + form.PageReq + form.Sorters + Id int64 `json:"id" description:""` + Flag *gjson.Json `json:"flag" description:"标签"` + Title string `json:"title" description:"标题"` + Content string `json:"content" description:"内容"` + Price []float64 `json:"price" description:"价格"` + ActivityAt *gtime.Time `json:"activityAt" description:"活动时间"` + Switch int `json:"switch" description:"开关"` + Hobby *gjson.Json `json:"hobby" description:"爱好"` + Status int `json:"status" description:"状态"` + CreatedAt []*gtime.Time `json:"createdAt" description:"创建时间"` + Pid int64 `json:"pid" description:"上级ID"` +} + +type TreeTableListModel struct { + entity.AddonHgexampleTable + TableCategoryName string `json:"TableCategoryName" description:"分类名称"` + TableCategoryDescription string `json:"TableCategoryDescription" description:"分类描述"` + TableCategoryRemark string `json:"TableCategoryRemark" description:"分类备注"` + SysProvincesTitle string `json:"sysProvincesTitle" description:""` +} + +// TableTree 树 +type TableTree struct { + entity.AddonHgexampleTable + Key int64 `json:"key" dc:"key"` + Label string `json:"label" dc:"标签"` + Value int64 `json:"value" dc:"键值"` + Children []*TableTree `json:"children"` +} diff --git a/server/addons/hgexample/queues/queues.go b/server/addons/hgexample/queues/queues.go new file mode 100644 index 0000000..9f2e7eb --- /dev/null +++ b/server/addons/hgexample/queues/queues.go @@ -0,0 +1,9 @@ +// Package queues +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package queues + +// 消息队列. +// 插件中的消息队列消费者可以统一在这里注册和处理 diff --git a/server/addons/hgexample/router/admin.go b/server/addons/hgexample/router/admin.go new file mode 100644 index 0000000..75884df --- /dev/null +++ b/server/addons/hgexample/router/admin.go @@ -0,0 +1,36 @@ +// Package router +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "hotgo/addons/hgexample/controller/admin/sys" + "hotgo/addons/hgexample/global" + "hotgo/addons/hgexample/router/genrouter" + "hotgo/internal/consts" + "hotgo/internal/library/addons" + "hotgo/internal/service" +) + +func Admin(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + group.Bind( + sys.Index, + ) + group.Middleware(service.Middleware().AdminAuth) + group.Bind( + sys.Comp, + sys.Config, + sys.Table, + sys.TreeTable, + ) + }) + + // 注册生成路由 + genrouter.Register(ctx, group) +} diff --git a/server/addons/hgexample/router/api.go b/server/addons/hgexample/router/api.go new file mode 100644 index 0000000..60c3626 --- /dev/null +++ b/server/addons/hgexample/router/api.go @@ -0,0 +1,32 @@ +// Package router +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "hotgo/addons/hgexample/controller/api" + "hotgo/addons/hgexample/global" + "hotgo/internal/consts" + "hotgo/internal/library/addons" + "hotgo/internal/service" +) + +// Api 前台路由 +func Api(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppApi, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + group.Bind( + // 无需验证的路由 + api.Index, + ) + group.Middleware(service.Middleware().ApiAuth) + group.Bind( + // 需要验证的路由 + // ... + ) + }) +} diff --git a/server/addons/hgexample/router/genrouter/init.go b/server/addons/hgexample/router/genrouter/init.go new file mode 100644 index 0000000..d15d513 --- /dev/null +++ b/server/addons/hgexample/router/genrouter/init.go @@ -0,0 +1,34 @@ +// Package genrouter +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package genrouter + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "hotgo/addons/hgexample/global" + "hotgo/internal/consts" + "hotgo/internal/library/addons" + "hotgo/internal/service" +) + +var ( + NoLoginRouter []interface{} // 无需登录 + LoginRequiredRouter []interface{} // 需要登录 +) + +// Register 注册通过代码生成的后台路由 +func Register(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + if len(NoLoginRouter) > 0 { + group.Bind(NoLoginRouter...) + } + group.Middleware(service.Middleware().AdminAuth) + if len(LoginRequiredRouter) > 0 { + group.Bind(LoginRequiredRouter...) + } + }) +} diff --git a/server/addons/hgexample/router/genrouter/tenant_order.go b/server/addons/hgexample/router/genrouter/tenant_order.go new file mode 100644 index 0000000..15aa5b0 --- /dev/null +++ b/server/addons/hgexample/router/genrouter/tenant_order.go @@ -0,0 +1,13 @@ +// Package genrouter +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.13.1 +package genrouter + +import "hotgo/addons/hgexample/controller/admin/sys" + +func init() { + LoginRequiredRouter = append(LoginRequiredRouter, sys.TenantOrder) // 多租户功能演示 +} \ No newline at end of file diff --git a/server/addons/hgexample/router/home.go b/server/addons/hgexample/router/home.go new file mode 100644 index 0000000..d985980 --- /dev/null +++ b/server/addons/hgexample/router/home.go @@ -0,0 +1,25 @@ +// Package router +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "hotgo/addons/hgexample/controller/home" + "hotgo/addons/hgexample/global" + "hotgo/internal/consts" + "hotgo/internal/library/addons" +) + +// Home 前台页面路由 +func Home(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppHome, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + group.Bind( + home.Index, + ) + }) +} diff --git a/server/addons/hgexample/router/websocket.go b/server/addons/hgexample/router/websocket.go new file mode 100644 index 0000000..b2ec122 --- /dev/null +++ b/server/addons/hgexample/router/websocket.go @@ -0,0 +1,40 @@ +// Package router +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "hotgo/addons/hgexample/controller/websocket" + "hotgo/addons/hgexample/controller/websocket/handler" + "hotgo/addons/hgexample/global" + "hotgo/internal/consts" + "hotgo/internal/library/addons" + "hotgo/internal/service" + ws "hotgo/internal/websocket" +) + +// WebSocket ws路由配置 +func WebSocket(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppWebSocket, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + group.Bind( + // 无需验证的路由 + websocket.Index, + ) + // ws连接中间件 + group.Middleware(service.Middleware().WebSocketAuth) + group.Bind( + // 需要验证的路由 + // .. + ) + }) + + // 注册消息路由 + ws.RegisterMsg(ws.EventHandlers{ + "admin/addons/hgexample/testMessage": handler.Index.TestMessage, // 测试消息 + }) +} diff --git a/server/addons/hgexample/service/.gitkeep b/server/addons/hgexample/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/server/addons/hgexample/service/sys.go b/server/addons/hgexample/service/sys.go new file mode 100644 index 0000000..9ad290d --- /dev/null +++ b/server/addons/hgexample/service/sys.go @@ -0,0 +1,139 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + "hotgo/addons/hgexample/model" + "hotgo/addons/hgexample/model/input/sysin" + "hotgo/internal/library/hgorm/handler" + + "github.com/gogf/gf/v2/database/gdb" +) + +type ( + ISysConfig interface { + // GetBasic 获取基础配置 + GetBasic(ctx context.Context) (conf *model.BasicConfig, err error) + // GetConfigByGroup 获取指定分组配置 + GetConfigByGroup(ctx context.Context, in *sysin.GetConfigInp) (res *sysin.GetConfigModel, err error) + // UpdateConfigByGroup 更新指定分组的配置 + UpdateConfigByGroup(ctx context.Context, in *sysin.UpdateConfigInp) error + } + ISysIndex interface { + // Test 测试 + Test(ctx context.Context, in *sysin.IndexTestInp) (res *sysin.IndexTestModel, err error) + } + ISysTable interface { + // Model Orm模型 + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + // List 获取列表 + List(ctx context.Context, in *sysin.TableListInp) (list []*sysin.TableListModel, totalCount int, err error) + // Export 导出 + Export(ctx context.Context, in *sysin.TableListInp) (err error) + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.TableEditInp) (err error) + // Delete 删除 + Delete(ctx context.Context, in *sysin.TableDeleteInp) (err error) + // Status 更新状态 + Status(ctx context.Context, in *sysin.TableStatusInp) (err error) + // Switch 更新开关状态 + Switch(ctx context.Context, in *sysin.TableSwitchInp) (err error) + // MaxSort 最大排序 + MaxSort(ctx context.Context, in *sysin.TableMaxSortInp) (res *sysin.TableMaxSortModel, err error) + // View 获取指定信息 + View(ctx context.Context, in *sysin.TableViewInp) (res *sysin.TableViewModel, err error) + } + ISysTenantOrder interface { + // Model 多租户功能演示ORM模型 + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + // List 获取多租户功能演示列表 + List(ctx context.Context, in *sysin.TenantOrderListInp) (list []*sysin.TenantOrderListModel, totalCount int, err error) + // Export 导出多租户功能演示 + Export(ctx context.Context, in *sysin.TenantOrderListInp) (err error) + // Edit 修改/新增多租户功能演示 + Edit(ctx context.Context, in *sysin.TenantOrderEditInp) (err error) + // Delete 删除多租户功能演示 + Delete(ctx context.Context, in *sysin.TenantOrderDeleteInp) (err error) + // View 获取多租户功能演示指定信息 + View(ctx context.Context, in *sysin.TenantOrderViewInp) (res *sysin.TenantOrderViewModel, err error) + } + ISysTreeTable interface { + // Model Orm模型 + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + // List 获取列表 + List(ctx context.Context, in *sysin.TreeTableListInp) (list []*sysin.TreeTableListModel, totalCount int, err error) + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.TableEditInp) (err error) + // Delete 删除 + Delete(ctx context.Context, in *sysin.TableDeleteInp) (err error) + // Select 关系树选项列表 + Select(ctx context.Context) (list []*sysin.TableTree, err error) + } +) + +var ( + localSysConfig ISysConfig + localSysIndex ISysIndex + localSysTable ISysTable + localSysTenantOrder ISysTenantOrder + localSysTreeTable ISysTreeTable +) + +func SysConfig() ISysConfig { + if localSysConfig == nil { + panic("implement not found for interface ISysConfig, forgot register?") + } + return localSysConfig +} + +func RegisterSysConfig(i ISysConfig) { + localSysConfig = i +} + +func SysIndex() ISysIndex { + if localSysIndex == nil { + panic("implement not found for interface ISysIndex, forgot register?") + } + return localSysIndex +} + +func RegisterSysIndex(i ISysIndex) { + localSysIndex = i +} + +func SysTable() ISysTable { + if localSysTable == nil { + panic("implement not found for interface ISysTable, forgot register?") + } + return localSysTable +} + +func RegisterSysTable(i ISysTable) { + localSysTable = i +} + +func SysTenantOrder() ISysTenantOrder { + if localSysTenantOrder == nil { + panic("implement not found for interface ISysTenantOrder, forgot register?") + } + return localSysTenantOrder +} + +func RegisterSysTenantOrder(i ISysTenantOrder) { + localSysTenantOrder = i +} + +func SysTreeTable() ISysTreeTable { + if localSysTreeTable == nil { + panic("implement not found for interface ISysTreeTable, forgot register?") + } + return localSysTreeTable +} + +func RegisterSysTreeTable(i ISysTreeTable) { + localSysTreeTable = i +} diff --git a/server/addons/modules/.gitkeep b/server/addons/modules/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/server/addons/modules/hgexample.go b/server/addons/modules/hgexample.go new file mode 100644 index 0000000..eafbc58 --- /dev/null +++ b/server/addons/modules/hgexample.go @@ -0,0 +1,8 @@ +// Package modules +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package modules + +import _ "hotgo/addons/hgexample" diff --git a/server/api/admin/addons/addons.go b/server/api/admin/addons/addons.go new file mode 100644 index 0000000..83dd492 --- /dev/null +++ b/server/api/admin/addons/addons.go @@ -0,0 +1,59 @@ +// Package addons +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package addons + +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:"/addons/list" method:"get" tags:"插件管理" summary:"获取插件列表"` + sysin.AddonsListInp +} + +type ListRes struct { + List []*sysin.AddonsListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// BuildReq 提交生成 +type BuildReq struct { + g.Meta `path:"/addons/build" method:"post" tags:"插件管理" summary:"提交生成"` + sysin.AddonsBuildInp +} + +type BuildRes struct { +} + +// InstallReq 安装模块 +type InstallReq struct { + g.Meta `path:"/addons/install" method:"post" tags:"插件管理" summary:"安装模块"` + sysin.AddonsInstallInp +} + +type InstallRes struct { +} + +// UpgradeReq 更新模块 +type UpgradeReq struct { + g.Meta `path:"/addons/upgrade" method:"post" tags:"插件管理" summary:"更新模块"` + sysin.AddonsUpgradeInp +} + +type UpgradeRes struct { +} + +// UnInstallReq 卸载模块 +type UnInstallReq struct { + g.Meta `path:"/addons/uninstall" method:"post" tags:"插件管理" summary:"卸载模块"` + sysin.AddonsUnInstallInp +} + +type UnInstallRes struct { +} diff --git a/server/api/admin/attachment/attachment.go b/server/api/admin/attachment/attachment.go new file mode 100644 index 0000000..df58a31 --- /dev/null +++ b/server/api/admin/attachment/attachment.go @@ -0,0 +1,49 @@ +// Package attachment +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package attachment + +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:"/attachment/list" method:"get" tags:"附件" summary:"获取附件列表"` + sysin.AttachmentListInp +} + +type ListRes struct { + List []*sysin.AttachmentListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取附件信息 +type ViewReq struct { + g.Meta `path:"/attachment/view" method:"get" tags:"附件" summary:"获取指定附件信息"` + sysin.AttachmentViewInp +} + +type ViewRes struct { + *sysin.AttachmentViewModel +} + +// DeleteReq 删除附件 +type DeleteReq struct { + g.Meta `path:"/attachment/delete" method:"post" tags:"附件" summary:"删除附件"` + sysin.AttachmentDeleteInp +} + +type DeleteRes struct{} + +// ClearKindReq 清空上传类型 +type ClearKindReq struct { + g.Meta `path:"/attachment/clearKind" method:"post" tags:"附件" summary:"清空上传类型"` + sysin.AttachmentClearKindInp +} + +type ClearKindRes struct{} diff --git a/server/api/admin/blacklist/blacklist.go b/server/api/admin/blacklist/blacklist.go new file mode 100644 index 0000000..97c7475 --- /dev/null +++ b/server/api/admin/blacklist/blacklist.go @@ -0,0 +1,57 @@ +// Package blacklist +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package blacklist + +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:"/blacklist/list" method:"get" tags:"黑名单" summary:"获取黑名单列表"` + sysin.BlacklistListInp +} + +type ListRes struct { + List []*sysin.BlacklistListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取信息 +type ViewReq struct { + g.Meta `path:"/blacklist/view" method:"get" tags:"黑名单" summary:"获取指定信息"` + sysin.BlacklistViewInp +} + +type ViewRes struct { + *sysin.BlacklistViewModel +} + +// EditReq 修改/新增 +type EditReq struct { + g.Meta `path:"/blacklist/edit" method:"post" tags:"黑名单" summary:"修改/新增黑名单"` + sysin.BlacklistEditInp +} + +type EditRes struct{} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/blacklist/delete" method:"post" tags:"黑名单" summary:"删除黑名单"` + sysin.BlacklistDeleteInp +} + +type DeleteRes struct{} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/blacklist/status" method:"post" tags:"黑名单" summary:"更新黑名单状态"` + sysin.BlacklistStatusInp +} + +type StatusRes struct{} diff --git a/server/api/admin/cash/cash.go b/server/api/admin/cash/cash.go new file mode 100644 index 0000000..0d82d1f --- /dev/null +++ b/server/api/admin/cash/cash.go @@ -0,0 +1,49 @@ +// Package cash +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cash + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/cash/list" method:"get" tags:"提现" summary:"获取提现列表"` + adminin.CashListInp +} + +type ListRes struct { + List []*adminin.CashListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/cash/view" method:"get" tags:"提现" summary:"获取指定信息"` + adminin.CashViewInp +} + +type ViewRes struct { + *adminin.CashViewModel +} + +// ApplyReq 申请提现 +type ApplyReq struct { + g.Meta `path:"/cash/apply" method:"post" tags:"提现" summary:"申请提现"` + Money float64 `json:"money" description:"提现金额"` +} + +type ApplyRes struct{} + +// PaymentReq 提现打款处理 +type PaymentReq struct { + g.Meta `path:"/cash/payment" method:"post" tags:"提现" summary:"提现打款处理"` + adminin.CashPaymentInp +} + +type PaymentRes struct{} diff --git a/server/api/admin/common/console.go b/server/api/admin/common/console.go new file mode 100644 index 0000000..025ba2a --- /dev/null +++ b/server/api/admin/common/console.go @@ -0,0 +1,39 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import "github.com/gogf/gf/v2/frame/g" + +// ConsoleStatReq 控制台统计 +type ConsoleStatReq struct { + g.Meta `path:"/console/stat" method:"get" tags:"控制台" summary:"综合数据统计"` +} + +type ConsoleStatRes struct { + Visits struct { + DayVisits float64 `json:"dayVisits"` + Rise float64 `json:"rise"` + Decline float64 `json:"decline"` + Amount float64 `json:"amount"` + } `json:"visits"` + Saleroom struct { + WeekSaleroom float64 `json:"weekSaleroom"` + Amount float64 `json:"amount"` + Degree float64 `json:"degree"` + } `json:"saleroom"` + OrderLarge struct { + WeekLarge float64 `json:"weekLarge"` + Rise float64 `json:"rise"` + Decline float64 `json:"decline"` + Amount float64 `json:"amount"` + } `json:"orderLarge"` + Volume struct { + WeekLarge float64 `json:"weekLarge"` + Rise float64 `json:"rise"` + Decline float64 `json:"decline"` + Amount float64 `json:"amount"` + } `json:"volume"` +} diff --git a/server/api/admin/common/ems.go b/server/api/admin/common/ems.go new file mode 100644 index 0000000..82a5a53 --- /dev/null +++ b/server/api/admin/common/ems.go @@ -0,0 +1,27 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// SendTestEmailReq 发送测试邮件 +type SendTestEmailReq struct { + g.Meta `path:"/ems/sendTest" tags:"邮件" method:"post" summary:"发送测试邮件"` + To string `json:"to" v:"required#接收者邮件不能为空" dc:"接收者邮件,多个用;隔开"` +} + +type SendTestEmailRes struct { +} + +// SendBindEmsReq 发送换绑邮件 +type SendBindEmsReq struct { + g.Meta `path:"/ems/sendBind" tags:"邮件" method:"post" summary:"发送换绑邮件"` +} + +type SendBindEmsRes struct { +} diff --git a/server/api/admin/common/site.go b/server/api/admin/common/site.go new file mode 100644 index 0000000..7825a4c --- /dev/null +++ b/server/api/admin/common/site.go @@ -0,0 +1,90 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model" + "hotgo/internal/model/input/adminin" +) + +// LoginLogoutReq 注销登录 +type LoginLogoutReq struct { + g.Meta `path:"/site/logout" method:"post" tags:"后台基础" summary:"注销登录"` +} + +type LoginLogoutRes struct{} + +// RegisterReq 提交账号注册 +type RegisterReq struct { + g.Meta `path:"/site/register" method:"post" tags:"后台基础" summary:"账号注册"` + adminin.RegisterInp +} + +type RegisterRes struct { + *adminin.LoginModel +} + +// LoginCaptchaReq 获取登录验证码 +type LoginCaptchaReq struct { + g.Meta `path:"/site/captcha" method:"get" tags:"后台基础" summary:"获取登录验证码"` +} + +type LoginCaptchaRes struct { + Cid string `json:"cid" dc:"验证码ID"` + Base64 string `json:"base64" dc:"验证码"` +} + +// AccountLoginReq 提交账号登录 +type AccountLoginReq struct { + g.Meta `path:"/site/accountLogin" method:"post" tags:"后台基础" summary:"账号登录"` + adminin.AccountLoginInp +} + +type AccountLoginRes struct { + *adminin.LoginModel +} + +// MobileLoginReq 提交手机号登录 +type MobileLoginReq struct { + g.Meta `path:"/site/mobileLogin" method:"post" tags:"后台基础" summary:"手机号登录"` + adminin.MobileLoginInp +} + +type MobileLoginRes struct { + *adminin.LoginModel +} + +// SiteConfigReq 获取配置 +type SiteConfigReq struct { + g.Meta `path:"/site/config" method:"get" tags:"后台基础" summary:"获取配置"` +} + +type SiteConfigRes struct { + Version string `json:"version" dc:"系统版本"` + WsAddr string `json:"wsAddr" dc:"客户端websocket地址"` + Domain string `json:"domain" dc:"对外域名"` + Mode string `json:"mode" dc:"运行模式"` +} + +// SiteLoginConfigReq 获取登录配置 +type SiteLoginConfigReq struct { + g.Meta `path:"/site/loginConfig" method:"get" tags:"后台基础" summary:"获取登录配置"` +} + +type SiteLoginConfigRes struct { + *model.LoginConfig + I18nSwitch bool `json:"i18nSwitch" dc:"国际化开关"` + DefaultLanguage string `json:"defaultLanguage" dc:"默认语言设置"` + ProjectName string `json:"projectName" dc:"项目名称"` +} + +// SitePingReq ping +type SitePingReq struct { + g.Meta `path:"/site/ping" method:"get" tags:"后台基础" summary:"ping"` +} + +type SitePingRes struct{} diff --git a/server/api/admin/common/sms.go b/server/api/admin/common/sms.go new file mode 100644 index 0000000..53ebbd1 --- /dev/null +++ b/server/api/admin/common/sms.go @@ -0,0 +1,37 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/sysin" +) + +// SendTestSmsReq 发送测试短信 +type SendTestSmsReq struct { + g.Meta `path:"/sms/sendTest" tags:"短信" method:"post" summary:"发送测试短信"` + sysin.SendCodeInp +} + +type SendTestSmsRes struct { +} + +// SendBindSmsReq 发送换绑短信 +type SendBindSmsReq struct { + g.Meta `path:"/sms/sendBind" tags:"短信" method:"post" summary:"发送换绑短信"` +} + +type SendBindSmsRes struct { +} + +// SendSmsReq 发送短信 +type SendSmsReq struct { + g.Meta `path:"/sms/send" tags:"短信" method:"post" summary:"发送短信"` + sysin.SendCodeInp +} + +type SendSmsRes struct { +} diff --git a/server/api/admin/common/upload.go b/server/api/admin/common/upload.go new file mode 100644 index 0000000..8f1afb3 --- /dev/null +++ b/server/api/admin/common/upload.go @@ -0,0 +1,48 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/sysin" +) + +// UploadFileReq 上传文件 +type UploadFileReq struct { + g.Meta `path:"/upload/file" tags:"附件" method:"post" summary:"上传附件"` +} + +type UploadFileRes *sysin.AttachmentListModel + +// CheckMultipartReq 检查文件分片 +type CheckMultipartReq struct { + g.Meta `path:"/upload/checkMultipart" tags:"附件" method:"post" summary:"检查文件分片"` + sysin.CheckMultipartInp +} + +type CheckMultipartRes struct { + *sysin.CheckMultipartModel +} + +// UploadPartReq 分片上传 +type UploadPartReq struct { + g.Meta `path:"/upload/uploadPart" tags:"附件" method:"post" summary:"分片上传"` + sysin.UploadPartInp +} + +type UploadPartRes struct { + *sysin.UploadPartModel +} + +// ImageTransferStorageReq 图片链接转存 +type ImageTransferStorageReq struct { + g.Meta `path:"/upload/imageTransferStorage" tags:"附件" method:"post" summary:"图片链接转存"` + sysin.ImageTransferStorageInp +} + +type ImageTransferStorageRes struct { + *sysin.ImageTransferStorageModel +} diff --git a/server/api/admin/common/wechat.go b/server/api/admin/common/wechat.go new file mode 100644 index 0000000..c7af478 --- /dev/null +++ b/server/api/admin/common/wechat.go @@ -0,0 +1,31 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/commonin" +) + +// WechatAuthorizeReq 微信用户授权 +type WechatAuthorizeReq struct { + g.Meta `path:"/wechat/authorize" method:"get" tags:"微信" summary:"微信用户授权"` + commonin.WechatAuthorizeInp +} + +type WechatAuthorizeRes struct { + *commonin.WechatAuthorizeModel +} + +// WechatAuthorizeCallReq 微信用户授权回调 +type WechatAuthorizeCallReq struct { + g.Meta `path:"/wechat/authorizeCall" method:"get" tags:"微信" summary:"微信用户授权"` + commonin.WechatAuthorizeCallInp +} + +type WechatAuthorizeCallRes struct { + *commonin.WechatAuthorizeCallModel +} diff --git a/server/api/admin/config/config.go b/server/api/admin/config/config.go new file mode 100644 index 0000000..cc8b9b5 --- /dev/null +++ b/server/api/admin/config/config.go @@ -0,0 +1,47 @@ +// Package config +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package config + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" +) + +// GetReq 获取指定分组的配置 +type GetReq struct { + g.Meta `path:"/config/get" method:"get" tags:"配置" summary:"获取指定分组的配置"` + sysin.GetConfigInp +} + +type GetRes struct { + *sysin.GetConfigModel +} + +// UpdateReq 获取指定分组的配置 +type UpdateReq struct { + g.Meta `path:"/config/update" method:"post" tags:"配置" summary:"获取指定分组的配置"` + sysin.UpdateConfigInp +} + +type UpdateRes struct { +} + +// TypeSelectReq 数据类型选项 +type TypeSelectReq struct { + g.Meta `path:"/config/typeSelect" method:"get" tags:"配置" summary:"数据类型选项"` +} + +type TypeSelectRes []form.Select + +// GetCashReq 获取提现配置 +type GetCashReq struct { + g.Meta `path:"/config/getCash" method:"get" tags:"配置" summary:"获取提现配置"` +} + +type GetCashRes struct { + *sysin.GetConfigModel +} diff --git a/server/api/admin/creditslog/creditslog.go b/server/api/admin/creditslog/creditslog.go new file mode 100644 index 0000000..bec4694 --- /dev/null +++ b/server/api/admin/creditslog/creditslog.go @@ -0,0 +1,33 @@ +// Package creditslog +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.5.3 +// @AutoGenerate Date 2023-04-15 15:59:58 +package creditslog + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// ListReq 查询资产变动列表 +type ListReq struct { + g.Meta `path:"/creditsLog/list" method:"get" tags:"资产变动" summary:"获取资产变动列表"` + adminin.CreditsLogListInp +} + +type ListRes struct { + form.PageRes + List []*adminin.CreditsLogListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出资产变动列表 +type ExportReq struct { + g.Meta `path:"/creditsLog/export" method:"get" tags:"资产变动" summary:"导出资产变动列表"` + adminin.CreditsLogListInp +} + +type ExportRes struct{} diff --git a/server/api/admin/cron/cron.go b/server/api/admin/cron/cron.go new file mode 100644 index 0000000..87f7267 --- /dev/null +++ b/server/api/admin/cron/cron.go @@ -0,0 +1,93 @@ +// Package cron +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cron + +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:"/cron/list" method:"get" tags:"定时任务" summary:"获取定时任务列表"` + sysin.CronListInp +} + +type ListRes struct { + List []*sysin.CronListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取信息 +type ViewReq struct { + g.Meta `path:"/cron/view" method:"get" tags:"定时任务" summary:"获取指定信息"` + sysin.CronViewInp +} + +type ViewRes struct { + *sysin.CronViewModel +} + +// EditReq 修改/新增 +type EditReq struct { + g.Meta `path:"/cron/edit" method:"post" tags:"定时任务" summary:"修改/新增定时任务"` + sysin.CronEditInp +} + +type EditRes struct { + *sysin.CronEditModel +} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/cron/delete" method:"post" tags:"定时任务" summary:"删除定时任务"` + sysin.CronDeleteInp +} + +type DeleteRes struct { + *sysin.CronDeleteModel +} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/cron/maxSort" method:"get" tags:"定时任务" summary:"定时任务最大排序"` + sysin.CronMaxSortInp +} + +type MaxSortRes struct { + *sysin.CronMaxSortModel +} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/cron/status" method:"post" tags:"定时任务" summary:"更新定时任务状态"` + sysin.CronStatusInp +} + +type StatusRes struct { + *sysin.CronStatusModel +} + +// OnlineExecReq 在线执行 +type OnlineExecReq struct { + g.Meta `path:"/cron/onlineExec" method:"post" tags:"定时任务" summary:"在线执行"` + sysin.OnlineExecInp +} + +type OnlineExecRes struct { + *sysin.OnlineExecModel +} + +// DispatchLogReq 调度日志 +type DispatchLogReq struct { + g.Meta `path:"/cron/dispatchLog" method:"post" tags:"定时任务" summary:"调度日志"` + sysin.DispatchLogInp +} + +type DispatchLogRes struct { + *sysin.DispatchLogModel +} diff --git a/server/api/admin/cron/cron_group.go b/server/api/admin/cron/cron_group.go new file mode 100644 index 0000000..fa20089 --- /dev/null +++ b/server/api/admin/cron/cron_group.go @@ -0,0 +1,83 @@ +// Package cron +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cron + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" +) + +// GroupListReq 查询列表 +type GroupListReq struct { + g.Meta `path:"/cronGroup/list" method:"get" tags:"定时任务分组" summary:"获取定时任务分组列表"` + sysin.CronGroupListInp +} + +type GroupListRes struct { + List []*sysin.CronGroupListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// GroupViewReq 获取信息 +type GroupViewReq struct { + g.Meta `path:"/cronGroup/view" method:"get" tags:"定时任务分组" summary:"获取指定信息"` + sysin.CronGroupViewInp +} + +type GroupViewRes struct { + *sysin.CronGroupViewModel +} + +// GroupEditReq 修改/新增 +type GroupEditReq struct { + g.Meta `path:"/cronGroup/edit" method:"post" tags:"定时任务分组" summary:"修改/新增定时任务分组"` + sysin.CronGroupEditInp +} + +type GroupEditRes struct { + *sysin.CronGroupEditModel +} + +// GroupDeleteReq 删除 +type GroupDeleteReq struct { + g.Meta `path:"/cronGroup/delete" method:"post" tags:"定时任务分组" summary:"删除定时任务分组"` + sysin.CronGroupDeleteInp +} + +type GroupDeleteRes struct { + *sysin.CronGroupDeleteModel +} + +// GroupMaxSortReq 最大排序 +type GroupMaxSortReq struct { + g.Meta `path:"/cronGroup/maxSort" method:"get" tags:"定时任务分组" summary:"定时任务分组最大排序"` + sysin.CronGroupMaxSortInp +} + +type GroupMaxSortRes struct { + *sysin.CronGroupMaxSortModel +} + +// GroupStatusReq 更新状态 +type GroupStatusReq struct { + g.Meta `path:"/cronGroup/status" method:"post" tags:"定时任务分组" summary:"更新定时任务分组状态"` + sysin.CronGroupStatusInp +} + +type GroupStatusRes struct { + *sysin.CronGroupStatusModel +} + +// GroupSelectReq 定时任务分组选项 +type GroupSelectReq struct { + g.Meta `path:"/cronGroup/select" method:"get" tags:"定时任务分组" summary:"定时任务分组选项"` + sysin.CronGroupSelectInp +} + +type GroupSelectRes struct { + *sysin.CronGroupSelectModel +} diff --git a/server/api/admin/curddemo/curddemo.go b/server/api/admin/curddemo/curddemo.go new file mode 100644 index 0000000..f570d4f --- /dev/null +++ b/server/api/admin/curddemo/curddemo.go @@ -0,0 +1,85 @@ +// Package curddemo +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2025 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.18.6 +package curddemo + +import ( + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" + + "github.com/gogf/gf/v2/frame/g" +) + +// ListReq 查询CURD列表列表 +type ListReq struct { + g.Meta `path:"/curdDemo/list" method:"get" tags:"CURD列表" summary:"获取CURD列表列表"` + sysin.CurdDemoListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.CurdDemoListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出CURD列表列表 +type ExportReq struct { + g.Meta `path:"/curdDemo/export" method:"get" tags:"CURD列表" summary:"导出CURD列表列表"` + sysin.CurdDemoListInp +} + +type ExportRes struct{} + +// ViewReq 获取CURD列表指定信息 +type ViewReq struct { + g.Meta `path:"/curdDemo/view" method:"get" tags:"CURD列表" summary:"获取CURD列表指定信息"` + sysin.CurdDemoViewInp +} + +type ViewRes struct { + *sysin.CurdDemoViewModel +} + +// EditReq 修改/新增CURD列表 +type EditReq struct { + g.Meta `path:"/curdDemo/edit" method:"post" tags:"CURD列表" summary:"修改/新增CURD列表"` + sysin.CurdDemoEditInp +} + +type EditRes struct{} + +// DeleteReq 删除CURD列表 +type DeleteReq struct { + g.Meta `path:"/curdDemo/delete" method:"post" tags:"CURD列表" summary:"删除CURD列表"` + sysin.CurdDemoDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 获取CURD列表最大排序 +type MaxSortReq struct { + g.Meta `path:"/curdDemo/maxSort" method:"get" tags:"CURD列表" summary:"获取CURD列表最大排序"` + sysin.CurdDemoMaxSortInp +} + +type MaxSortRes struct { + *sysin.CurdDemoMaxSortModel +} + +// StatusReq 更新CURD列表状态 +type StatusReq struct { + g.Meta `path:"/curdDemo/status" method:"post" tags:"CURD列表" summary:"更新CURD列表状态"` + sysin.CurdDemoStatusInp +} + +type StatusRes struct{} + +// SwitchReq 更新CURD列表开关状态 +type SwitchReq struct { + g.Meta `path:"/curdDemo/switch" method:"post" tags:"CURD列表" summary:"更新CURD列表状态"` + sysin.CurdDemoSwitchInp +} + +type SwitchRes struct{} \ No newline at end of file diff --git a/server/api/admin/dept/dept.go b/server/api/admin/dept/dept.go new file mode 100644 index 0000000..565ec74 --- /dev/null +++ b/server/api/admin/dept/dept.go @@ -0,0 +1,75 @@ +// Package dept +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package dept + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" + "hotgo/utility/tree" +) + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/dept/list" method:"get" tags:"部门" summary:"获取部门列表"` + adminin.DeptListInp +} + +type ListRes *adminin.DeptListModel + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/dept/view" method:"get" tags:"部门" summary:"获取指定信息"` + adminin.DeptViewInp +} + +type ViewRes struct { + *adminin.DeptViewModel +} + +// EditReq 修改/新增字典数据 +type EditReq struct { + g.Meta `path:"/dept/edit" method:"post" tags:"部门" summary:"修改/新增部门"` + adminin.DeptEditInp +} + +type EditRes struct{} + +// DeleteReq 删除字典类型 +type DeleteReq struct { + g.Meta `path:"/dept/delete" method:"post" tags:"部门" summary:"删除部门"` + adminin.DeptDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/dept/maxSort" method:"get" tags:"部门" summary:"部门最大排序"` + adminin.DeptMaxSortInp +} + +type MaxSortRes struct { + *adminin.DeptMaxSortModel +} + +// OptionReq 获取当前登录用户可选的部门选项 +type OptionReq struct { + g.Meta `path:"/dept/option" method:"get" tags:"部门" summary:"获取当前登录用户可选的部门选项"` + adminin.DeptOptionInp +} + +type OptionRes struct { + *adminin.DeptOptionModel + form.PageRes +} + +// TreeOptionReq 获取部门关系树选项 +type TreeOptionReq struct { + g.Meta `path:"/dept/treeOption" method:"get" tags:"部门" summary:"获取部门关系树选项"` +} + +type TreeOptionRes []tree.Node diff --git a/server/api/admin/dict/dict_data.go b/server/api/admin/dict/dict_data.go new file mode 100644 index 0000000..8ecdea7 --- /dev/null +++ b/server/api/admin/dict/dict_data.go @@ -0,0 +1,53 @@ +// Package dict +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package dict + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" +) + +// DataEditReq 修改/新增字典数据 +type DataEditReq struct { + g.Meta `path:"/dictData/edit" method:"post" tags:"字典数据" summary:"修改/新增字典数据"` + sysin.DictDataEditInp +} + +type DataEditRes struct{} + +// DataDeleteReq 删除字典数据 +type DataDeleteReq struct { + g.Meta `path:"/dictData/delete" method:"post" tags:"字典数据" summary:"删除字典数据"` + sysin.DictDataDeleteInp +} + +type DataDeleteRes struct{} + +// DataListReq 查询列表 +type DataListReq struct { + g.Meta `path:"/dictData/list" method:"get" tags:"字典数据" summary:"获取字典数据列表"` + sysin.DictDataListInp +} + +type DataListRes struct { + List []*sysin.DictDataListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +type DataSelectReq struct { + g.Meta `path:"/dictData/option/{Type}" method:"get" tags:"字典数据" summary:"获取指定字典选项"` + sysin.DataSelectInp +} + +type DataSelectRes sysin.DataSelectModel + +type DataSelectsReq struct { + g.Meta `path:"/dictData/options" method:"get" tags:"字典数据" summary:"获取多个字典选项"` + Types []string `json:"types"` +} + +type DataSelectsRes map[string]sysin.DataSelectModel diff --git a/server/api/admin/dict/dict_type.go b/server/api/admin/dict/dict_type.go new file mode 100644 index 0000000..16f09cb --- /dev/null +++ b/server/api/admin/dict/dict_type.go @@ -0,0 +1,36 @@ +// Package dict +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package dict + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/sysin" +) + +// TypeTreeReq 字典类型树 +type TypeTreeReq struct { + g.Meta `path:"/dictType/tree" tags:"字典类型" method:"get" summary:"字典类型树列表"` +} + +type TypeTreeRes struct { + List []*sysin.DictTypeTree `json:"list" dc:"数据列表"` +} + +// TypeEditReq 修改/新增字典数据 +type TypeEditReq struct { + g.Meta `path:"/dictType/edit" method:"post" tags:"字典类型" summary:"修改/新增字典类型"` + sysin.DictTypeEditInp +} + +type TypeEditRes struct{} + +// TypeDeleteReq 删除字典类型 +type TypeDeleteReq struct { + g.Meta `path:"/dictType/delete" method:"post" tags:"字典类型" summary:"删除字典类型"` + sysin.DictTypeDeleteInp +} + +type TypeDeleteRes struct{} diff --git a/server/api/admin/emslog/emslog.go b/server/api/admin/emslog/emslog.go new file mode 100644 index 0000000..3fd1578 --- /dev/null +++ b/server/api/admin/emslog/emslog.go @@ -0,0 +1,65 @@ +// Package emslog +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +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/admin/gencodes/gencodes.go b/server/api/admin/gencodes/gencodes.go new file mode 100644 index 0000000..7b196c8 --- /dev/null +++ b/server/api/admin/gencodes/gencodes.go @@ -0,0 +1,118 @@ +// Package gencodes +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package gencodes + +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:"/genCodes/list" method:"get" tags:"生成代码" summary:"获取生成代码列表"` + sysin.GenCodesListInp +} + +type ListRes struct { + List []*sysin.GenCodesListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/genCodes/view" method:"get" tags:"生成代码" summary:"获取指定信息"` + sysin.GenCodesViewInp +} + +type ViewRes struct { + *sysin.GenCodesViewModel +} + +// EditReq 修改/新增数据 +type EditReq struct { + g.Meta `path:"/genCodes/edit" method:"post" tags:"生成代码" summary:"修改/新增生成代码"` + sysin.GenCodesEditInp +} + +type EditRes struct { + *sysin.GenCodesEditModel +} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/genCodes/delete" method:"post" tags:"生成代码" summary:"删除生成代码"` + sysin.GenCodesDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/genCodes/maxSort" method:"get" tags:"生成代码" summary:"生成代码最大排序"` + sysin.GenCodesMaxSortInp +} + +type MaxSortRes struct { + *sysin.GenCodesMaxSortModel +} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/genCodes/status" method:"post" tags:"生成代码" summary:"更新生成代码状态"` + sysin.GenCodesStatusInp +} + +type StatusRes struct{} + +type SelectsReq struct { + g.Meta `path:"/genCodes/selects" method:"get" tags:"生成代码" summary:"生成入口选项"` + sysin.GenCodesSelectsInp +} + +type SelectsRes struct { + *sysin.GenCodesSelectsModel +} + +type TableSelectReq struct { + g.Meta `path:"/genCodes/tableSelect" method:"get" tags:"生成代码" summary:"数据库表选项"` + sysin.GenCodesTableSelectInp +} + +type TableSelectRes []*sysin.GenCodesTableSelectModel + +type ColumnSelectReq struct { + g.Meta `path:"/genCodes/columnSelect" method:"get" tags:"生成代码" summary:"表字段选项"` + sysin.GenCodesColumnSelectInp +} + +type ColumnSelectRes []*sysin.GenCodesColumnSelectModel + +type ColumnListReq struct { + g.Meta `path:"/genCodes/columnList" method:"get" tags:"生成代码" summary:"表字段列表"` + sysin.GenCodesColumnListInp +} + +type ColumnListRes []*sysin.GenCodesColumnListModel + +// PreviewReq 生成预览 +type PreviewReq struct { + g.Meta `path:"/genCodes/preview" method:"post" tags:"生成代码" summary:"生成预览"` + sysin.GenCodesPreviewInp +} + +type PreviewRes struct { + *sysin.GenCodesPreviewModel +} + +// BuildReq 提交生成 +type BuildReq struct { + g.Meta `path:"/genCodes/build" method:"post" tags:"生成代码" summary:"提交生成"` + sysin.GenCodesBuildInp +} + +type BuildRes struct { +} diff --git a/server/api/admin/log/log.go b/server/api/admin/log/log.go new file mode 100644 index 0000000..981751d --- /dev/null +++ b/server/api/admin/log/log.go @@ -0,0 +1,56 @@ +// Package log +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package log + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" +) + +// ClearReq 清空日志 +type ClearReq struct { + g.Meta `path:"/log/clear" method:"post" tags:"访问日志" summary:"清空日志"` +} + +type ClearRes struct{} + +// ExportReq 导出 +type ExportReq struct { + g.Meta `path:"/log/export" method:"get" tags:"访问日志" summary:"导出日志"` + sysin.LogListInp +} + +type ExportRes struct{} + +// ListReq 获取菜单列表 +type ListReq struct { + g.Meta `path:"/log/list" method:"get" tags:"访问日志" summary:"获取日志列表"` + sysin.LogListInp +} + +type ListRes struct { + List []*sysin.LogListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/log/delete" method:"post" tags:"访问日志" summary:"删除日志"` + sysin.LogDeleteInp +} + +type DeleteRes struct{} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/log/view" method:"get" tags:"访问日志" summary:"获取指定信息"` + sysin.LogViewInp +} + +type ViewRes struct { + *sysin.LogViewModel +} diff --git a/server/api/admin/loginlog/loginlog.go b/server/api/admin/loginlog/loginlog.go new file mode 100644 index 0000000..6fd3710 --- /dev/null +++ b/server/api/admin/loginlog/loginlog.go @@ -0,0 +1,39 @@ +// Package loginlog +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package loginlog + +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:"/loginLog/list" method:"get" tags:"登录日志" summary:"获取登录日志列表"` + sysin.LoginLogListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.LoginLogListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出登录日志列表 +type ExportReq struct { + g.Meta `path:"/loginLog/export" method:"get" tags:"登录日志" summary:"导出登录日志列表"` + sysin.LoginLogListInp +} + +type ExportRes struct{} + +// DeleteReq 删除登录日志 +type DeleteReq struct { + g.Meta `path:"/loginLog/delete" method:"post" tags:"登录日志" summary:"删除登录日志"` + sysin.LoginLogDeleteInp +} + +type DeleteRes struct{} diff --git a/server/api/admin/member/member.go b/server/api/admin/member/member.go new file mode 100644 index 0000000..49cd1f0 --- /dev/null +++ b/server/api/admin/member/member.go @@ -0,0 +1,138 @@ +// Package member +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package member + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// 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:"更新用户资料"` + adminin.MemberUpdateProfileInp +} + +type UpdateProfileRes struct{} + +// UpdatePwdReq 修改登录密码 +type UpdatePwdReq struct { + g.Meta `path:"/member/updatePwd" method:"post" tags:"用户" summary:"重置密码"` + adminin.MemberUpdatePwdInp +} + +type UpdatePwdRes struct{} + +// ResetPwdReq 重置密码 +type ResetPwdReq struct { + g.Meta `path:"/member/resetPwd" method:"post" tags:"用户" summary:"重置密码"` + adminin.MemberResetPwdInp +} + +type ResetPwdRes struct{} + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/member/list" method:"get" tags:"用户" summary:"获取用户列表"` + adminin.MemberListInp +} + +type ListRes struct { + List []*adminin.MemberListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/member/view" method:"get" tags:"用户" summary:"获取指定信息"` + adminin.MemberViewInp +} + +type ViewRes struct { + *adminin.MemberViewModel +} + +// EditReq 修改/新增 +type EditReq struct { + 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:"删除用户"` + adminin.MemberDeleteInp +} + +type DeleteRes struct{} + +// StatusReq 更新用户状态 +type StatusReq struct { + 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" tags:"用户" summary:"获取可选的后台用户选项"` + adminin.MemberSelectInp +} + +type SelectRes []*adminin.MemberSelectModel + +// InfoReq 获取登录用户信息 +type InfoReq struct { + g.Meta `path:"/member/info" method:"get" tags:"用户" summary:"获取登录用户信息"` +} + +type InfoRes struct { + *adminin.LoginMemberInfoModel +} + +// AddBalanceReq 增加余额 +type AddBalanceReq struct { + g.Meta `path:"/member/addBalance" method:"post" tags:"用户" summary:"增加余额"` + adminin.MemberAddBalanceInp +} + +type AddBalanceRes struct{} + +// AddIntegralReq 增加积分 +type AddIntegralReq struct { + g.Meta `path:"/member/addIntegral" method:"post" tags:"用户" summary:"增加积分"` + adminin.MemberAddIntegralInp +} + +type AddIntegralRes struct{} diff --git a/server/api/admin/menu/menu.go b/server/api/admin/menu/menu.go new file mode 100644 index 0000000..45351da --- /dev/null +++ b/server/api/admin/menu/menu.go @@ -0,0 +1,39 @@ +// Package menu +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package menu + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// EditReq 修改/新增菜单 +type EditReq struct { + g.Meta `path:"/menu/edit" method:"post" tags:"菜单" summary:"修改/新增菜单"` + adminin.MenuEditInp +} + +type EditRes struct{} + +// DeleteReq 删除菜单 +type DeleteReq struct { + g.Meta `path:"/menu/delete" method:"post" tags:"菜单" summary:"删除菜单"` + adminin.MenuDeleteInp +} + +type DeleteRes struct{} + +// ListReq 获取菜单列表 +type ListReq struct { + g.Meta `path:"/menu/list" method:"get" tags:"菜单" summary:"获取菜单列表"` + adminin.MenuListInp +} + +type ListRes struct { + *adminin.MenuListModel + form.PageRes +} diff --git a/server/api/admin/monitor/monitor.go b/server/api/admin/monitor/monitor.go new file mode 100644 index 0000000..d86a812 --- /dev/null +++ b/server/api/admin/monitor/monitor.go @@ -0,0 +1,106 @@ +// Package monitor +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package monitor + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "hotgo/internal/library/network/tcp" + "hotgo/internal/model/input/form" +) + +// UserOfflineReq 下线用户 +type UserOfflineReq struct { + g.Meta `path:"/monitor/userOffline" method:"post" tags:"在线用户" summary:"下线用户"` + Id string `json:"id" v:"required#SID不能为空" description:"SID"` +} + +type UserOfflineRes struct{} + +// UserOnlineListReq 获取在线用户列表 +type UserOnlineListReq struct { + g.Meta `path:"/monitor/userOnlineList" method:"get" tags:"在线用户" summary:"获取在线用户列表"` + form.PageReq + UserId int64 `json:"userId" description:"用户ID"` + Username string `json:"username" description:"用户名"` + IP string `json:"ip" description:"登录IP"` + FirstTime []*gtime.Time `json:"firstTime" description:"登录时间"` +} + +type UserOnlineListRes struct { + List []*UserOnlineModel `json:"list" description:"数据列表"` + form.PageRes +} + +type UserOnlineModel struct { + ID string `json:"id"` // 连接唯一标识 + IP string `json:"ip"` // 客户端IP + Os string `json:"os"` // 客户端系统名称 + Browser string `json:"browser"` // 浏览器 + FirstTime int64 `json:"firstTime"` // 首次连接时间 + HeartbeatTime uint64 `json:"heartbeatTime"` // 用户上次心跳时间 + App string `json:"app"` // 应用名称 + UserId int64 `json:"userId"` // 用户ID + Username string `json:"username"` // 用户名 + Avatar string `json:"avatar"` // 头像 +} + +// NetOnlineListReq 获取在线服务列表 +type NetOnlineListReq struct { + g.Meta `path:"/monitor/netOnlineList" method:"get" tags:"在线服务" summary:"获取在线服务列表"` + form.PageReq + Name string `json:"name" description:"应用名称"` + Group string `json:"group" description:"分组"` + AppId string `json:"appId" description:"APPID"` + Addr string `json:"addr" description:"登录地址"` + FirstTime []*gtime.Time `json:"firstTime" description:"登录时间"` +} + +type NetOnlineListRes struct { + List []*NetOnlineModel `json:"list" description:"数据列表"` + form.PageRes +} + +type NetOnlineModel struct { + *tcp.AuthMeta + Id int64 `json:"id" description:"连接ID"` + IsAuth bool `json:"isAuth" description:"是否认证"` + Addr string `json:"addr" description:"登录地址"` + Port string `json:"port" description:"连接端口"` + FirstTime int64 `json:"firstTime" description:"首次连接时间"` + HeartbeatTime int64 `json:"heartbeatTime" description:"上次心跳时间"` + LicenseId int64 `json:"licenseId" description:"许可ID"` + LicenseName string `json:"licenseName" description:"许可名称"` + LoginTimes int64 `json:"loginTimes" description:"许可累计登录次数"` + Online int `json:"online" description:"许可在线数量"` + OnlineLimit int `json:"onlineLimit" description:"许可在线数量限制"` + Desc string `json:"desc" description:"许可说明"` + Proto string `json:"proto" description:"网络协议"` +} + +// NetOptionReq 获取服务选项 +type NetOptionReq struct { + g.Meta `path:"/monitor/netOption" method:"get" tags:"在线服务" summary:"获取服务选项"` +} + +type NetOptionRes struct { + Routes []*RouteSelect `json:"routes" dc:"路由选项"` +} + +type RouteSelect struct { + Value interface{} `json:"value"` + Label string `json:"label"` + Disabled bool `json:"disabled"` + IsRPC bool `json:"isRPC"` +} + +// NetOfflineReq 下线服务 +type NetOfflineReq struct { + g.Meta `path:"/monitor/netOffline" method:"post" tags:"在线服务" summary:"下线服务"` + Id int64 `json:"id" v:"required#连接ID不能为空" description:"连接ID"` +} + +type NetOfflineRes struct{} diff --git a/server/api/admin/normaltreedemo/normaltreedemo.go b/server/api/admin/normaltreedemo/normaltreedemo.go new file mode 100644 index 0000000..62dff51 --- /dev/null +++ b/server/api/admin/normaltreedemo/normaltreedemo.go @@ -0,0 +1,69 @@ +// Package normaltreedemo +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.15.7 +package normaltreedemo + +import ( + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" + "hotgo/utility/tree" + + "github.com/gogf/gf/v2/frame/g" +) + +// ListReq 查询普通树表列表 +type ListReq struct { + g.Meta `path:"/normalTreeDemo/list" method:"get" tags:"普通树表" summary:"获取普通树表列表"` + sysin.NormalTreeDemoListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.NormalTreeDemoListModel `json:"list" dc:"数据列表"` +} + +// ViewReq 获取普通树表指定信息 +type ViewReq struct { + g.Meta `path:"/normalTreeDemo/view" method:"get" tags:"普通树表" summary:"获取普通树表指定信息"` + sysin.NormalTreeDemoViewInp +} + +type ViewRes struct { + *sysin.NormalTreeDemoViewModel +} + +// EditReq 修改/新增普通树表 +type EditReq struct { + g.Meta `path:"/normalTreeDemo/edit" method:"post" tags:"普通树表" summary:"修改/新增普通树表"` + sysin.NormalTreeDemoEditInp +} + +type EditRes struct{} + +// DeleteReq 删除普通树表 +type DeleteReq struct { + g.Meta `path:"/normalTreeDemo/delete" method:"post" tags:"普通树表" summary:"删除普通树表"` + sysin.NormalTreeDemoDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 获取普通树表最大排序 +type MaxSortReq struct { + g.Meta `path:"/normalTreeDemo/maxSort" method:"get" tags:"普通树表" summary:"获取普通树表最大排序"` + sysin.NormalTreeDemoMaxSortInp +} + +type MaxSortRes struct { + *sysin.NormalTreeDemoMaxSortModel +} + +// TreeOptionReq 获取普通树表关系树选项 +type TreeOptionReq struct { + g.Meta `path:"/normalTreeDemo/treeOption" method:"get" tags:"普通树表" summary:"获取普通树表关系树选项"` +} + +type TreeOptionRes []tree.Node diff --git a/server/api/admin/notice/notice.go b/server/api/admin/notice/notice.go new file mode 100644 index 0000000..75232df --- /dev/null +++ b/server/api/admin/notice/notice.go @@ -0,0 +1,128 @@ +// Package notice +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package notice + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/notice/list" method:"get" tags:"公告" summary:"获取公告列表"` + adminin.NoticeListInp +} + +type ListRes struct { + List []*adminin.NoticeListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/notice/view" method:"get" tags:"公告" summary:"获取指定信息"` + adminin.NoticeViewInp +} + +type ViewRes struct { + *adminin.NoticeViewModel +} + +// EditReq 修改/新增字典数据 +type EditReq struct { + g.Meta `path:"/notice/edit" method:"post" tags:"公告" summary:"修改/新增公告"` + adminin.NoticeEditInp +} + +type EditRes struct{} + +// DeleteReq 删除字典类型 +type DeleteReq struct { + g.Meta `path:"/notice/delete" method:"post" tags:"公告" summary:"删除公告"` + adminin.NoticeDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/notice/maxSort" method:"get" tags:"公告" summary:"公告最大排序"` + adminin.NoticeMaxSortInp +} + +type MaxSortRes struct { + *adminin.NoticeMaxSortModel +} + +// StatusReq 更新公告状态 +type StatusReq struct { + 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/admin/optiontreedemo/optiontreedemo.go b/server/api/admin/optiontreedemo/optiontreedemo.go new file mode 100644 index 0000000..70d0c63 --- /dev/null +++ b/server/api/admin/optiontreedemo/optiontreedemo.go @@ -0,0 +1,69 @@ +// Package optiontreedemo +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2025 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.17.8 +package optiontreedemo + +import ( + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" + "hotgo/utility/tree" + + "github.com/gogf/gf/v2/frame/g" +) + +// ListReq 查询选项树表列表 +type ListReq struct { + g.Meta `path:"/optionTreeDemo/list" method:"get" tags:"选项树表" summary:"获取选项树表列表"` + sysin.OptionTreeDemoListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.OptionTreeDemoListModel `json:"list" dc:"数据列表"` +} + +// ViewReq 获取选项树表指定信息 +type ViewReq struct { + g.Meta `path:"/optionTreeDemo/view" method:"get" tags:"选项树表" summary:"获取选项树表指定信息"` + sysin.OptionTreeDemoViewInp +} + +type ViewRes struct { + *sysin.OptionTreeDemoViewModel +} + +// EditReq 修改/新增选项树表 +type EditReq struct { + g.Meta `path:"/optionTreeDemo/edit" method:"post" tags:"选项树表" summary:"修改/新增选项树表"` + sysin.OptionTreeDemoEditInp +} + +type EditRes struct{} + +// DeleteReq 删除选项树表 +type DeleteReq struct { + g.Meta `path:"/optionTreeDemo/delete" method:"post" tags:"选项树表" summary:"删除选项树表"` + sysin.OptionTreeDemoDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 获取选项树表最大排序 +type MaxSortReq struct { + g.Meta `path:"/optionTreeDemo/maxSort" method:"get" tags:"选项树表" summary:"获取选项树表最大排序"` + sysin.OptionTreeDemoMaxSortInp +} + +type MaxSortRes struct { + *sysin.OptionTreeDemoMaxSortModel +} + +// TreeOptionReq 获取选项树表关系树选项 +type TreeOptionReq struct { + g.Meta `path:"/optionTreeDemo/treeOption" method:"get" tags:"选项树表" summary:"获取选项树表关系树选项"` +} + +type TreeOptionRes []tree.Node \ No newline at end of file diff --git a/server/api/admin/order/order.go b/server/api/admin/order/order.go new file mode 100644 index 0000000..425921f --- /dev/null +++ b/server/api/admin/order/order.go @@ -0,0 +1,93 @@ +// Package order +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package order + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// AcceptRefundReq 受理申请退款 +type AcceptRefundReq struct { + g.Meta `path:"/order/acceptRefund" method:"post" tags:"充值订单" summary:"受理申请退款"` + adminin.OrderAcceptRefundInp +} + +type AcceptRefundRes struct { +} + +// ApplyRefundReq 申请退款 +type ApplyRefundReq struct { + g.Meta `path:"/order/applyRefund" method:"post" tags:"充值订单" summary:"申请退款"` + adminin.OrderApplyRefundInp +} + +type ApplyRefundRes struct { +} + +// CreateReq 创建充值订单 +type CreateReq struct { + g.Meta `path:"/order/create" method:"post" tags:"充值订单" summary:"创建充值订单"` + adminin.OrderCreateInp +} + +type CreateRes struct { + *adminin.OrderCreateModel +} + +// ListReq 查询充值订单列表 +type ListReq struct { + g.Meta `path:"/order/list" method:"get" tags:"充值订单" summary:"获取充值订单列表"` + adminin.OrderListInp +} + +type ListRes struct { + form.PageRes + List []*adminin.OrderListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出充值订单列表 +type ExportReq struct { + g.Meta `path:"/order/export" method:"get" tags:"充值订单" summary:"导出充值订单列表"` + adminin.OrderListInp +} + +type ExportRes struct{} + +// ViewReq 获取充值订单指定信息 +type ViewReq struct { + g.Meta `path:"/order/view" method:"get" tags:"充值订单" summary:"获取充值订单指定信息"` + adminin.OrderViewInp +} + +type ViewRes struct { + *adminin.OrderViewModel +} + +// EditReq 修改/新增充值订单 +type EditReq struct { + g.Meta `path:"/order/edit" method:"post" tags:"充值订单" summary:"修改/新增充值订单"` + adminin.OrderEditInp +} + +type EditRes struct{} + +// DeleteReq 删除充值订单 +type DeleteReq struct { + g.Meta `path:"/order/delete" method:"post" tags:"充值订单" summary:"删除充值订单"` + adminin.OrderDeleteInp +} + +type DeleteRes struct{} + +// StatusReq 更新充值订单状态 +type StatusReq struct { + g.Meta `path:"/order/status" method:"post" tags:"充值订单" summary:"更新充值订单状态"` + adminin.OrderStatusInp +} + +type StatusRes struct{} diff --git a/server/api/admin/pay/refund.go b/server/api/admin/pay/refund.go new file mode 100644 index 0000000..dfbab3b --- /dev/null +++ b/server/api/admin/pay/refund.go @@ -0,0 +1,33 @@ +// Package pay +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.5.3 +// @AutoGenerate Date 2023-04-15 15:59:58 +package pay + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/payin" +) + +// RefundListReq 查询交易退款列表 +type RefundListReq struct { + g.Meta `path:"/payRefund/list" method:"get" tags:"交易退款" summary:"获取交易退款列表"` + payin.PayRefundListInp +} + +type RefundListRes struct { + form.PageRes + List []*payin.PayRefundListModel `json:"list" dc:"数据列表"` +} + +// RefundExportReq 导出交易退款列表 +type RefundExportReq struct { + g.Meta `path:"/payRefund/export" method:"get" tags:"交易退款" summary:"导出交易退款列表"` + payin.PayRefundListInp +} + +type RefundExportRes struct{} diff --git a/server/api/admin/post/post.go b/server/api/admin/post/post.go new file mode 100644 index 0000000..e0659a6 --- /dev/null +++ b/server/api/admin/post/post.go @@ -0,0 +1,67 @@ +// Package post +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package post + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// EditReq 修改/新增岗位 +type EditReq struct { + g.Meta `path:"/post/edit" method:"post" tags:"岗位" summary:"修改/新增岗位"` + adminin.PostEditInp +} + +type EditRes struct{} + +// DeleteReq 删除岗位 +type DeleteReq struct { + g.Meta `path:"/post/delete" method:"post" tags:"岗位" summary:"删除岗位"` + adminin.PostDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/post/maxSort" method:"get" tags:"岗位" summary:"岗位最大排序"` + adminin.PostMaxSortInp +} + +type MaxSortRes struct { + *adminin.PostMaxSortModel +} + +// ListReq 获取列表 +type ListReq struct { + g.Meta `path:"/post/list" method:"get" tags:"岗位" summary:"获取岗位列表"` + adminin.PostListInp +} + +type ListRes struct { + List []*adminin.PostListModel `json:"list" description:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/post/view" method:"get" tags:"岗位" summary:"获取指定信息"` + adminin.PostViewInp +} + +type ViewRes struct { + *adminin.PostViewModel +} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/post/status" method:"post" tags:"岗位" summary:"更新岗位状态"` + adminin.PostStatusInp +} + +type StatusRes struct{} diff --git a/server/api/admin/provinces/provinces.go b/server/api/admin/provinces/provinces.go new file mode 100644 index 0000000..d6bc9fd --- /dev/null +++ b/server/api/admin/provinces/provinces.go @@ -0,0 +1,115 @@ +// Package provinces +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package provinces + +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:"/provinces/list" method:"get" tags:"省市区" summary:"获取省市区列表"` + sysin.ProvincesListInp +} + +type ListRes struct { + List []*sysin.ProvincesListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取信息 +type ViewReq struct { + g.Meta `path:"/provinces/view" method:"get" tags:"省市区" summary:"获取指定信息"` + sysin.ProvincesViewInp +} + +type ViewRes struct { + *sysin.ProvincesViewModel +} + +// EditReq 修改/新增 +type EditReq struct { + g.Meta `path:"/provinces/edit" method:"post" tags:"省市区" summary:"修改/新增省市区"` + sysin.ProvincesEditInp +} + +type EditRes struct{} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/provinces/delete" method:"post" tags:"省市区" summary:"删除省市区"` + sysin.ProvincesDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 最大排序 +type MaxSortReq struct { + g.Meta `path:"/provinces/maxSort" method:"get" tags:"省市区" summary:"省市区最大排序"` + sysin.ProvincesMaxSortInp +} + +type MaxSortRes struct { + *sysin.ProvincesMaxSortModel +} + +// StatusReq 更新状态 +type StatusReq struct { + g.Meta `path:"/provinces/status" method:"post" tags:"省市区" summary:"更新省市区状态"` + sysin.ProvincesStatusInp +} + +type StatusRes struct{} + +// TreeReq 关系树选项列表 +type TreeReq struct { + g.Meta `path:"/provinces/tree" tags:"省市区" method:"get" summary:"省市区关系树选项列表"` +} + +type TreeRes struct { + List []*sysin.ProvincesTree `json:"list" dc:"数据列表"` +} + +// ChildrenListReq 获取省市区下级列表 +type ChildrenListReq struct { + g.Meta `path:"/provinces/childrenList" method:"get" tags:"省市区" summary:"获取省市区下级列表"` + sysin.ProvincesChildrenListInp +} + +type ChildrenListRes struct { + List []*sysin.ProvincesChildrenListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// UniqueIdReq 地区ID是否唯一 +type UniqueIdReq struct { + g.Meta `path:"/provinces/uniqueId" method:"get" tags:"省市区" summary:"地区ID是否唯一"` + sysin.ProvincesUniqueIdInp +} + +type UniqueIdRes struct { + *sysin.ProvincesUniqueIdModel +} + +// SelectReq 省市区选项 +type SelectReq struct { + g.Meta `path:"/provinces/select" method:"get" tags:"省市区" summary:"省市区选项"` + sysin.ProvincesSelectInp +} + +type SelectRes struct { + *sysin.ProvincesSelectModel +} + +// CityLabelReq 获取指定城市标签 +type CityLabelReq struct { + g.Meta `path:"/provinces/cityLabel" method:"get" tags:"省市区" summary:"获取指定城市标签" ` + sysin.ProvincesCityLabelInp +} + +type CityLabelRes sysin.ProvincesCityLabelModel diff --git a/server/api/admin/role/role.go b/server/api/admin/role/role.go new file mode 100644 index 0000000..bbae5a1 --- /dev/null +++ b/server/api/admin/role/role.go @@ -0,0 +1,82 @@ +// Package role +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package role + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/consts" + "hotgo/internal/model/input/adminin" + "hotgo/internal/model/input/form" +) + +// ListReq 查询列表 +type ListReq struct { + g.Meta `path:"/role/list" method:"get" tags:"角色" summary:"获取角色列表"` + adminin.RoleListInp +} + +type ListRes struct { + *adminin.RoleListModel + form.PageRes +} + +// DynamicReq 动态路由 +type DynamicReq struct { + g.Meta `path:"/role/dynamic" method:"get" tags:"角色" summary:"获取动态路由" description:"获取登录用户动态路由"` +} + +type DynamicRes struct { + List []*adminin.MenuRoute `json:"list" description:"数据列表"` +} + +type UpdatePermissionsReq struct { + g.Meta `path:"/role/updatePermissions" method:"post" tags:"角色" summary:"编辑角色菜单权限"` + adminin.UpdatePermissionsInp +} + +type UpdatePermissionsRes struct{} + +type GetPermissionsReq struct { + g.Meta `path:"/role/getPermissions" method:"get" tags:"角色" summary:"获取指定角色权限"` + adminin.GetPermissionsInp +} + +type GetPermissionsRes struct { + *adminin.GetPermissionsModel +} + +// EditReq 修改/新增角色 +type EditReq struct { + g.Meta `path:"/role/edit" method:"post" tags:"角色" summary:"修改/新增角色"` + adminin.RoleEditInp +} + +type EditRes struct{} + +// DeleteReq 删除角色 +type DeleteReq struct { + g.Meta `path:"/role/delete" method:"post" tags:"角色" summary:"删除角色"` + adminin.RoleDeleteInp +} + +type DeleteRes struct{} + +// DataScopeSelectReq 获取数据权限选项 +type DataScopeSelectReq struct { + g.Meta `path:"/role/dataScope/select" method:"get" tags:"角色" summary:"获取数据权限选项"` +} + +type DataScopeSelectRes struct { + List []consts.GroupScopeSelect `json:"list" dc:"数据选项"` +} + +// DataScopeEditReq 修改指定角色的数据权限 +type DataScopeEditReq struct { + g.Meta `path:"/role/dataScope/edit" method:"post" tags:"角色" summary:"修改指定角色的数据权限"` + adminin.DataScopeEditInp +} + +type DataScopeEditRes struct{} diff --git a/server/api/admin/servelicense/servelicense.go b/server/api/admin/servelicense/servelicense.go new file mode 100644 index 0000000..78c7f20 --- /dev/null +++ b/server/api/admin/servelicense/servelicense.go @@ -0,0 +1,74 @@ +// Package servelicense +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.7.6 +package servelicense + +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:"/serveLicense/list" method:"get" tags:"服务许可证" summary:"获取服务许可证列表"` + sysin.ServeLicenseListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.ServeLicenseListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出服务许可证列表 +type ExportReq struct { + g.Meta `path:"/serveLicense/export" method:"get" tags:"服务许可证" summary:"导出服务许可证列表"` + sysin.ServeLicenseListInp +} + +type ExportRes struct{} + +// ViewReq 获取服务许可证指定信息 +type ViewReq struct { + g.Meta `path:"/serveLicense/view" method:"get" tags:"服务许可证" summary:"获取服务许可证指定信息"` + sysin.ServeLicenseViewInp +} + +type ViewRes struct { + *sysin.ServeLicenseViewModel +} + +// EditReq 修改/新增服务许可证 +type EditReq struct { + g.Meta `path:"/serveLicense/edit" method:"post" tags:"服务许可证" summary:"修改/新增服务许可证"` + sysin.ServeLicenseEditInp +} + +type EditRes struct{} + +// DeleteReq 删除服务许可证 +type DeleteReq struct { + g.Meta `path:"/serveLicense/delete" method:"post" tags:"服务许可证" summary:"删除服务许可证"` + sysin.ServeLicenseDeleteInp +} + +type DeleteRes struct{} + +// StatusReq 更新服务许可证状态 +type StatusReq struct { + g.Meta `path:"/serveLicense/status" method:"post" tags:"服务许可证" summary:"更新服务许可证状态"` + sysin.ServeLicenseStatusInp +} + +type StatusRes struct{} + +// AssignRouterReq 分配服务许可证路由 +type AssignRouterReq struct { + g.Meta `path:"/serveLicense/assignRouter" method:"post" tags:"服务许可证" summary:"分配服务许可证路由"` + sysin.ServeLicenseAssignRouterInp +} + +type AssignRouterRes struct{} diff --git a/server/api/admin/servelog/servelog.go b/server/api/admin/servelog/servelog.go new file mode 100644 index 0000000..d250cd1 --- /dev/null +++ b/server/api/admin/servelog/servelog.go @@ -0,0 +1,49 @@ +// Package servelog +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package servelog + +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:"/serveLog/list" method:"get" tags:"服务日志" summary:"获取服务日志列表"` + sysin.ServeLogListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.ServeLogListModel `json:"list" dc:"数据列表"` +} + +// ExportReq 导出服务日志列表 +type ExportReq struct { + g.Meta `path:"/serveLog/export" method:"get" tags:"服务日志" summary:"导出服务日志列表"` + sysin.ServeLogListInp +} + +type ExportRes struct{} + +// ViewReq 获取服务日志指定信息 +type ViewReq struct { + g.Meta `path:"/serveLog/view" method:"get" tags:"服务日志" summary:"获取服务日志指定信息"` + sysin.ServeLogViewInp +} + +type ViewRes struct { + *sysin.ServeLogViewModel +} + +// DeleteReq 删除服务日志 +type DeleteReq struct { + g.Meta `path:"/serveLog/delete" method:"post" tags:"服务日志" summary:"删除服务日志"` + sysin.ServeLogDeleteInp +} + +type DeleteRes struct{} diff --git a/server/api/admin/smslog/smslog.go b/server/api/admin/smslog/smslog.go new file mode 100644 index 0000000..ed97c2d --- /dev/null +++ b/server/api/admin/smslog/smslog.go @@ -0,0 +1,41 @@ +// Package smslog +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package smslog + +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:"/smsLog/list" method:"get" tags:"短信" summary:"获取短信记录列表"` + sysin.SmsLogListInp +} + +type ListRes struct { + List []*sysin.SmsLogListModel `json:"list" dc:"数据列表"` + form.PageRes +} + +// ViewReq 获取指定信息 +type ViewReq struct { + g.Meta `path:"/smsLog/view" method:"get" tags:"短信" summary:"获取指定短信信息"` + sysin.SmsLogViewInp +} + +type ViewRes struct { + *sysin.SmsLogViewModel +} + +// DeleteReq 删除 +type DeleteReq struct { + g.Meta `path:"/smsLog/delete" method:"post" tags:"短信" summary:"删除短信记录"` + sysin.SmsLogDeleteInp +} + +type DeleteRes struct{} diff --git a/server/api/admin/testcategory/testcategory.go b/server/api/admin/testcategory/testcategory.go new file mode 100644 index 0000000..7a8eca3 --- /dev/null +++ b/server/api/admin/testcategory/testcategory.go @@ -0,0 +1,69 @@ +// Package testcategory +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.15.7 +package testcategory + +import ( + "hotgo/internal/model/input/form" + "hotgo/internal/model/input/sysin" + + "github.com/gogf/gf/v2/frame/g" +) + +// ListReq 查询测试分类列表 +type ListReq struct { + g.Meta `path:"/testCategory/list" method:"get" tags:"测试分类" summary:"获取测试分类列表"` + sysin.TestCategoryListInp +} + +type ListRes struct { + form.PageRes + List []*sysin.TestCategoryListModel `json:"list" dc:"数据列表"` +} + +// ViewReq 获取测试分类指定信息 +type ViewReq struct { + g.Meta `path:"/testCategory/view" method:"get" tags:"测试分类" summary:"获取测试分类指定信息"` + sysin.TestCategoryViewInp +} + +type ViewRes struct { + *sysin.TestCategoryViewModel +} + +// EditReq 修改/新增测试分类 +type EditReq struct { + g.Meta `path:"/testCategory/edit" method:"post" tags:"测试分类" summary:"修改/新增测试分类"` + sysin.TestCategoryEditInp +} + +type EditRes struct{} + +// DeleteReq 删除测试分类 +type DeleteReq struct { + g.Meta `path:"/testCategory/delete" method:"post" tags:"测试分类" summary:"删除测试分类"` + sysin.TestCategoryDeleteInp +} + +type DeleteRes struct{} + +// MaxSortReq 获取测试分类最大排序 +type MaxSortReq struct { + g.Meta `path:"/testCategory/maxSort" method:"get" tags:"测试分类" summary:"获取测试分类最大排序"` + sysin.TestCategoryMaxSortInp +} + +type MaxSortRes struct { + *sysin.TestCategoryMaxSortModel +} + +// StatusReq 更新测试分类状态 +type StatusReq struct { + g.Meta `path:"/testCategory/status" method:"post" tags:"测试分类" summary:"更新测试分类状态"` + sysin.TestCategoryStatusInp +} + +type StatusRes struct{} diff --git a/server/api/api/member/member.go b/server/api/api/member/member.go new file mode 100644 index 0000000..d335001 --- /dev/null +++ b/server/api/api/member/member.go @@ -0,0 +1,15 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package member + +import ( + "context" + + "hotgo/api/api/member/v1" +) + +type IMemberV1 interface { + GetIdByCode(ctx context.Context, req *v1.GetIdByCodeReq) (res *v1.GetIdByCodeRes, err error) +} diff --git a/server/api/api/member/v1/member.go b/server/api/api/member/v1/member.go new file mode 100644 index 0000000..0ed4bb6 --- /dev/null +++ b/server/api/api/member/v1/member.go @@ -0,0 +1,16 @@ +// Package member +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package v1 + +import "github.com/gogf/gf/v2/frame/g" + +// GetIdByCodeReq 通过邀请码获取用户ID +type GetIdByCodeReq struct { + g.Meta `path:"/member/getIdByCode" method:"post" tags:"用户" summary:"通过邀请码获取用户ID"` + Code string `json:"code" dc:"邀请码"` +} + +type GetIdByCodeRes struct{} diff --git a/server/api/api/pay/pay.go b/server/api/api/pay/pay.go new file mode 100644 index 0000000..654099c --- /dev/null +++ b/server/api/api/pay/pay.go @@ -0,0 +1,17 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package pay + +import ( + "context" + + "hotgo/api/api/pay/v1" +) + +type IPayV1 interface { + NotifyAliPay(ctx context.Context, req *v1.NotifyAliPayReq) (res *v1.NotifyAliPayRes, err error) + NotifyWxPay(ctx context.Context, req *v1.NotifyWxPayReq) (res *v1.NotifyWxPayRes, err error) + NotifyQQPay(ctx context.Context, req *v1.NotifyQQPayReq) (res *v1.NotifyQQPayRes, err error) +} diff --git a/server/api/api/pay/v1/notify.go b/server/api/api/pay/v1/notify.go new file mode 100644 index 0000000..8ac343b --- /dev/null +++ b/server/api/api/pay/v1/notify.go @@ -0,0 +1,41 @@ +// Package pay +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package v1 + +import ( + "hotgo/internal/model/input/payin" + + "github.com/gogf/gf/v2/frame/g" +) + +// NotifyAliPayReq 支付宝回调 +type NotifyAliPayReq struct { + g.Meta `path:"/pay/notify/alipay" method:"post" tags:"支付异步通知" summary:"支付宝回调"` +} + +type NotifyAliPayRes struct { + g.Meta `mime:"text/html" type:"string" example:"
"` + *payin.PayNotifyModel +} + +// NotifyWxPayReq 微信支付回调 +type NotifyWxPayReq struct { + g.Meta `path:"/pay/notify/wxpay" method:"post" tags:"支付异步通知" summary:"微信支付回调"` +} + +type NotifyWxPayRes struct { + *payin.PayNotifyModel +} + +// NotifyQQPayReq QQ支付回调 +type NotifyQQPayReq struct { + g.Meta `path:"/pay/notify/qqpay" method:"post" tags:"支付异步通知" summary:"QQ支付回调"` +} + +type NotifyQQPayRes struct { + g.Meta `mime:"text/xml" type:"string"` + *payin.PayNotifyModel +} diff --git a/server/api/home/base/site.go b/server/api/home/base/site.go new file mode 100644 index 0000000..d70f5ba --- /dev/null +++ b/server/api/home/base/site.go @@ -0,0 +1,16 @@ +// Package base +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package base + +import "github.com/gogf/gf/v2/frame/g" + +type SiteIndexReq struct { + g.Meta `path:"/" method:"get" summary:"首页" tags:"首页"` +} + +type SiteIndexRes struct { + g.Meta `mime:"text/html" type:"string" example:"
"` +} diff --git a/server/api/servmsg/auth.go b/server/api/servmsg/auth.go new file mode 100644 index 0000000..e071144 --- /dev/null +++ b/server/api/servmsg/auth.go @@ -0,0 +1,21 @@ +// Package servmsg +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package servmsg + +import ( + "hotgo/internal/library/network/tcp" + "hotgo/internal/model/input/servmsgin" +) + +// AuthSummaryReq 授权信息 +type AuthSummaryReq struct { +} + +// AuthSummaryRes 响应授权信息 +type AuthSummaryRes struct { + tcp.ServerRes + Data *servmsgin.AuthSummaryModel `json:"data,omitempty" description:"数据集"` +} diff --git a/server/api/servmsg/cron.go b/server/api/servmsg/cron.go new file mode 100644 index 0000000..ab3eafa --- /dev/null +++ b/server/api/servmsg/cron.go @@ -0,0 +1,57 @@ +// Package servmsg +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package servmsg + +import ( + "hotgo/internal/library/network/tcp" + "hotgo/internal/model/input/sysin" +) + +// CronDeleteReq 删除任务 +type CronDeleteReq struct { + *sysin.CronDeleteInp +} + +type CronDeleteRes struct { + tcp.ServerRes +} + +// CronEditReq 编辑任务 +type CronEditReq struct { + *sysin.CronEditInp +} + +type CronEditRes struct { + tcp.ServerRes +} + +// CronStatusReq 修改任务状态 +type CronStatusReq struct { + *sysin.CronStatusInp +} + +type CronStatusRes struct { + tcp.ServerRes +} + +// CronOnlineExecReq 在线执行 +type CronOnlineExecReq struct { + *sysin.OnlineExecInp +} + +type CronOnlineExecRes struct { + tcp.ServerRes +} + +// CronDispatchLogReq 调度日志 +type CronDispatchLogReq struct { + *sysin.DispatchLogInp +} + +type CronDispatchLogRes struct { + tcp.ServerRes + *sysin.DispatchLogModel +} diff --git a/server/api/servmsg/example.go b/server/api/servmsg/example.go new file mode 100644 index 0000000..c469ebf --- /dev/null +++ b/server/api/servmsg/example.go @@ -0,0 +1,33 @@ +// Package servmsg +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package servmsg + +import ( + "hotgo/internal/library/network/tcp" + "hotgo/internal/model/input/servmsgin" +) + +// 一些例子. + +// ExampleHelloReq 一个tcp请求例子 +type ExampleHelloReq struct { + Name string `json:"name" description:"名字"` +} + +type ExampleHelloRes struct { + tcp.ServerRes + Data *servmsgin.ExampleHelloModel `json:"data,omitempty" description:"数据集"` +} + +// ExampleRPCHelloReq 一个rpc请求例子 +type ExampleRPCHelloReq struct { + Name string `json:"name" description:"名字"` +} + +type ExampleRPCHelloRes struct { + tcp.ServerRes + Data *servmsgin.ExampleHelloModel `json:"data,omitempty" description:"数据集"` +} diff --git a/server/api/websocket/base/send.go b/server/api/websocket/base/send.go new file mode 100644 index 0000000..b67d70b --- /dev/null +++ b/server/api/websocket/base/send.go @@ -0,0 +1,20 @@ +// Package base +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package base + +import ( + "github.com/gogf/gf/v2/frame/g" + "hotgo/internal/model/input/websocketin" +) + +// SendToTagReq 发送标签消息 +type SendToTagReq struct { + g.Meta `path:"/send/toTag" method:"post" tags:"WebSocket" summary:"发送标签消息"` + websocketin.SendToTagInp +} + +type SendToTagRes struct { +} diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..25bab3f --- /dev/null +++ b/server/go.mod @@ -0,0 +1,162 @@ +module hotgo + +go 1.24.4 + +require ( + github.com/IBM/sarama v1.45.2 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7 + github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 + github.com/alibabacloud-go/tea v1.3.9 + github.com/alibabacloud-go/tea-utils/v2 v2.0.7 + github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible + github.com/apache/rocketmq-client-go/v2 v2.1.2 + github.com/casbin/casbin/v2 v2.108.0 + github.com/forgoer/openssl v1.6.1 + github.com/go-pay/crypto v0.0.1 + github.com/go-pay/gopay v1.5.114 + github.com/go-pay/smap v0.0.2 + github.com/gogf/gf/contrib/drivers/mysql/v2 v2.10.0 + github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.0 + github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4 + github.com/gogf/gf/v2 v2.10.0 + github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f + github.com/golang-jwt/jwt/v5 v5.2.2 + github.com/gorilla/websocket v1.5.3 + github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 + github.com/minio/minio-go/v7 v7.0.94 + github.com/mojocn/base64Captcha v1.3.8 + github.com/olekukonko/tablewriter v1.1.0 + github.com/qiniu/go-sdk/v7 v7.25.4 + github.com/schollz/progressbar/v3 v3.18.0 + github.com/shirou/gopsutil/v3 v3.24.5 + github.com/silenceper/wechat/v2 v2.1.9 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1202 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1200 + github.com/tencentyun/cos-go-sdk-v5 v0.7.66 + github.com/ufilesdk-dev/ufile-gosdk v1.0.6 + github.com/xuri/excelize/v2 v2.9.1 + go.opentelemetry.io/otel v1.38.0 + golang.org/x/mod v0.26.0 + golang.org/x/net v0.43.0 + golang.org/x/tools v0.35.0 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + aead.dev/minisign v0.2.0 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect + github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect + github.com/alibabacloud-go/debug v1.0.1 // indirect + github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect + github.com/alibabacloud-go/openapi-util v0.1.0 // indirect + github.com/alibabacloud-go/tea-utils v1.3.1 // indirect + github.com/aliyun/credentials-go v1.4.5 // indirect + github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect + github.com/casbin/govaluate v1.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/clbanning/mxj v1.8.4 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.7.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/emirpasic/gods/v2 v2.0.0-alpha // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/gammazero/toposort v0.1.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-pay/errgroup v0.0.3 // indirect + github.com/go-pay/util v0.0.4 // indirect + github.com/go-pay/xlog v0.0.3 // indirect + github.com/go-pay/xtime v0.0.2 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/mock v1.4.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/go-querystring v1.0.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/minio/crc64nvme v1.0.1 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mozillazg/go-httpheader v0.2.1 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/errors v0.8.1 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/redis/go-redis/v9 v9.12.1 // indirect + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rs/xid v1.6.0 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/tidwall/gjson v1.14.1 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tiendc/go-deepcopy v1.6.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tjfoc/gmsm v1.4.1 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/xuri/efp v0.0.1 // indirect + github.com/xuri/nfp v0.0.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/jaeger v1.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.uber.org/atomic v1.5.1 // indirect + golang.org/x/crypto v0.41.0 // indirect + golang.org/x/image v0.25.0 // indirect + golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect + golang.org/x/time v0.12.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + modernc.org/fileutil v1.0.0 // indirect + stathat.com/c/consistent v1.0.0 // indirect +) diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..ce59b74 --- /dev/null +++ b/server/go.sum @@ -0,0 +1,700 @@ +aead.dev/minisign v0.2.0 h1:kAWrq/hBRu4AARY6AlciO83xhNnW9UaC8YipS2uhLPk= +aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/IBM/sarama v1.45.2 h1:8m8LcMCu3REcwpa7fCP6v2fuPuzVwXDAM2DOv3CBrKw= +github.com/IBM/sarama v1.45.2/go.mod h1:ppaoTcVdGv186/z6MEKsMm70A5fwJfRTpstI37kVn3Y= +github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= +github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4= +github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g= +github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= +github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= +github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= +github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8= +github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc= +github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7 h1:ASXSBga98QrGMxbIThCD6jAti09gedLfvry6yJtsoBE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7/go.mod h1:TBpgqm3XofZz2LCYjZhektGPU7ArEgascyzbm4SjFo4= +github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= +github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= +github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= +github.com/alibabacloud-go/darabonba-string v1.0.2/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA= +github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= +github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= +github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 h1:UTl97mt2qfavxveqCkaVg4tKaZUPzA9RKbFIRaIdtdg= +github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6/go.mod h1:UWpcGrWwTbES9QW7OQ7xDffukMJ/l7lzioixIz8+lgY= +github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= +github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= +github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= +github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= +github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= +github.com/alibabacloud-go/tea v1.3.8/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.3.9 h1:bjgt1bvdY780vz/17iWNNtbXl4A77HWntWMeaUF3So0= +github.com/alibabacloud-go/tea v1.3.9/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= +github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= +github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.3/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ= +github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.7 h1:WDx5qW3Xa5ZgJ1c8NfqJkF6w+AU5wB8835UdhPr6Ax0= +github.com/alibabacloud-go/tea-utils/v2 v2.0.7/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= +github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis/v2 v2.30.0 h1:uA3uhDbCxfO9+DI/DuGeAMr9qI+noVWwGPNTFuKID5M= +github.com/alicebob/miniredis/v2 v2.30.0/go.mod h1:84TWKZlxYkfgMucPBf5SOQBYJceZeQRFIaQgNMiCX6Q= +github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g= +github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= +github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0= +github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM= +github.com/aliyun/credentials-go v1.4.5 h1:O76WYKgdy1oQYYiJkERjlA2dxGuvLRrzuO2ScrtGWSk= +github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/apache/rocketmq-client-go/v2 v2.1.2 h1:yt73olKe5N6894Dbm+ojRf/JPiP0cxfDNNffKwhpJVg= +github.com/apache/rocketmq-client-go/v2 v2.1.2/go.mod h1:6I6vgxHR3hzrvn+6n/4mrhS+UTulzK/X9LB2Vk1U5gE= +github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= +github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/casbin/casbin/v2 v2.108.0 h1:aMc3I81wfLpQe/uzMdElB1OBhEmPZoWMPb2nfEaKygY= +github.com/casbin/casbin/v2 v2.108.0/go.mod h1:Ee33aqGrmES+GNL17L0h9X28wXuo829wnNUnS0edAco= +github.com/casbin/govaluate v1.3.0 h1:VA0eSY0M2lA86dYd5kPPuNZMUD9QkWnOCnavGrw9myc= +github.com/casbin/govaluate v1.3.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= +github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= +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 v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/emirpasic/gods/v2 v2.0.0-alpha h1:dwFlh8pBg1VMOXWGipNMRt8v96dKAIvBehtCt6OtunU= +github.com/emirpasic/gods/v2 v2.0.0-alpha/go.mod h1:W0y4M2dtBB9U5z3YlghmpuUhiaZT2h6yoeE+C1sCp6A= +github.com/envoyproxy/go-control-plane v0.9.0/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.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/forgoer/openssl v1.6.1 h1:pBfyCd0p5Htd0CzKhtZ5kPLzRk9XeMdRVnC27AIRKmM= +github.com/forgoer/openssl v1.6.1/go.mod h1:9DZ4yOsQmveP0aXC/BpQ++Y5TKaz5yR9+emcxmIZNZs= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +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.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg= +github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-pay/crypto v0.0.1 h1:B6InT8CLfSLc6nGRVx9VMJRBBazFMjr293+jl0lLXUY= +github.com/go-pay/crypto v0.0.1/go.mod h1:41oEIvHMKbNcYlWUlRWtsnC6+ASgh7u29z0gJXe5bes= +github.com/go-pay/errgroup v0.0.3 h1:DB4s8e8oWYDyETKQ1y1riMJ7y29zE1uIsMCSjEOFSbU= +github.com/go-pay/errgroup v0.0.3/go.mod h1:0+4b8mvFMS71MIzsaC+gVvB4x37I93lRb2dqrwuU8x8= +github.com/go-pay/gopay v1.5.114 h1:jNYpcylr7WJev6i/MBeer0Z58E0x5NyqG4FfZrar3pQ= +github.com/go-pay/gopay v1.5.114/go.mod h1:p48xvWeepPolZuakAjCeucWynWwW7msoXsqahcoJpKE= +github.com/go-pay/smap v0.0.2 h1:kKflYor5T5FgZltPFBMTFfjJvqYMHr5VnIFSEyhVTcA= +github.com/go-pay/smap v0.0.2/go.mod h1:HW9oAo0okuyDYsbpbj5fJFxnNj/BZorRGFw26SxrNWw= +github.com/go-pay/util v0.0.4 h1:TuwSU9o3Qd7m9v1PbzFuIA/8uO9FJnA6P7neG/NwPyk= +github.com/go-pay/util v0.0.4/go.mod h1:Tsdhs8Ib9J9b4+NKNO1PHh5hWHhlg98PthsX0ckq6PM= +github.com/go-pay/xlog v0.0.3 h1:avyMhCL/JgBHreoGx/am/kHxfs1udDOAeVqbmzP/Yes= +github.com/go-pay/xlog v0.0.3/go.mod h1:mH47xbobrdsSHWsmFtSF5agWbMHFP+tK0ZbVCk5OAEw= +github.com/go-pay/xtime v0.0.2 h1:7YR4/iuELsEHpJ6LUO0SVK80hQxDO9MLCfuVYIiTCRM= +github.com/go-pay/xtime v0.0.2/go.mod h1:W1yRbJaSt4CSBcdAtLBQ8xajiN/Pl5hquGczUcUE9xE= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.10.0 h1:UvqxwinkelKxwdwnKUfdy51/ls4RL7MCeJqAZOVAy0I= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.10.0/go.mod h1:6v7oGBF9wv59WERJIOJxXmLhkUcxwON3tPYW3AZ7wbY= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0 h1:39+jbTenm7KBj4hO2C8ANAxVHpX/7OuRDs1VcGC9ylA= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0/go.mod h1:B0s0fVzn0W220E8UTpSGzrrGKsop5KcB90twBeLCiz0= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.0 h1:N/F9CuDdUZLoM1nVRqrDE/33pDZuhVxpNY4wYdeIaBs= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.0/go.mod h1:x6uoJGfZOtirIRQls8xUlYzC6f7T/eULPUa9er368X0= +github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4 h1:JnUjXb7C9vmwcZFwXqnxi9H4/I0rir9LmRryIX7xNds= +github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4/go.mod h1:A3NhV8u45twLq5VdqObhYNhT4szLFLCROw4LzHM+lYg= +github.com/gogf/gf/v2 v2.10.0 h1:rzDROlyqGMe/eM6dCalSR8dZOuMIdLhmxKSH1DGhbFs= +github.com/gogf/gf/v2 v2.10.0/go.mod h1:Svl1N+E8G/QshU2DUbh/3J/AJauqCgUnxHurXWR4Qx0= +github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f h1:7xfXR/BhG3JDqO1s45n65Oyx9t4E/UqDOXep6jXdLCM= +github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f/go.mod h1:HnYoio6S7VaFJdryKcD/r9HgX+4QzYfr00XiXUo/xz0= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/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.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= +github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 h1:dWJxw+KQOMeVcoyxqG9I5fppPld1hh1FG8ngv0fKNsQ= +github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794/go.mod h1:IwrOeG3O3K9vVXmcVvc9T0XLabw67QePi5pKQt5U+Kw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY= +github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.94 h1:1ZoksIKPyaSt64AVOyaQvhDOgVC3MfZsWM6mZXRUGtM= +github.com/minio/minio-go/v7 v7.0.94/go.mod h1:71t2CqDt3ThzESgZUlU1rBN54mksGGlkLcFgguDnnAc= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg= +github.com/mojocn/base64Captcha v1.3.8/go.mod h1:QFZy927L8HVP3+VV5z2b1EAEiv1KxVJKZbAucVgLUy4= +github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ= +github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= +github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY= +github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk= +github.com/qiniu/go-sdk/v7 v7.25.4 h1:ulCKlTEyrZzmNytXweOrnva49+Q4+ASjYBCSXhkRWTo= +github.com/qiniu/go-sdk/v7 v7.25.4/go.mod h1:dmKtJ2ahhPWFVi9o1D5GemmWoh/ctuB9peqTowyTO8o= +github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.12.1 h1:k5iquqv27aBtnTm2tIkROUDp8JBXhXZIVu1InSgvovg= +github.com/redis/go-redis/v9 v9.12.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= +github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQmCN62HpA= +github.com/schollz/progressbar/v3 v3.18.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/silenceper/wechat/v2 v2.1.9 h1:wc092gUkGbbBRTdzPxROhQhOH5iE98stnfzKA73mnTo= +github.com/silenceper/wechat/v2 v2.1.9/go.mod h1:7Iu3EhQYVtDUJAj+ZVRy8yom75ga7aDWv8RurLkVm0s= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +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 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +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/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/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1200/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1202 h1:3QTQZXLLGLALyHNHs6WAsFCWvElMEXfOdaFM01/3Zjo= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1202/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1200 h1:bu2Jqn/rc5CQslIgTCyG4CTqMpkz2luIOq7dzuLp4G8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1200/go.mod h1:JzzUsHoueCXnMEYcgorKxyfR0OZAI416XKgHEpgyO7o= +github.com/tencentyun/cos-go-sdk-v5 v0.7.66 h1:O4O6EsozBoDjxWbltr3iULgkI7WPj/BFNlYTXDuE64E= +github.com/tencentyun/cos-go-sdk-v5 v0.7.66/go.mod h1:8+hG+mQMuRP/OIS9d83syAvXvrMj9HhkND6Q1fLghw0= +github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo= +github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= +github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= +github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/ufilesdk-dev/ufile-gosdk v1.0.6 h1:YhTZfA0U5zjKUe6qYrIs72jjxSZryTMbS9wE76fIxMs= +github.com/ufilesdk-dev/ufile-gosdk v1.0.6/go.mod h1:s1LIpscsgVNx0JRNbDElNNQhyNXJiumVpzvPzVNS/XI= +github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= +github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw= +github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s= +github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q= +github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= +github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q= +go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +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-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= +golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= +golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= +gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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/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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +modernc.org/fileutil v1.0.0 h1:Z1AFLZwl6BO8A5NldQg/xTSjGLetp+1Ubvl4alfGx8w= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= +stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= diff --git a/server/hack/config.yaml b/server/hack/config.yaml new file mode 100644 index 0000000..f779bf5 --- /dev/null +++ b/server/hack/config.yaml @@ -0,0 +1,48 @@ +# CLI tool, only in development environment. +# https://goframe.org/pages/viewpage.action?pageId=3673173 +gfcli: + build: + name: "hotgo" # 编译后的可执行文件名称 + arch: "amd64" # 不填默认当前系统架构,可选:386,amd64,arm,all + system: "linux" # 不填默认当前系统平台,可选:linux,darwin,windows,all + mod: "none" + cgo: 0 + packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署 + packDst: "internal/packed/packed.go" # 打包后生成的Go文件路径,一般使用相对路径指定到本项目目录中 + version: "" + output: "./temp/hotgo" # 可执行文件生成路径 + extra: "" + + + docker: + build: "-a amd64 -s linux -p temp -ew" # 构建参数 + tagPrefixes: # 该docker的标记前缀,用于docker推送,请替换成你自己的 + - ccr.ccs.tencentyun.com/bufanyun + + + gen: + dao: + - link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true&charset=utf8mb4" +# - link: "pgsql:postgres:hg123456@tcp(127.0.0.1:5432)/hotgo" + group: "default" # 分组 使用hotgo代码生成功能时必须填 + # tables: "" # 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。 + tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。 + removePrefix: "hg_" + descriptionTag: true + noModelComment: true + jsonCase: "CamelLower" + gJsonSupport: true + clear: false + + +# service: # 生成业务配置 +# srcFolder: "internal/logic" +# dstFolder: "internal/service" +# dstFileNameCase: "CamelLower" +# clear: true + ctrl: + # api/api下的接口可以使用gf gen ctrl自动生成控制器相关代码 + srcFolder: "api/api" + dstFolder: "internal/controller/api" + clear: true + merge: false diff --git a/server/internal/cmd/auth.go b/server/internal/cmd/auth.go new file mode 100644 index 0000000..dc3e045 --- /dev/null +++ b/server/internal/cmd/auth.go @@ -0,0 +1,35 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gcmd" + "hotgo/internal/service" +) + +var ( + Auth = &gcmd.Command{ + Name: "auth", + Brief: "系统授权,当为第三方客户开发应用项目不想将源码和可执行文件让其随意使用时,可以通过授权的方式约束使用方。", + Description: `目前已实现,一对一、一对多、有效期授权,具体使用可以参考现有逻辑结合实际场景进行改造`, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + service.AuthClient().Start(ctx) + + serverWg.Add(1) + + // 信号监听 + signalListen(ctx, signalHandlerForOverall) + + <-serverCloseSignal + service.AuthClient().Stop(ctx) + g.Log().Debug(ctx, "auth successfully closed ..") + serverWg.Done() + return + }, + } +) diff --git a/server/internal/cmd/cmd.go b/server/internal/cmd/cmd.go new file mode 100644 index 0000000..154016c --- /dev/null +++ b/server/internal/cmd/cmd.go @@ -0,0 +1,86 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gcmd" + "hotgo/utility/simple" +) + +var ( + Main = &gcmd.Command{ + Description: `默认启动所有服务`, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + return All.Func(ctx, parser) + }, + } + + Help = &gcmd.Command{ + Name: "help", + Brief: "查看帮助", + Description: ` + 命令提示符 + --------------------------------------------------------------------------------- + 启动服务 + >> 所有服务 [go run main.go] 热编译 [gf run main.go] + >> HTTP服务 [go run main.go http] + >> 消息队列 [go run main.go queue] + >> 定时任务 [go run main.go cron] + >> 查看帮助 [go run main.go help] + + --------------------------------------------------------------------------------- + 工具 + >> 释放casbin权限,用于清理无效的权限设置 [go run main.go tools -m=casbin -a1=refresh] + >> 打印所有打包的资源文件列表 [go run main.go tools -m=gres -a1=dump] + >> 打印指定打包的资源文件内容 [go run main.go tools -m=gres -a1=content -a2=resource/template/home/index.html] + --------------------------------------------------------------------------------- + 升级更新 + >> 修复菜单关系树 [go run main.go up -m=fix -a1=menuTree] + --------------------------------------------------------------------------------- + 更多 + github地址:https://github.com/bufanyun/hotgo + 文档地址:https://github.com/bufanyun/hotgo/tree/v2.0/docs/guide-zh-CN + HotGo框架交流1群:190966648 + `, + } + + All = &gcmd.Command{ + Name: "all", + Brief: "start all server", + Description: "this is the command entry for starting all server", + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + g.Log().Debug(ctx, "starting all server") + + // 需要启动的服务 + var allServers = []*gcmd.Command{Http, Queue, Cron} + + for _, server := range allServers { + var cmd = server + simple.SafeGo(ctx, func(ctx context.Context) { + if err := cmd.Func(ctx, parser); err != nil { + g.Log().Fatalf(ctx, "%v start fail:%v", cmd.Name, err) + } + }) + } + + // 信号监听 + signalListen(ctx, signalHandlerForOverall) + + <-serverCloseSignal + serverWg.Wait() + g.Log().Debug(ctx, "all service successfully closed ..") + return + }, + } +) + +func init() { + if err := Main.AddCommand(All, Http, Queue, Cron, Auth, Tools, Up, Help); err != nil { + panic(err) + } +} diff --git a/server/internal/cmd/cron.go b/server/internal/cmd/cron.go new file mode 100644 index 0000000..0b2fd49 --- /dev/null +++ b/server/internal/cmd/cron.go @@ -0,0 +1,45 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/os/gcmd" + _ "hotgo/internal/crons" + "hotgo/internal/global" + "hotgo/internal/library/cron" + "hotgo/internal/service" +) + +var ( + Cron = &gcmd.Command{ + Name: "cron", + Brief: "定时任务,用来部署一些可独立运行的定时任务,通过tcp方式和后台保持长连接通讯,动态调整任务属性。", + Description: ``, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + // 服务日志处理 + cron.Logger().SetHandlers(global.LoggingServeLogHandler) + + // 启动定时任务 + service.SysCron().StartCron(ctx) + + // tcp客户端 + service.CronClient().Start(ctx) + + serverWg.Add(1) + + // 信号监听 + signalListen(ctx, signalHandlerForOverall) + + <-serverCloseSignal + service.CronClient().Stop(ctx) + cron.StopALL() + cron.Logger().Debug(ctx, "cron successfully closed ..") + serverWg.Done() + return + }, + } +) diff --git a/server/internal/cmd/handler_shutdown.go b/server/internal/cmd/handler_shutdown.go new file mode 100644 index 0000000..61a51ba --- /dev/null +++ b/server/internal/cmd/handler_shutdown.go @@ -0,0 +1,44 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/gproc" + "hotgo/internal/consts" + "hotgo/utility/simple" + "os" + "sync" +) + +var ( + serverCloseSignal = make(chan struct{}, 1) + serverWg = sync.WaitGroup{} + once sync.Once +) + +// signalHandlerForOverall 关闭信号处理 +func signalHandlerForOverall(sig os.Signal) { + serverCloseEvent(gctx.GetInitCtx()) + serverCloseSignal <- struct{}{} +} + +// signalListen 信号监听 +func signalListen(ctx context.Context, handler ...gproc.SigHandler) { + simple.SafeGo(ctx, func(ctx context.Context) { + gproc.AddSigHandlerShutdown(handler...) + gproc.Listen() + }) +} + +// serverCloseEvent 关闭事件 +// 区别于服务收到退出信号后的处理,只会执行一次 +func serverCloseEvent(ctx context.Context) { + once.Do(func() { + simple.Event().Call(consts.EventServerClose, ctx) + }) +} diff --git a/server/internal/cmd/http.go b/server/internal/cmd/http.go new file mode 100644 index 0000000..7a4cb3e --- /dev/null +++ b/server/internal/cmd/http.go @@ -0,0 +1,106 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gcmd" + "github.com/gogf/gf/v2/util/gmode" + "hotgo/internal/library/addons" + "hotgo/internal/library/casbin" + "hotgo/internal/library/hggen" + "hotgo/internal/router" + "hotgo/internal/service" + "hotgo/internal/websocket" +) + +var ( + Http = &gcmd.Command{ + Name: "http", + Usage: "http", + Brief: "HTTP服务,也可以称为主服务,包含http、websocket、tcpserver多个可对外服务", + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + // 初始化http服务 + s := g.Server() + + // 初始化请求前回调 + s.BindHookHandler("/*any", ghttp.HookBeforeServe, service.Hook().BeforeServe) + + // 请求响应结束后回调 + s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().AfterOutput) + + // 注册全局中间件 + s.BindMiddleware("/*any", []ghttp.HandlerFunc{ + service.Middleware().Ctx, // 初始化请求上下文,一般需要第一个进行加载,后续中间件存在依赖关系 + service.Middleware().CORS, // 跨域中间件,自动处理跨域问题 + service.Middleware().Blacklist, // IP黑名单中间件,如果请求IP被后台拉黑,所有请求将被拒绝 + service.Middleware().DemoLimit, // 演示系統操作限制,当开启演示模式时,所有POST请求将被拒绝 + service.Middleware().PreFilter, // 请求输入预处理,api使用gf规范路由并且XxxReq结构体实现了validate.Filter接口即可隐式预处理 + service.Middleware().ResponseHandler, // HTTP响应预处理,在业务处理完成后,对响应结果进行格式化和错误过滤,将处理后的数据发送给请求方 + }...) + + s.Group("/", func(group *ghttp.RouterGroup) { + // 注册后台路由 + router.Admin(ctx, group) + + // 注册Api路由 + router.Api(ctx, group) + + // 注册websocket路由 + router.WebSocket(ctx, group) + + // 注册前台页面路由 + router.Home(ctx, group) + }) + + // 启动插件 + if err = addons.StartModules(ctx, &addons.Option{Server: s}); err != nil { + return err + } + + // 初始化casbin权限 + casbin.InitEnforcer(ctx) + + // 初始化生成代码配置 + if !gmode.IsProduct() { + hggen.InIt(ctx) + } + + // 启动tcp服务 + service.TCPServer().Start(ctx) + + // 启动服务监控 + service.AdminMonitor().StartMonitor(ctx) + + // 加载ip访问黑名单 + service.SysBlacklist().Load(ctx) + + // 注册支付成功回调方法 + service.Pay().RegisterNotifyCall() + + serverWg.Add(1) + + // 信号监听 + signalListen(ctx, signalHandlerForOverall) + + go func() { + <-serverCloseSignal + websocket.Stop() // 关闭websocket + service.TCPServer().Stop(ctx) // 关闭tcp服务器 + addons.StopModules(ctx) // 停止插件 + _ = s.Shutdown() // 关闭http服务,主服务建议放在最后一个关闭 + g.Log().Debug(ctx, "http successfully closed ..") + serverWg.Done() + }() + + // Just run the server. + s.Run() + return + }, + } +) diff --git a/server/internal/cmd/queue.go b/server/internal/cmd/queue.go new file mode 100644 index 0000000..a8dbb5d --- /dev/null +++ b/server/internal/cmd/queue.go @@ -0,0 +1,43 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/os/gcmd" + "hotgo/internal/global" + "hotgo/internal/library/queue" + _ "hotgo/internal/queues" + "hotgo/utility/simple" +) + +var ( + Queue = &gcmd.Command{ + Name: "queue", + Brief: "消息队列", + Description: ``, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + // 服务日志处理 + queue.Logger().SetHandlers(global.LoggingServeLogHandler) + + simple.SafeGo(ctx, func(ctx context.Context) { + queue.Logger().Debug(ctx, "start queue consumer..") + queue.StartConsumersListener(ctx) + queue.Logger().Debug(ctx, "start queue consumer success..") + }) + + serverWg.Add(1) + + // 信号监听 + signalListen(ctx, signalHandlerForOverall) + + <-serverCloseSignal + queue.Logger().Debug(ctx, "queue successfully closed ..") + serverWg.Done() + return + }, + } +) diff --git a/server/internal/cmd/tools.go b/server/internal/cmd/tools.go new file mode 100644 index 0000000..c098f08 --- /dev/null +++ b/server/internal/cmd/tools.go @@ -0,0 +1,107 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gcmd" + "github.com/gogf/gf/v2/os/gres" + "hotgo/internal/library/casbin" +) + +var ( + Tools = &gcmd.Command{ + Name: "tools", + Brief: "常用工具", + Description: ``, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + args := parser.GetOptAll() + g.Log().Debugf(ctx, "tools args:%v", args) + if len(args) == 0 { + err = gerror.New("tools args cannot be empty.") + return + } + + method, ok := args["m"] + if !ok { + err = gerror.New("tools method cannot be empty.") + return + } + + switch method { + case "casbin": + err = handleCasbin(ctx, args) + case "gres": + err = handleGRes(ctx, args) + default: + err = gerror.Newf("tools method[%v] does not exist", method) + } + + if err == nil { + g.Log().Info(ctx, "tools exec successful!") + } + return + }, + } +) + +// handleCasbin casbin. +func handleCasbin(ctx context.Context, args map[string]string) (err error) { + a1, ok := args["a1"] + if !ok { + err = gerror.New("casbin args cannot be empty.") + return + } + + casbin.InitEnforcer(ctx) + switch a1 { + case "clear": + err = casbin.Clear(ctx) + case "refresh": + err = casbin.Refresh(ctx) + default: + err = gerror.Newf("casbin a1 is invalid, a1:%v", a1) + } + return +} + +func handleGRes(ctx context.Context, args map[string]string) (err error) { + a1, ok := args["a1"] + if !ok { + err = gerror.New("gres args cannot be empty.") + return + } + + switch a1 { + case "dump": + gres.Dump() + case "content": + path, ok := args["a2"] + if !ok { + err = gerror.New("缺少查看文件路径参数:`a2`") + return + } + + if !gres.Contains(path) { + err = gerror.Newf("没有找到资源文件:%v", path) + return + } + content := string(gres.GetContent(path)) + + if len(content) == 0 { + err = gerror.Newf("没有找到资源文件内容,请确认传入`a2`参数是一个文件,a2:%v", path) + return + } + fmt.Println("以下是资源文件内容:") + fmt.Println(content) + default: + err = gerror.Newf("handleGRes a1 is invalid, a1:%v", a1) + } + return +} diff --git a/server/internal/cmd/up.go b/server/internal/cmd/up.go new file mode 100644 index 0000000..cbfc045 --- /dev/null +++ b/server/internal/cmd/up.go @@ -0,0 +1,65 @@ +// Package cmd +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package cmd + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gcmd" + "hotgo/internal/cmd/upgrade/fix" +) + +var ( + Up = &gcmd.Command{ + Name: "up", + Brief: "处理hotgo版本升级更新带来的兼容问题", + Description: ``, + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + args := parser.GetOptAll() + g.Log().Debugf(ctx, "up args:%v", args) + if len(args) == 0 { + err = gerror.New("up args cannot be empty.") + return + } + + method, ok := args["m"] + if !ok { + err = gerror.New("up method cannot be empty.") + return + } + + switch method { + case "fix": + err = handleUpgradeFix(ctx, args) + default: + err = gerror.Newf("up method[%v] does not exist", method) + } + + if err == nil { + g.Log().Info(ctx, "up exec successful!") + } + return + }, + } +) + +// handleUpgradeFix 处理修复脚本 +func handleUpgradeFix(ctx context.Context, args map[string]string) (err error) { + a1, ok := args["a1"] + if !ok { + err = gerror.New("fix args cannot be empty.") + return + } + + switch a1 { + case "menuTree": + fix.UpdateAdminMenuTree(ctx) + default: + err = gerror.Newf("fix a1 is invalid, a1:%v", a1) + } + return +} diff --git a/server/internal/cmd/upgrade/fix/admin_menu_tree.go b/server/internal/cmd/upgrade/fix/admin_menu_tree.go new file mode 100644 index 0000000..e5c7d66 --- /dev/null +++ b/server/internal/cmd/upgrade/fix/admin_menu_tree.go @@ -0,0 +1,48 @@ +// Package fix +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package fix + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "hotgo/internal/dao" + "hotgo/internal/library/hgorm" + "hotgo/internal/model/entity" +) + +// UpdateAdminMenuTree 更新菜单关系树 +// 根据树等级从上到下依次检查,将无效的关系树进行修复更新 +func UpdateAdminMenuTree(ctx context.Context) { + var list []*entity.AdminMenu + err := dao.AdminMenu.Ctx(ctx).OrderAsc("level").Scan(&list) + if err != nil { + g.Log().Fatal(ctx, err) + } + + genUpdateData := func(v *entity.AdminMenu) g.Map { + update := g.Map{"updated_at": gtime.Now()} + if v.Pid <= 0 { + update["level"] = 1 + update["tree"] = "" + return update + } + + // 生成下级关系树 + update["pid"], update["level"], update["tree"], err = hgorm.GenSubTree(ctx, &dao.AdminMenu, v.Pid) + return update + } + + for _, v := range list { + update := genUpdateData(v) + if v.Level == update["level"] && v.Tree == update["tree"] { + continue + } + if _, err = dao.AdminMenu.Ctx(ctx).WherePri(v.Id).Data(genUpdateData(v)).Update(); err != nil { + g.Log().Fatal(ctx, err) + } + } +} diff --git a/server/internal/consts/addons.go b/server/internal/consts/addons.go new file mode 100644 index 0000000..3384bbf --- /dev/null +++ b/server/internal/consts/addons.go @@ -0,0 +1,80 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("addonsGroupOptions", "插件分组", AddonsGroupOptions) + dict.RegisterEnums("addonsInstallStatus", "插件安装状态", AddonsInstallStatusOptions) + dict.RegisterEnums("addonsExtend", "插件扩展", AddonsExtendOptions) +} + +const ( + AddonsTag = "addons_" // 插件标签前缀 + AddonsDir = "addons" // 插件路径 +) + +const ( + AddonsGroupPlug = 1 // 功能扩展 + AddonsGroupBusiness = 2 // 主要业务 + AddonsGroupThirdParty = 3 // 第三方插件 + AddonsGroupMiniApp = 4 // 小程序 + AddonsGroupCustomer = 5 // 客户关系 + AddonsGroupActivity = 6 // 营销及活动 + AddonsGroupServices = 7 // 常用服务及工具 + AddonsGroupBiz = 8 // 行业解决方案 +) + +// AddonsGroupOptions 插件分组选项 +var AddonsGroupOptions = []*model.Option{ + dict.GenInfoOption(AddonsGroupPlug, "功能扩展"), + dict.GenInfoOption(AddonsGroupBusiness, "主要业务"), + dict.GenInfoOption(AddonsGroupThirdParty, "第三方插件"), + dict.GenInfoOption(AddonsGroupMiniApp, "小程序"), + dict.GenInfoOption(AddonsGroupCustomer, "客户关系"), + dict.GenInfoOption(AddonsGroupActivity, "营销及活动"), + dict.GenInfoOption(AddonsGroupServices, "常用服务及工具"), + dict.GenInfoOption(AddonsGroupBiz, "行业解决方案"), +} + +var AddonsGroupIconMap = map[int]string{ + AddonsGroupPlug: "AppstoreAddOutlined", + AddonsGroupBusiness: "FireOutlined", + AddonsGroupThirdParty: "ApiOutlined", + AddonsGroupMiniApp: "RocketOutlined", + AddonsGroupCustomer: "UserSwitchOutlined", + AddonsGroupActivity: "TagOutlined", + AddonsGroupServices: "ToolOutlined", + AddonsGroupBiz: "CheckCircleOutlined", +} + +const ( + AddonsInstallStatusOk = 1 // 已安装 + AddonsInstallStatusNo = 2 // 未安装 + AddonsInstallStatusUn = 3 // 已卸载 +) + +// AddonsInstallStatusOptions 插件安装状态 +var AddonsInstallStatusOptions = []*model.Option{ + dict.GenInfoOption(AddonsInstallStatusOk, "已安装"), + dict.GenInfoOption(AddonsInstallStatusNo, "未安装"), + dict.GenInfoOption(AddonsInstallStatusUn, "已卸载"), +} + +const ( + AddonsExtendResourcePublic = "resourcePublic" + AddonsExtendResourceTemplate = "resourceTemplate" +) + +// AddonsExtendOptions 插件扩展选项 +var AddonsExtendOptions = []*model.Option{ + dict.GenInfoOption(AddonsExtendResourcePublic, "创建静态目录"), + dict.GenInfoOption(AddonsExtendResourceTemplate, "创建模板目录"), +} diff --git a/server/internal/consts/app.go b/server/internal/consts/app.go new file mode 100644 index 0000000..9b57213 --- /dev/null +++ b/server/internal/consts/app.go @@ -0,0 +1,15 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 应用类型 +const ( + AppAdmin = "admin" + AppApi = "api" + AppHome = "home" + AppWebSocket = "websocket" + AppDefault = "default" +) diff --git a/server/internal/consts/cache.go b/server/internal/consts/cache.go new file mode 100644 index 0000000..e1313b8 --- /dev/null +++ b/server/internal/consts/cache.go @@ -0,0 +1,13 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// cache +const ( + CacheToken = "token" // 登录token + CacheTokenBind = "token_bind" // 登录用户身份绑定 + CacheMultipartUpload = "multipart_upload" // 分片上传 +) diff --git a/server/internal/consts/captcha.go b/server/internal/consts/captcha.go new file mode 100644 index 0000000..c5c7a75 --- /dev/null +++ b/server/internal/consts/captcha.go @@ -0,0 +1,6 @@ +package consts + +const ( + CaptchaTypeString = iota + 1 // 字符串 + CaptchaTypeMath // 数字计算 +) diff --git a/server/internal/consts/cash.go b/server/internal/consts/cash.go new file mode 100644 index 0000000..f215d85 --- /dev/null +++ b/server/internal/consts/cash.go @@ -0,0 +1,13 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 提现状态 +const ( + CashStatusWait = 1 // 处理中 + CashStatusOk = 2 // 提现成功 + CashStatusFail = 3 // 提现异常 +) diff --git a/server/internal/consts/config.go b/server/internal/consts/config.go new file mode 100644 index 0000000..1a85e77 --- /dev/null +++ b/server/internal/consts/config.go @@ -0,0 +1,117 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "github.com/gogf/gf/v2/util/gconv" +) + +// RequestEncryptKey +// 请求加密密钥用于敏感数据加密,16位字符,前后端需保持一致 +// 安全起见,生产环境运行时请注意修改 +var RequestEncryptKey = []byte("f080a463654b2279") + +// 配置数据类型 +const ( + ConfigTypeString = "string" + ConfigTypeInt = "int" + ConfigTypeInt8 = "int8" + ConfigTypeInt16 = "int16" + ConfigTypeInt32 = "int32" + ConfigTypeInt64 = "int64" + ConfigTypeUint = "uint" + ConfigTypeUint8 = "uint8" + ConfigTypeUint16 = "uint16" + ConfigTypeUint32 = "uint32" + ConfigTypeUint64 = "uint64" + ConfigTypeFloat32 = "float32" + ConfigTypeFloat64 = "float64" + ConfigTypeBool = "bool" + ConfigTypeDate = "date" + ConfigTypeDateTime = "datetime" + ConfigTypeSliceString = "[]string" + ConfigTypeSliceInt = "[]int" + ConfigTypeSliceInt64 = "[]int64" +) + +var ConfigTypes = []string{ConfigTypeString, + ConfigTypeInt, ConfigTypeInt8, ConfigTypeInt16, ConfigTypeInt32, ConfigTypeInt64, + ConfigTypeUint, ConfigTypeUint8, ConfigTypeUint16, ConfigTypeUint32, ConfigTypeUint64, + ConfigTypeFloat32, ConfigTypeFloat64, + ConfigTypeBool, + ConfigTypeDate, ConfigTypeDateTime, + ConfigTypeSliceString, ConfigTypeSliceInt, ConfigTypeSliceInt64, +} + +// ConfigMaskDemoField 演示环境下需要隐藏的配置 +var ConfigMaskDemoField = map[string]struct{}{ + // 邮箱 + "smtpUser": {}, "smtpPass": {}, + + // 云存储 + "uploadUCloudPublicKey": {}, "uploadUCloudPrivateKey": {}, "uploadCosSecretId": {}, "uploadCosSecretKey": {}, + "uploadOssSecretId": {}, "uploadOssSecretKey": {}, "uploadQiNiuAccessKey": {}, "uploadQiNiuSecretKey": {}, + + // 地图 + "geoAmapWebKey": {}, + + // 短信 + "smsAliYunAccessKeyID": {}, "smsAliYunAccessKeySecret": {}, "smsTencentSecretId": {}, "smsTencentSecretKey": {}, + + // 支付 + "payWxPayMchId": {}, "payWxPaySerialNo": {}, "payWxPayAPIv3Key": {}, "payWxPayPrivateKey": {}, "payQQPayMchId": {}, "payQQPayApiKey": {}, + + // 微信 + "officialAccountAppSecret": {}, "officialAccountToken": {}, "officialAccountEncodingAESKey": {}, "openPlatformAppSecret": {}, + "openPlatformToken": {}, "openPlatformEncodingAESKey": {}, +} + +// ConvType 类型转换 +func ConvType(val interface{}, t string) interface{} { + switch t { + case ConfigTypeString: + val = gconv.String(val) + case ConfigTypeInt: + val = gconv.Int(val) + case ConfigTypeInt8: + val = gconv.Int8(val) + case ConfigTypeInt16: + val = gconv.Int16(val) + case ConfigTypeInt32: + val = gconv.Int32(val) + case ConfigTypeInt64: + val = gconv.Int64(val) + case ConfigTypeUint: + val = gconv.Uint(val) + case ConfigTypeUint8: + val = gconv.Uint8(val) + case ConfigTypeUint16: + val = gconv.Uint16(val) + case ConfigTypeUint32: + val = gconv.Uint32(val) + case ConfigTypeUint64: + val = gconv.Uint64(val) + case ConfigTypeFloat32: + val = gconv.Float32(val) + case ConfigTypeFloat64: + val = gconv.Float64(val) + case ConfigTypeBool: + val = gconv.Bool(val) + case ConfigTypeDate: + val = gconv.Time(val, "Y-m-d") + case ConfigTypeDateTime: + val = gconv.Time(val, "Y-m-d H:i:s") + case ConfigTypeSliceInt: + val = gconv.SliceInt(val) + case ConfigTypeSliceInt64: + val = gconv.SliceInt64(val) + case ConfigTypeSliceString: + val = gconv.SliceStr(val) + default: + val = gconv.String(val) + } + return val +} diff --git a/server/internal/consts/context.go b/server/internal/consts/context.go new file mode 100644 index 0000000..38acd81 --- /dev/null +++ b/server/internal/consts/context.go @@ -0,0 +1,15 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +type CtxKey string + +// ContextKey 上下文 +const ( + ContextHTTPKey CtxKey = "httpContext" // http上下文变量名称 + ContextKeyCronArgs CtxKey = "cronArgs" // 定时任务参数 + ContextKeyCronSn CtxKey = "cronSn" // 定时任务序列号 +) diff --git a/server/internal/consts/credit_log.go b/server/internal/consts/credit_log.go new file mode 100644 index 0000000..c06d654 --- /dev/null +++ b/server/internal/consts/credit_log.go @@ -0,0 +1,48 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("creditType", "资金变动类型", CreditTypeOptions) + dict.RegisterEnums("creditGroup", "资金变动分组", CreditGroupOptions) +} + +const ( + CreditTypeBalance = "balance" // 余额 + CreditTypeIntegral = "integral" // 积分 +) + +const ( + CreditGroupDecr = "decr" // 扣款 + CreditGroupIncr = "incr" // 加款 + CreditGroupOpDecr = "op_decr" // 操作扣款 + CreditGroupOpIncr = "op_incr" // 操作加款 + CreditGroupBalanceRecharge = "balance_recharge" // 余额充值 + CreditGroupBalanceRefund = "balance_refund" // 余额退款 + CreditGroupApplyCash = "apply_cash" // 申请提现 +) + +// CreditTypeOptions 变动类型 +var CreditTypeOptions = []*model.Option{ + dict.GenSuccessOption(CreditTypeBalance, "余额"), + dict.GenInfoOption(CreditTypeIntegral, "积分"), +} + +// CreditGroupOptions 变动分组 +var CreditGroupOptions = []*model.Option{ + dict.GenWarningOption(CreditGroupDecr, "扣款"), + dict.GenSuccessOption(CreditGroupIncr, "加款"), + dict.GenWarningOption(CreditGroupOpDecr, "操作扣款"), + dict.GenSuccessOption(CreditGroupOpIncr, "操作加款"), + dict.GenWarningOption(CreditGroupBalanceRefund, "余额退款"), + dict.GenSuccessOption(CreditGroupBalanceRecharge, "余额充值"), + dict.GenInfoOption(CreditGroupApplyCash, "申请提现"), +} diff --git a/server/internal/consts/cron.go b/server/internal/consts/cron.go new file mode 100644 index 0000000..3898160 --- /dev/null +++ b/server/internal/consts/cron.go @@ -0,0 +1,16 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 定时任务 + +const ( + CronSplitStr = "," // 变量分割符 + CronPolicySame = 1 // 并行策略 + CronPolicySingle = 2 // 单例策略 + CronPolicyOnce = 3 // 单次策略 + CronPolicyTimes = 4 // 多次策略 +) diff --git a/server/internal/consts/debris.go b/server/internal/consts/debris.go new file mode 100644 index 0000000..531c34c --- /dev/null +++ b/server/internal/consts/debris.go @@ -0,0 +1,37 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2025 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 碎片 + +const ( + DemoTips = "演示系统已隐藏" // 演示系统敏感数据打码 + NilJsonToString = "{}" // 空json初始化值 + RegionSpilt = " / " // 地区分隔符 + Unknown = "Unknown" // Unknown + SuperRoleKey = "super" // 超管角色唯一标识符,通过角色验证超管 + MaxServeLogContentLen = 2048 // 最大保留服务日志内容大小 + SysDefaultLanguage = "zh_CN" // 系统默认语言,当配置文件没有国际化配置时生效 +) + +// curd. +const ( + DefaultPage = 10 // 默认列表分页加载数量 + DefaultPageSize = 1 // 默认列表分页加载页码 + MaxSortIncr = 10 // 最大排序值增量 +) + +// TenantField 租户字段 +const ( + TenantId = "tenant_id" // 租户ID + MerchantId = "merchant_id" // 商户ID + UserId = "user_id" // 用户ID +) + +const ( + DBMysql = "mysql" + DBPgsql = "pgsql" +) diff --git a/server/internal/consts/dept.go b/server/internal/consts/dept.go new file mode 100644 index 0000000..7c2f2d6 --- /dev/null +++ b/server/internal/consts/dept.go @@ -0,0 +1,30 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2024 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("deptType", "部门类型选项", DeptTypeOptions) +} + +const ( + DeptTypeCompany = "company" // 公司 + DeptTypeTenant = "tenant" // 租户 + DeptTypeMerchant = "merchant" // 商户 + DeptTypeUser = "user" // 用户 +) + +// DeptTypeOptions 部门类型选项 +var DeptTypeOptions = []*model.Option{ + dict.GenSuccessOption(DeptTypeCompany, "公司"), + dict.GenErrorOption(DeptTypeTenant, "租户"), + dict.GenInfoOption(DeptTypeMerchant, "商户"), + dict.GenWarningOption(DeptTypeUser, "用户"), +} diff --git a/server/internal/consts/ems.go b/server/internal/consts/ems.go new file mode 100644 index 0000000..5191153 --- /dev/null +++ b/server/internal/consts/ems.go @@ -0,0 +1,38 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +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" // 申请提现 +) + +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/error.go b/server/internal/consts/error.go new file mode 100644 index 0000000..fa392ed --- /dev/null +++ b/server/internal/consts/error.go @@ -0,0 +1,35 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "github.com/gogf/gf/v2/text/gstr" +) + +// 错误解释 +const ( + ErrorORM = "sql执行异常" + ErrorNotData = "数据不存在" + ErrorRotaPointer = "指针转换异常" +) + +// 需要隐藏真实错误的Wrap,开启访问日志后仍然会将真实错误记录 +var concealErrorSlice = []string{ErrorORM, ErrorRotaPointer} + +// ErrorMessage 错误显示信息,非debug模式有效 +func ErrorMessage(err error) (message string) { + if err == nil { + return "操作失败!~" + } + + message = err.Error() + for _, e := range concealErrorSlice { + if gstr.Contains(message, e) { + return "操作失败,请稍后重试!~" + } + } + return +} diff --git a/server/internal/consts/event.go b/server/internal/consts/event.go new file mode 100644 index 0000000..e3e6ca3 --- /dev/null +++ b/server/internal/consts/event.go @@ -0,0 +1,10 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +const ( + EventServerClose = "server.close" // 服务关闭事件 +) diff --git a/server/internal/consts/gencodes.go b/server/internal/consts/gencodes.go new file mode 100644 index 0000000..88da4e7 --- /dev/null +++ b/server/internal/consts/gencodes.go @@ -0,0 +1,96 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +// 生成代码类型 +const ( + GenCodesTypeCurd = 10 // 增删改查列表 + GenCodesTypeTree = 11 // 树列表 + GenCodesTypeQueue = 20 // 队列消费者 + GenCodesTypeCron = 30 // 定时任务 +) + +var GenCodesTypeNameMap = map[int]string{ + GenCodesTypeCurd: "增删改查列表", + GenCodesTypeTree: "关系树列表", + GenCodesTypeQueue: "队列消费者(未实现)", + GenCodesTypeCron: "定时任务(未实现)", +} + +var GenCodesTypeConfMap = map[int]string{ + GenCodesTypeCurd: "crud", + GenCodesTypeTree: "tree", + GenCodesTypeQueue: "queue", + GenCodesTypeCron: "cron", +} + +// 生成代码状态 +const ( + GenCodesStatusOk = 1 // 生成成功 + GenCodesStatusWait = 2 // 未生成 + GenCodesStatusFail = 3 // 生成失败 +) + +var GenCodesStatusNameMap = map[int]string{ + GenCodesStatusOk: "生成成功", + GenCodesStatusWait: "未生成", + GenCodesStatusFail: "生成失败", +} + +// 生成代码关联表方式 +const ( + GenCodesJoinLeft = 1 // 左关联 + GenCodesJoinRight = 2 // 右关联 + GenCodesJoinInner = 3 // 内关联 +) + +var GenCodesJoinNameMap = map[int]string{ + GenCodesJoinLeft: "左关联", + GenCodesJoinRight: "右关联", + GenCodesJoinInner: "内关联", +} + +var GenCodesJoinLinkMap = map[int]string{ + GenCodesJoinLeft: "LeftJoin", + GenCodesJoinRight: "RightJoin", + GenCodesJoinInner: "InnerJoin", +} + +// 生成代码的生成方式 +const ( + GenCodesBuildMethCreate = 1 // 创建 + GenCodesBuildMethCover = 2 // 覆盖 + GenCodesBuildMethSkip = 3 // 跳过 + GenCodesBuildIgnore = 4 // 不生成 +) + +var GenCodesBuildMethNameMap = map[int]string{ + GenCodesBuildMethCreate: "创建文件", + GenCodesBuildMethCover: "强制覆盖", + GenCodesBuildMethSkip: "已存在跳过", + GenCodesBuildIgnore: "不生成", +} + +const ( + GenCodesIndexPK = "PRI" // 主键索引 + GenCodesIndexUNI = "UNI" // 唯一索引 +) + +const ( + GenCodesTreeStyleTypeNormal = 1 // 普通树表格 + GenCodesTreeStyleTypeOption = 2 // 选项式树表 +) + +// GenCodesTreeStyleTypeOptions 树表样式选项 +var GenCodesTreeStyleTypeOptions = []*model.Option{ + dict.GenSuccessOption(GenCodesTreeStyleTypeNormal, "普通树表格"), + dict.GenInfoOption(GenCodesTreeStyleTypeOption, "选项式树表"), +} diff --git a/server/internal/consts/http.go b/server/internal/consts/http.go new file mode 100644 index 0000000..019168e --- /dev/null +++ b/server/internal/consts/http.go @@ -0,0 +1,63 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "fmt" + "hotgo/internal/library/dict" + "hotgo/internal/model" + "net/http" + + "github.com/gogf/gf/v2/errors/gcode" +) + +func init() { + dict.RegisterEnums("HTTPMethod", "HTTP请求方式选项", HTTPMethodOptions) + dict.RegisterEnums("HTTPHandlerTime", "HTTP处理耗时选项", HTTPHandlerTimeOptions) + dict.RegisterEnums("HTTPApiCode", "HTTP接口状态码选项", HTTPApiCodeOptions) +} + +const ( + HTTPContentTypeXml = "text/xml" + HTTPContentTypeHtml = "text/html" + HTTPContentTypeStream = "text/event-stream" + HTTPContentTypeJson = "application/json" + HTTPContentTypeOctetStream = "application/octet-stream" +) + +// HTTPMethodOptions HTTP请求方式选项 +var HTTPMethodOptions = []*model.Option{ + dict.GenSuccessOption(http.MethodGet, "GET"), + dict.GenInfoOption(http.MethodPost, "POST"), + dict.GenSuccessOption(http.MethodPut, "PUT"), + dict.GenInfoOption(http.MethodDelete, "DELETE"), +} + +const ( + HTTPHandlerTime50 = "< 50" + HTTPHandlerTime200 = "< 200" + HTTPHandlerTime200To500 = "BETWEEN 200 AND 500" + HTTPHandlerTime500To1000 = "BETWEEN 500 AND 1000" + HTTPHandlerTime1000To10000 = "BETWEEN 1000 AND 10000" + HTTPHandlerTime10000UP = "> 10000" +) + +// HTTPHandlerTimeOptions HTTP处理耗时选项 +var HTTPHandlerTimeOptions = []*model.Option{ + dict.GenSuccessOption(HTTPHandlerTime50, "50ms以内"), + dict.GenInfoOption(HTTPHandlerTime200, "200ms以内"), + dict.GenSuccessOption(HTTPHandlerTime200To500, "200~500ms"), + dict.GenSuccessOption(HTTPHandlerTime500To1000, "500~1000ms"), + dict.GenInfoOption(HTTPHandlerTime1000To10000, "1000~10000ms"), + dict.GenInfoOption(HTTPHandlerTime10000UP, "10000ms以上"), +} + +// HTTPApiCodeOptions HTTP接口状态码选项 +var HTTPApiCodeOptions = []*model.Option{ + dict.GenSuccessOption(gcode.CodeOK.Code(), fmt.Sprintf("%v %v", gcode.CodeOK.Code(), "成功")), + dict.GenWarningOption(gcode.CodeNil.Code(), fmt.Sprintf("%v %v", gcode.CodeNil.Code(), "失败")), + dict.GenWarningOption(gcode.CodeSecurityReason.Code(), fmt.Sprintf("%v %v", gcode.CodeSecurityReason.Code(), "无访问权限")), +} diff --git a/server/internal/consts/notice.go b/server/internal/consts/notice.go new file mode 100644 index 0000000..ff4ea63 --- /dev/null +++ b/server/internal/consts/notice.go @@ -0,0 +1,13 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 公告类型 +const ( + NoticeTypeNotify = 1 // 通知 + NoticeTypeNotice = 2 // 公告 + NoticeTypeLetter = 3 // 私信 +) diff --git a/server/internal/consts/order.go b/server/internal/consts/order.go new file mode 100644 index 0000000..007a1f2 --- /dev/null +++ b/server/internal/consts/order.go @@ -0,0 +1,66 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("orderStatus", "订单状态", OrderStatusOptions) + dict.RegisterEnums("acceptRefundStatus", "订单退款受理状态", OrderAcceptRefundOptions) +} + +// 订单分组 +// 为不同的业务订单设置不同的分组,分组可以设置不同的业务回调方法 + +const ( + OrderGroupDefault = "order" // 普通订单 + OrderGroupAdminOrder = "admin_order" // 后台充值订单 + // 还可以设置其他,方便后期扩展.. +) + +// 订单类型 + +const ( + OrderTypeBalance = "balance" // 余额充值 + OrderTypeProduct = "product" // 购买产品 +) + +const ( + OrderStatusALL = -1 // 全部状态 + OrderStatusNotPay = 1 // 待付款 + OrderStatusPay = 2 // 已付款 + OrderStatusShipments = 3 // 已发货 + OrderStatusDone = 4 // 已完成 + OrderStatusClose = 5 // 已关闭 + OrderStatusReturnRequest = 6 // 申请退款 + OrderStatusReturning = 7 // 退款中 + OrderStatusReturned = 8 // 已退款 + OrderStatusReturnReject = 9 // 拒绝退款 +) + +// OrderStatusOptions 订单状态选项 +var OrderStatusOptions = []*model.Option{ + dict.GenInfoOption(OrderStatusALL, "全部"), + dict.GenInfoOption(OrderStatusNotPay, "待付款"), + dict.GenInfoOption(OrderStatusPay, "已付款"), + dict.GenInfoOption(OrderStatusShipments, "已发货"), + dict.GenSuccessOption(OrderStatusDone, "已完成"), + dict.GenDefaultOption(OrderStatusClose, "已关闭"), + dict.GenWarningOption(OrderStatusReturnRequest, "申请退款"), + dict.GenDefaultOption(OrderStatusReturning, "退款中"), + dict.GenErrorOption(OrderStatusReturned, "已退款"), + dict.GenWarningOption(OrderStatusReturnReject, "拒绝退款"), +} + +// OrderAcceptRefundOptions 订单退款受理状态 +var OrderAcceptRefundOptions = []*model.Option{ + dict.GenWarningOption(OrderStatusReturnRequest, "申请退款"), + dict.GenSuccessOption(OrderStatusReturned, "已退款"), + dict.GenErrorOption(OrderStatusReturnReject, "拒绝退款"), +} diff --git a/server/internal/consts/pay.go b/server/internal/consts/pay.go new file mode 100644 index 0000000..084dd4c --- /dev/null +++ b/server/internal/consts/pay.go @@ -0,0 +1,96 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +// 支付方式 + +func init() { + dict.RegisterEnums("payType", "支付方式", PayTypeOptions) + dict.RegisterEnums("payStatus", "支付状态", PayStatusOptions) +} + +const ( + PayTypeALL = "" // 全部 + PayTypeWxPay = "wxpay" // 微信支付 + PayTypeAliPay = "alipay" // 支付宝 + PayTypeQQPay = "qqpay" // QQ支付 +) + +var ( + PayTypeSlice = []string{ + PayTypeWxPay, PayTypeAliPay, PayTypeQQPay, + } + + PayTypeNameMap = map[string]string{ + PayTypeALL: "全部", + PayTypeWxPay: "微信支付", + PayTypeAliPay: "支付宝", + PayTypeQQPay: "QQ支付", + } +) + +// 交易方式 + +const ( + // 微信 + TradeTypeWxMP = "mp" // 公众号 + TradeTypeWxMini = "mini" // 小程序 + TradeTypeWxApp = "app" // APP + TradeTypeWxScan = "scan" // 二维码扫码 + TradeTypeWxPos = "pos" // 二维码收款 + TradeTypeWxH5 = "h5" // H5 + + // 支付宝 + TradeTypeAliWeb = "web" // 电脑网页 + TradeTypeAliApp = "app" // APP + TradeTypeAliScan = "scan" // 二维码扫码 + TradeTypeAliWap = "wap" // 手机网页 + TradeTypeAliPos = "pos" // 二维码收款 + + // QQ + TradeTypeQQWeb = "qqweb" // PC网页 + TradeTypeQQWap = "qqwap" // 移动端 +) + +var ( + TradeTypeWxSlice = []string{TradeTypeWxMP, TradeTypeWxMini, TradeTypeWxApp, TradeTypeWxScan, TradeTypeWxPos, TradeTypeWxH5} + TradeTypeAliSlice = []string{TradeTypeAliWeb, TradeTypeAliApp, TradeTypeAliScan, TradeTypeAliWap, TradeTypeAliPos} + TradeTypeQQSlice = []string{TradeTypeQQWeb, TradeTypeQQWap} +) + +// 支付状态 + +const ( + PayStatusWait = 1 // 待支付 + PayStatusOk = 2 // 已支付 +) + +// PayStatusOptions 支付状态选项 +var PayStatusOptions = []*model.Option{ + dict.GenDefaultOption(PayStatusWait, "待支付"), + dict.GenSuccessOption(PayStatusOk, "已支付"), +} + +// 退款状态 + +const ( + RefundStatusNo = 1 // 未退款 + RefundStatusApply = 2 // 申请退款 + RefundStatusReject = 3 // 拒绝退款 + RefundStatusAgree = 4 // 同意退款,已退款 +) + +// PayTypeOptions 支付方式选项 +var PayTypeOptions = []*model.Option{ + dict.GenSuccessOption(PayTypeWxPay, "微信支付"), + dict.GenInfoOption(PayTypeAliPay, "支付宝"), + dict.GenDefaultOption(PayTypeQQPay, "QQ支付"), +} diff --git a/server/internal/consts/pubsub.go b/server/internal/consts/pubsub.go new file mode 100644 index 0000000..eff5e9c --- /dev/null +++ b/server/internal/consts/pubsub.go @@ -0,0 +1,12 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +const ( + ClusterSyncSysconfig = "cluster.sync.sysConfig" // 系统配置 + ClusterSyncSysBlacklist = "cluster.sync.sysBlacklist" // 系统黑名单 + ClusterSyncSysSuperAdmin = "cluster.sync.superAdmin" // 超管 +) diff --git a/server/internal/consts/queue.go b/server/internal/consts/queue.go new file mode 100644 index 0000000..0aa91a4 --- /dev/null +++ b/server/internal/consts/queue.go @@ -0,0 +1,13 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 消息队列 +const ( + QueueLogTopic = `request_log` // 访问日志 + QueueLoginLogTopic = `login_log` // 登录日志 + QueueServeLogTopic = `serve_log` // 服务日志 +) diff --git a/server/internal/consts/role.go b/server/internal/consts/role.go new file mode 100644 index 0000000..eb2e846 --- /dev/null +++ b/server/internal/consts/role.go @@ -0,0 +1,90 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 数据范围 +const ( + RoleDataAll = 1 // 全部权限 + + // 通过部门划分 + RoleDataNowDept = 2 // 当前部门 + RoleDataDeptAndSub = 3 // 当前部门及以下部门 + RoleDataDeptCustom = 4 // 自定义部门 + + // 通过上下级关系划分 + RoleDataSelf = 5 // 仅自己 + RoleDataSelfAndSub = 6 // 自己和直属下级 + RoleDataSelfAndAllSub = 7 // 自己和全部下级 +) + +var RoleDataNameMap = map[int]string{ + RoleDataAll: "全部权限", + RoleDataNowDept: "当前部门", + RoleDataDeptAndSub: "当前及以下部门", + RoleDataDeptCustom: "自定义部门", + RoleDataSelf: "仅自己", + RoleDataSelfAndSub: "自己和直属下级", + RoleDataSelfAndAllSub: "自己和全部下级", +} + +type GroupScopeSelect struct { + Type string `json:"type,omitempty"` + Label string `json:"label"` + Key int `json:"key"` + Value int `json:"value,omitempty"` + Children []ScopeSelect `json:"children,omitempty"` +} + +type ScopeSelect struct { + Label string `json:"label"` + Value int `json:"value"` +} + +var DataScopeSelect = []GroupScopeSelect{ + { + Label: RoleDataNameMap[RoleDataAll], + Key: RoleDataAll, + Value: RoleDataAll, + }, + { + Type: "group", + Label: "按部门划分", + Key: -1, + Children: []ScopeSelect{ + { + Label: RoleDataNameMap[RoleDataNowDept], + Value: RoleDataNowDept, + }, + { + Label: RoleDataNameMap[RoleDataDeptAndSub], + Value: RoleDataDeptAndSub, + }, + { + Label: RoleDataNameMap[RoleDataDeptCustom], + Value: RoleDataDeptCustom, + }, + }, + }, + { + Type: "group", + Label: "按上下级关系划分", + Key: -2, + Children: []ScopeSelect{ + { + Label: RoleDataNameMap[RoleDataSelf], + Value: RoleDataSelf, + }, + { + Label: RoleDataNameMap[RoleDataSelfAndSub], + Value: RoleDataSelfAndSub, + }, + { + Label: RoleDataNameMap[RoleDataSelfAndAllSub], + Value: RoleDataSelfAndAllSub, + }, + }, + }, +} diff --git a/server/internal/consts/servelicense.go b/server/internal/consts/servelicense.go new file mode 100644 index 0000000..96e9dc8 --- /dev/null +++ b/server/internal/consts/servelicense.go @@ -0,0 +1,29 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("ServerLicenseGroupOptions", "服务授权分组选项", ServerLicenseGroupOptions) +} + +// 授权分组 +const ( + LicenseGroupDefault = "default" // 默认组 + LicenseGroupCron = "cron" // 定时任务 + LicenseGroupAuth = "auth" // 服务授权 +) + +// ServerLicenseGroupOptions 服务授权分组选项 +var ServerLicenseGroupOptions = []*model.Option{ + dict.GenWarningOption(LicenseGroupDefault, "默认组"), + dict.GenSuccessOption(LicenseGroupCron, "定时任务"), + dict.GenSuccessOption(LicenseGroupAuth, "服务授权"), +} diff --git a/server/internal/consts/sms.go b/server/internal/consts/sms.go new file mode 100644 index 0000000..2836e24 --- /dev/null +++ b/server/internal/consts/sms.go @@ -0,0 +1,33 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 短信驱动 +const ( + SmsDriveAliYun = "aliyun" // 阿里云 + SmsDriveTencent = "tencent" // 腾讯云 +) + +// 短信内置模板 +const ( + SmsTemplateCode = "code" // 通用验证码 + SmsTemplateLogin = "login" // 登录 + SmsTemplateRegister = "register" // 注册 + SmsTemplateResetPwd = "resetPwd" // 重置密码 + SmsTemplateBind = "bind" // 绑定手机号 + SmsTemplateCash = "cash" // 申请提现 +) + +var ( + SmsTemplateEventMap = map[string]string{ + SmsTemplateCode: "通用验证码", + SmsTemplateLogin: "登录", + SmsTemplateRegister: "注册", + SmsTemplateResetPwd: "重置密码", + SmsTemplateBind: "绑定手机号", + SmsTemplateCash: "申请提现", + } +) diff --git a/server/internal/consts/status.go b/server/internal/consts/status.go new file mode 100644 index 0000000..eb379f9 --- /dev/null +++ b/server/internal/consts/status.go @@ -0,0 +1,49 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +import ( + "hotgo/internal/library/dict" + "hotgo/internal/model" +) + +func init() { + dict.RegisterEnums("CodeStatusOptions", "验证码状态选项", CodeStatusOptions) + dict.RegisterEnums("BlacklistStatusOptions", "黑名单拉黑状态选项", BlacklistStatusOptions) +} + +// 状态码 +const ( + StatusALL int = -1 // 全部状态 + StatusEnabled int = 1 // 启用 + StatusDisable int = 2 // 禁用 + StatusDelete int = 3 // 已删除 +) + +var StatusSlice = []int{StatusALL, StatusEnabled, StatusDisable, StatusDelete} + +// 验证码状态 +const ( + CodeStatusNotUsed = 1 // 未使用 + CodeStatusUsed = 2 // 已使用 +) + +// CodeStatusOptions 验证码状态选项 +var CodeStatusOptions = []*model.Option{ + dict.GenWarningOption(CodeStatusNotUsed, "未使用"), + dict.GenSuccessOption(CodeStatusUsed, "已使用"), +} + +const ( + BlacklistStatusDisable = 1 // 封禁中 + BlacklistStatusEnabled = 2 // 已解封 +) + +// BlacklistStatusOptions 黑名单拉黑状态选项 +var BlacklistStatusOptions = []*model.Option{ + dict.GenWarningOption(BlacklistStatusDisable, "封禁中"), + dict.GenSuccessOption(BlacklistStatusEnabled, "已解封"), +} diff --git a/server/internal/consts/upload.go b/server/internal/consts/upload.go new file mode 100644 index 0000000..b760381 --- /dev/null +++ b/server/internal/consts/upload.go @@ -0,0 +1,16 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 上传存储驱动 +const ( + UploadDriveLocal = "local" // 本地驱动 + UploadDriveUCloud = "ucloud" // ucloud对象存储 + UploadDriveCos = "cos" // 腾讯云cos + UploadDriveOss = "oss" // 阿里云oss + UploadDriveQiNiu = "qiniu" // 七牛云对象存储 + UploadDriveMinio = "minio" // minio对象存储 +) diff --git a/server/internal/consts/version.go b/server/internal/consts/version.go new file mode 100644 index 0000000..0c77457 --- /dev/null +++ b/server/internal/consts/version.go @@ -0,0 +1,11 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2025 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// VersionApp HotGo版本 +const ( + VersionApp = "2.18.9" +) diff --git a/server/internal/consts/wechat.go b/server/internal/consts/wechat.go new file mode 100644 index 0000000..54565fd --- /dev/null +++ b/server/internal/consts/wechat.go @@ -0,0 +1,18 @@ +// Package consts +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package consts + +// 授权类型 +const ( + WechatAuthorizeOpenId = "openId" // 设置openid + WechatAuthorizeBindLogin = "bindLogin" // 绑定微信登录 +) + +// 应用授权作用域 +const ( + WechatScopeBase = "snsapi_base" // 只获取openid,无需用户授权 + WechatScopeUserinfo = "snsapi_userinfo" // 获取用户信息,需要授权 +) diff --git a/server/internal/controller/admin/admin/cash.go b/server/internal/controller/admin/admin/cash.go new file mode 100644 index 0000000..124b034 --- /dev/null +++ b/server/internal/controller/admin/admin/cash.go @@ -0,0 +1,60 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/cash" + "hotgo/internal/library/contexts" + "hotgo/internal/model/input/adminin" + "hotgo/internal/service" +) + +var ( + Cash = cCash{} +) + +type cCash struct{} + +// View 获取指定信息 +func (c *cCash) View(ctx context.Context, req *cash.ViewReq) (res *cash.ViewRes, err error) { + data, err := service.AdminCash().View(ctx, &req.CashViewInp) + if err != nil { + return + } + + res = new(cash.ViewRes) + res.CashViewModel = data + return +} + +// List 查看列表 +func (c *cCash) List(ctx context.Context, req *cash.ListReq) (res *cash.ListRes, err error) { + list, totalCount, err := service.AdminCash().List(ctx, &req.CashListInp) + if err != nil { + return + } + + res = new(cash.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Apply 申请提现 +func (c *cCash) Apply(ctx context.Context, req *cash.ApplyReq) (res *cash.ApplyRes, err error) { + err = service.AdminCash().Apply(ctx, &adminin.CashApplyInp{ + Money: req.Money, + MemberId: contexts.GetUserId(ctx), + }) + return +} + +// Payment 提现打款处理 +func (c *cCash) Payment(ctx context.Context, req *cash.PaymentReq) (res *cash.PaymentRes, err error) { + err = service.AdminCash().Payment(ctx, &req.CashPaymentInp) + return +} diff --git a/server/internal/controller/admin/admin/credits_log.go b/server/internal/controller/admin/admin/credits_log.go new file mode 100644 index 0000000..003fc82 --- /dev/null +++ b/server/internal/controller/admin/admin/credits_log.go @@ -0,0 +1,39 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// @AutoGenerate Version 2.5.3 +// @AutoGenerate Date 2023-04-15 15:59:58 +package admin + +import ( + "context" + "hotgo/api/admin/creditslog" + "hotgo/internal/service" +) + +var ( + CreditsLog = cCreditsLog{} +) + +type cCreditsLog struct{} + +// List 查看资产变动列表 +func (c *cCreditsLog) List(ctx context.Context, req *creditslog.ListReq) (res *creditslog.ListRes, err error) { + list, totalCount, err := service.AdminCreditsLog().List(ctx, &req.CreditsLogListInp) + if err != nil { + return + } + + res = new(creditslog.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Export 导出资产变动列表 +func (c *cCreditsLog) Export(ctx context.Context, req *creditslog.ExportReq) (res *creditslog.ExportRes, err error) { + err = service.AdminCreditsLog().Export(ctx, &req.CreditsLogListInp) + return +} diff --git a/server/internal/controller/admin/admin/dept.go b/server/internal/controller/admin/admin/dept.go new file mode 100644 index 0000000..5730ce6 --- /dev/null +++ b/server/internal/controller/admin/admin/dept.go @@ -0,0 +1,75 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/dept" + "hotgo/internal/service" +) + +var ( + Dept = cDept{} +) + +type cDept struct{} + +// Delete 删除 +func (c *cDept) Delete(ctx context.Context, req *dept.DeleteReq) (res *dept.DeleteRes, err error) { + err = service.AdminDept().Delete(ctx, &req.DeptDeleteInp) + return +} + +// Edit 更新 +func (c *cDept) Edit(ctx context.Context, req *dept.EditReq) (res *dept.EditRes, err error) { + err = service.AdminDept().Edit(ctx, &req.DeptEditInp) + return +} + +// MaxSort 最大排序 +func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (res *dept.MaxSortRes, err error) { + res = new(dept.MaxSortRes) + res.DeptMaxSortModel, err = service.AdminDept().MaxSort(ctx, &req.DeptMaxSortInp) + return +} + +// View 获取指定信息 +func (c *cDept) View(ctx context.Context, req *dept.ViewReq) (res *dept.ViewRes, err error) { + res = new(dept.ViewRes) + res.DeptViewModel, err = service.AdminDept().View(ctx, &req.DeptViewInp) + return +} + +// List 查看列表 +func (c *cDept) List(ctx context.Context, req *dept.ListReq) (res *dept.ListRes, err error) { + data, err := service.AdminDept().List(ctx, &req.DeptListInp) + if err != nil || data == nil { + return + } + + res = (*dept.ListRes)(&data) + return +} + +// Option 获取部门选项树 +func (c *cDept) Option(ctx context.Context, req *dept.OptionReq) (res *dept.OptionRes, err error) { + list, totalCount, err := service.AdminDept().Option(ctx, &req.DeptOptionInp) + if err != nil { + return + } + + res = new(dept.OptionRes) + res.DeptOptionModel = list + res.PageRes.Pack(req, totalCount) + return +} + +// TreeOption 获取部门管理关系树选项 +func (c *cDept) TreeOption(ctx context.Context, req *dept.TreeOptionReq) (res *dept.TreeOptionRes, err error) { + data, err := service.AdminDept().TreeOption(ctx) + res = (*dept.TreeOptionRes)(&data) + return +} diff --git a/server/internal/controller/admin/admin/member.go b/server/internal/controller/admin/admin/member.go new file mode 100644 index 0000000..6724e58 --- /dev/null +++ b/server/internal/controller/admin/admin/member.go @@ -0,0 +1,145 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "hotgo/api/admin/member" + "hotgo/internal/library/contexts" + "hotgo/internal/model/input/adminin" + "hotgo/internal/service" +) + +var ( + Member = cMember{} +) + +type cMember struct{} + +// UpdateCash 修改代理商提现信息 +func (c *cMember) UpdateCash(ctx context.Context, req *member.UpdateCashReq) (res *member.UpdateCashRes, err error) { + err = service.AdminMember().UpdateCash(ctx, &req.MemberUpdateCashInp) + return +} + +// UpdateEmail 换绑邮箱 +func (c *cMember) UpdateEmail(ctx context.Context, req *member.UpdateEmailReq) (res *member.UpdateEmailRes, err error) { + err = service.AdminMember().UpdateEmail(ctx, &req.MemberUpdateEmailInp) + return +} + +// UpdateMobile 换绑手机号 +func (c *cMember) UpdateMobile(ctx context.Context, req *member.UpdateMobileReq) (res *member.UpdateMobileRes, err error) { + err = service.AdminMember().UpdateMobile(ctx, &req.MemberUpdateMobileInp) + return +} + +// UpdateProfile 更新用户资料 +func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileReq) (res *member.UpdateProfileRes, err error) { + err = service.AdminMember().UpdateProfile(ctx, &req.MemberUpdateProfileInp) + return +} + +// UpdatePwd 修改登录密码 +func (c *cMember) UpdatePwd(ctx context.Context, req *member.UpdatePwdReq) (res *member.UpdatePwdRes, err error) { + var memberId = contexts.Get(ctx).User.Id + if memberId <= 0 { + err = gerror.New("获取用户信息失败!") + return + } + + err = service.AdminMember().UpdatePwd(ctx, &adminin.MemberUpdatePwdInp{ + Id: memberId, + OldPassword: req.OldPassword, + NewPassword: req.NewPassword, + }) + return +} + +// ResetPwd 重置密码 +func (c *cMember) ResetPwd(ctx context.Context, req *member.ResetPwdReq) (res *member.ResetPwdRes, err error) { + err = service.AdminMember().ResetPwd(ctx, &req.MemberResetPwdInp) + return +} + +// MemberInfo 登录用户信息 +func (c *cMember) MemberInfo(ctx context.Context, _ *member.InfoReq) (res *member.InfoRes, err error) { + data, err := service.AdminMember().LoginMemberInfo(ctx) + if err != nil { + return + } + + res = new(member.InfoRes) + res.LoginMemberInfoModel = data + return +} + +// Delete 删除用户 +func (c *cMember) Delete(ctx context.Context, req *member.DeleteReq) (res *member.DeleteRes, err error) { + err = service.AdminMember().Delete(ctx, &req.MemberDeleteInp) + return +} + +// Edit 修改/新增用户 +func (c *cMember) Edit(ctx context.Context, req *member.EditReq) (res *member.EditRes, err error) { + err = service.AdminMember().Edit(ctx, &req.MemberEditInp) + return +} + +// View 获取指定用户信息 +func (c *cMember) View(ctx context.Context, req *member.ViewReq) (res *member.ViewRes, err error) { + data, err := service.AdminMember().View(ctx, &req.MemberViewInp) + if err != nil { + return + } + + res = new(member.ViewRes) + res.MemberViewModel = data + return +} + +// List 查看用户列表 +func (c *cMember) List(ctx context.Context, req *member.ListReq) (res *member.ListRes, err error) { + list, totalCount, err := service.AdminMember().List(ctx, &req.MemberListInp) + if err != nil { + return + } + + res = new(member.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Status 更新用户状态 +func (c *cMember) Status(ctx context.Context, req *member.StatusReq) (res *member.StatusRes, err error) { + err = service.AdminMember().Status(ctx, &req.MemberStatusInp) + return +} + +// Select 获取可选的后台用户选项 +func (c *cMember) Select(ctx context.Context, req *member.SelectReq) (res *member.SelectRes, err error) { + data, err := service.AdminMember().Select(ctx, &req.MemberSelectInp) + if err != nil { + return + } + + res = (*member.SelectRes)(&data) + return +} + +// AddBalance 增加用户余额 +func (c *cMember) AddBalance(ctx context.Context, req *member.AddBalanceReq) (res *member.AddBalanceRes, err error) { + err = service.AdminMember().AddBalance(ctx, &req.MemberAddBalanceInp) + return +} + +// AddIntegral 增加用户积分 +func (c *cMember) AddIntegral(ctx context.Context, req *member.AddIntegralReq) (res *member.AddIntegralRes, err error) { + err = service.AdminMember().AddIntegral(ctx, &req.MemberAddIntegralInp) + return +} diff --git a/server/internal/controller/admin/admin/menu.go b/server/internal/controller/admin/admin/menu.go new file mode 100644 index 0000000..3bd2de5 --- /dev/null +++ b/server/internal/controller/admin/admin/menu.go @@ -0,0 +1,37 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/menu" + "hotgo/internal/service" +) + +// Menu 菜单 +var ( + Menu = cMenu{} +) + +type cMenu struct{} + +// Delete 删除 +func (c *cMenu) Delete(ctx context.Context, req *menu.DeleteReq) (res *menu.DeleteRes, err error) { + err = service.AdminMenu().Delete(ctx, &req.MenuDeleteInp) + return +} + +// Edit 更新 +func (c *cMenu) Edit(ctx context.Context, req *menu.EditReq) (res *menu.EditRes, err error) { + err = service.AdminMenu().Edit(ctx, &req.MenuEditInp) + return +} + +// List 获取列表 +func (c *cMenu) List(ctx context.Context, req *menu.ListReq) (res menu.ListRes, err error) { + res.MenuListModel, err = service.AdminMenu().List(ctx, &req.MenuListInp) + return +} diff --git a/server/internal/controller/admin/admin/monitor.go b/server/internal/controller/admin/admin/monitor.go new file mode 100644 index 0000000..2a8a936 --- /dev/null +++ b/server/internal/controller/admin/admin/monitor.go @@ -0,0 +1,243 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gstr" + "hotgo/api/admin/monitor" + "hotgo/internal/consts" + "hotgo/internal/dao" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/form" + "hotgo/internal/service" + "hotgo/internal/websocket" + "hotgo/utility/simple" + "hotgo/utility/useragent" + "sort" +) + +// Monitor 监控 +var Monitor = cMonitor{ + wsManager: websocket.Manager(), +} + +type cMonitor struct { + wsManager *websocket.ClientManager +} + +// UserOffline 下线用户 +func (c *cMonitor) UserOffline(ctx context.Context, req *monitor.UserOfflineReq) (res *monitor.UserOfflineRes, err error) { + client := c.wsManager.GetClient(req.Id) + if client == nil { + err = gerror.New("客户端已离线") + return + } + + simple.SafeGo(ctx, func(ctx context.Context) { + websocket.SendSuccess(client, "kick") + websocket.Close(client) + }) + return +} + +// UserOnlineList 获取用户在线列表 +func (c *cMonitor) UserOnlineList(ctx context.Context, req *monitor.UserOnlineListReq) (res *monitor.UserOnlineListRes, err error) { + var ( + clients []*monitor.UserOnlineModel + i int + ) + + if c.wsManager.GetClientsLen() == 0 { + return + } + + for conn := range c.wsManager.GetClients() { + if conn.SendClose || conn.User == nil { + continue + } + + if req.UserId > 0 && req.UserId != conn.User.Id { + continue + } + + if req.Username != "" && req.Username != conn.User.Username { + continue + } + + if req.IP != "" && !gstr.Contains(conn.IP, req.IP) { + continue + } + + if len(req.FirstTime) == 2 && (conn.User.LoginAt.Before(req.FirstTime[0]) || conn.User.LoginAt.After(req.FirstTime[1])) { + continue + } + + clients = append(clients, &monitor.UserOnlineModel{ + ID: conn.ID, + IP: conn.IP, + Os: useragent.GetOs(conn.UserAgent), + Browser: useragent.GetBrowser(conn.UserAgent), + FirstTime: conn.User.LoginAt.Unix(), + HeartbeatTime: conn.HeartbeatTime, + App: conn.User.App, + UserId: conn.User.Id, + Username: conn.User.Username, + Avatar: conn.User.Avatar, + }) + } + + res = new(monitor.UserOnlineListRes) + res.PageRes.Pack(req, len(clients)) + + sort.Slice(clients, func(i, j int) bool { + if clients[i].FirstTime == clients[j].FirstTime { + return clients[i].ID < clients[j].ID + } + return clients[i].FirstTime < clients[j].FirstTime + }) + + _, perPage, offset := form.CalPage(req.Page, req.PerPage) + for k, v := range clients { + if k >= offset && i <= perPage { + if simple.IsDemo(ctx) { + v.IP = consts.DemoTips + } + res.List = append(res.List, v) + i++ + } + } + return +} + +// NetOnlineList 获取服务在线列表 +func (c *cMonitor) NetOnlineList(ctx context.Context, req *monitor.NetOnlineListReq) (res *monitor.NetOnlineListRes, err error) { + var ( + clients []*monitor.NetOnlineModel + i int + cols = dao.SysServeLicense.Columns() + serv = service.TCPServer().Instance() + models *entity.SysServeLicense + ) + + conns := serv.GetClients() + if len(conns) == 0 { + res = new(monitor.NetOnlineListRes) + res.PageRes.Pack(req, 0) + return + } + + for _, conn := range conns { + v := &monitor.NetOnlineModel{ + AuthMeta: conn.Auth, + Id: conn.CID, + IsAuth: conn.Auth != nil, + Addr: conn.RemoteAddr().String(), + Port: gstr.SubStrFromEx(conn.LocalAddr().String(), `:`), + FirstTime: conn.FirstTime, + HeartbeatTime: conn.Heartbeat, + Proto: "TCP", + } + + if v.IsAuth { + if err = dao.SysServeLicense.Ctx(ctx).Where(cols.Appid, conn.Auth.AppId).Where(cols.Group, conn.Auth.Group).Scan(&models); err != nil { + return + } + + if models == nil { + continue + } + + v.LicenseId = models.Id + v.LicenseName = models.Name + v.LoginTimes = models.LoginTimes + v.Online = serv.GetAppIdOnline(models.Appid) + v.OnlineLimit = models.OnlineLimit + } + + if req.Addr != "" && !gstr.Contains(v.Addr, req.Addr) { + continue + } + + if req.Name != "" && !gstr.Contains(v.Name, req.Name) { + continue + } + + if req.Group != "" && (!v.IsAuth || v.Group != req.Group) { + continue + } + + if req.AppId != "" && (!v.IsAuth || v.AppId != req.AppId) { + continue + } + + ft := gtime.New(conn.FirstTime) + if len(req.FirstTime) == 2 && (ft.Before(req.FirstTime[0]) || ft.After(req.FirstTime[1])) { + continue + } + clients = append(clients, v) + } + + res = new(monitor.NetOnlineListRes) + res.PageRes.Pack(req, len(clients)) + + sort.Slice(clients, func(i, j int) bool { + return clients[i].Id > clients[j].Id + }) + + _, perPage, offset := form.CalPage(req.Page, req.PerPage) + for k, v := range clients { + if k >= offset && i <= perPage { + res.List = append(res.List, v) + i++ + } + } + return +} + +// NetOption 获取服务选项 +func (c *cMonitor) NetOption(ctx context.Context, req *monitor.NetOptionReq) (res *monitor.NetOptionRes, err error) { + res = new(monitor.NetOptionRes) + + for _, v := range service.TCPServer().Instance().GetRoutes() { + // 无需勾选的路由 + disabled := false + if v.Id == "ServerLoginReq" || v.Id == "ServerHeartbeatReq" { + disabled = true + } + + res.Routes = append(res.Routes, &monitor.RouteSelect{ + Value: v.Id, + Label: v.Id, + Disabled: disabled, + IsRPC: v.IsRPC, + }) + } + + sort.Slice(res.Routes, func(i, j int) bool { + if res.Routes[i].IsRPC && !res.Routes[j].IsRPC { + return true + } else if !res.Routes[i].IsRPC && res.Routes[j].IsRPC { + return false + } + return res.Routes[i].Label < res.Routes[j].Label + }) + return +} + +// NetOffline 下线服务 +func (c *cMonitor) NetOffline(ctx context.Context, req *monitor.NetOfflineReq) (res *monitor.NetOfflineRes, err error) { + conn := service.TCPServer().Instance().GetClientById(req.Id) + if conn == nil { + err = gerror.New("客户端不在线") + return + } + // 关闭连接 + conn.Close() + return +} diff --git a/server/internal/controller/admin/admin/notice.go b/server/internal/controller/admin/admin/notice.go new file mode 100644 index 0000000..068e71c --- /dev/null +++ b/server/internal/controller/admin/admin/notice.go @@ -0,0 +1,127 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/notice" + "hotgo/internal/consts" + "hotgo/internal/service" +) + +var ( + Notice = cNotice{} +) + +type cNotice struct{} + +// Delete 删除 +func (c *cNotice) Delete(ctx context.Context, req *notice.DeleteReq) (res *notice.DeleteRes, err error) { + err = service.AdminNotice().Delete(ctx, &req.NoticeDeleteInp) + return +} + +// Edit 更新 +func (c *cNotice) Edit(ctx context.Context, req *notice.EditReq) (res *notice.EditRes, err error) { + err = service.AdminNotice().Edit(ctx, &req.NoticeEditInp) + return +} + +// MaxSort 最大排序 +func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (res *notice.MaxSortRes, err error) { + res = new(notice.MaxSortRes) + res.NoticeMaxSortModel, err = service.AdminNotice().MaxSort(ctx, &req.NoticeMaxSortInp) + return +} + +// View 获取指定信息 +func (c *cNotice) View(ctx context.Context, req *notice.ViewReq) (res *notice.ViewRes, err error) { + data, err := service.AdminNotice().View(ctx, &req.NoticeViewInp) + if err != nil { + return + } + + res = new(notice.ViewRes) + res.NoticeViewModel = data + return +} + +// List 查看列表 +func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (res *notice.ListRes, err error) { + list, totalCount, err := service.AdminNotice().List(ctx, &req.NoticeListInp) + if err != nil { + return nil, err + } + + res = new(notice.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Status 更新状态 +func (c *cNotice) Status(ctx context.Context, req *notice.StatusReq) (res *notice.StatusRes, err error) { + err = service.AdminNotice().Status(ctx, &req.NoticeStatusInp) + return +} + +// Notify 更新通知 +func (c *cNotice) Notify(ctx context.Context, req *notice.EditNotifyReq) (res *notice.EditNotifyRes, err error) { + req.Type = consts.NoticeTypeNotify + err = service.AdminNotice().Edit(ctx, &req.NoticeEditInp) + return +} + +// Notice 更新公告 +func (c *cNotice) Notice(ctx context.Context, req *notice.EditNoticeReq) (res *notice.EditNoticeRes, err error) { + req.Type = consts.NoticeTypeNotice + err = service.AdminNotice().Edit(ctx, &req.NoticeEditInp) + return +} + +// Letter 更新私信 +func (c *cNotice) Letter(ctx context.Context, req *notice.EditLetterReq) (res *notice.EditLetterRes, err error) { + req.Type = consts.NoticeTypeLetter + err = service.AdminNotice().Edit(ctx, &req.NoticeEditInp) + return +} + +// UpRead 更新已读 +func (c *cNotice) UpRead(ctx context.Context, req *notice.UpReadReq) (res *notice.UpReadRes, err error) { + err = service.AdminNotice().UpRead(ctx, &req.NoticeUpReadInp) + return +} + +// PullMessages 拉取未读消息列表 +func (c *cNotice) PullMessages(ctx context.Context, req *notice.PullMessagesReq) (res *notice.PullMessagesRes, err error) { + data, err := service.AdminNotice().PullMessages(ctx, &req.PullMessagesInp) + 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) { + err = service.AdminNotice().ReadAll(ctx, &req.NoticeReadAllInp) + return +} + +// MessageList 我的消息列表 +func (c *cNotice) MessageList(ctx context.Context, req *notice.MessageListReq) (res *notice.MessageListRes, err error) { + list, totalCount, err := service.AdminNotice().MessageList(ctx, &req.NoticeMessageListInp) + if err != nil { + return + } + + res = new(notice.MessageListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} diff --git a/server/internal/controller/admin/admin/order.go b/server/internal/controller/admin/admin/order.go new file mode 100644 index 0000000..5f6e2de --- /dev/null +++ b/server/internal/controller/admin/admin/order.go @@ -0,0 +1,91 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/order" + "hotgo/internal/service" +) + +var ( + Order = cOrder{} +) + +type cOrder struct{} + +// AcceptRefund 受理申请退款 +func (c *cOrder) AcceptRefund(ctx context.Context, req *order.AcceptRefundReq) (res *order.AcceptRefundRes, err error) { + err = service.AdminOrder().AcceptRefund(ctx, &req.OrderAcceptRefundInp) + return +} + +// ApplyRefund 申请退款 +func (c *cOrder) ApplyRefund(ctx context.Context, req *order.ApplyRefundReq) (res *order.ApplyRefundRes, err error) { + err = service.AdminOrder().ApplyRefund(ctx, &req.OrderApplyRefundInp) + return +} + +// Create 创建充值订单 +func (c *cOrder) Create(ctx context.Context, req *order.CreateReq) (res *order.CreateRes, err error) { + data, err := service.AdminOrder().Create(ctx, &req.OrderCreateInp) + if err != nil { + return + } + + res = new(order.CreateRes) + res.OrderCreateModel = data + return +} + +// List 查看充值订单列表 +func (c *cOrder) List(ctx context.Context, req *order.ListReq) (res *order.ListRes, err error) { + list, totalCount, err := service.AdminOrder().List(ctx, &req.OrderListInp) + if err != nil { + return + } + + res = new(order.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Export 导出充值订单列表 +func (c *cOrder) Export(ctx context.Context, req *order.ExportReq) (res *order.ExportRes, err error) { + err = service.AdminOrder().Export(ctx, &req.OrderListInp) + return +} + +// Edit 更新充值订单 +func (c *cOrder) Edit(ctx context.Context, req *order.EditReq) (res *order.EditRes, err error) { + err = service.AdminOrder().Edit(ctx, &req.OrderEditInp) + return +} + +// View 获取指定充值订单信息 +func (c *cOrder) View(ctx context.Context, req *order.ViewReq) (res *order.ViewRes, err error) { + data, err := service.AdminOrder().View(ctx, &req.OrderViewInp) + if err != nil { + return + } + + res = new(order.ViewRes) + res.OrderViewModel = data + return +} + +// Delete 删除充值订单 +func (c *cOrder) Delete(ctx context.Context, req *order.DeleteReq) (res *order.DeleteRes, err error) { + err = service.AdminOrder().Delete(ctx, &req.OrderDeleteInp) + return +} + +// Status 更新充值订单状态 +func (c *cOrder) Status(ctx context.Context, req *order.StatusReq) (res *order.StatusRes, err error) { + err = service.AdminOrder().Status(ctx, &req.OrderStatusInp) + return +} diff --git a/server/internal/controller/admin/admin/post.go b/server/internal/controller/admin/admin/post.go new file mode 100644 index 0000000..2c2faf8 --- /dev/null +++ b/server/internal/controller/admin/admin/post.go @@ -0,0 +1,67 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/post" + "hotgo/internal/service" +) + +// Post 岗位 +var Post = cPost{} + +type cPost struct{} + +// Delete 删除 +func (c *cPost) Delete(ctx context.Context, req *post.DeleteReq) (res *post.DeleteRes, err error) { + err = service.AdminPost().Delete(ctx, &req.PostDeleteInp) + return +} + +// Edit 修改/新增 +func (c *cPost) Edit(ctx context.Context, req *post.EditReq) (res *post.EditRes, err error) { + err = service.AdminPost().Edit(ctx, &req.PostEditInp) + return +} + +// MaxSort 最大排序 +func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (res *post.MaxSortRes, err error) { + res = new(post.MaxSortRes) + res.PostMaxSortModel, err = service.AdminPost().MaxSort(ctx, &req.PostMaxSortInp) + return +} + +// View 获取指定信息 +func (c *cPost) View(ctx context.Context, req *post.ViewReq) (res *post.ViewRes, err error) { + data, err := service.AdminPost().View(ctx, &req.PostViewInp) + if err != nil { + return + } + + res = new(post.ViewRes) + res.PostViewModel = data + return +} + +// List 获取列表 +func (c *cPost) List(ctx context.Context, req *post.ListReq) (res *post.ListRes, err error) { + list, totalCount, err := service.AdminPost().List(ctx, &req.PostListInp) + if err != nil { + return + } + + res = new(post.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} + +// Status 更新状态 +func (c *cPost) Status(ctx context.Context, req *post.StatusReq) (res *post.StatusRes, err error) { + err = service.AdminPost().Status(ctx, &req.PostStatusInp) + return +} diff --git a/server/internal/controller/admin/admin/role.go b/server/internal/controller/admin/admin/role.go new file mode 100644 index 0000000..92e626c --- /dev/null +++ b/server/internal/controller/admin/admin/role.go @@ -0,0 +1,81 @@ +// Package admin +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package admin + +import ( + "context" + "hotgo/api/admin/role" + "hotgo/internal/consts" + "hotgo/internal/library/contexts" + "hotgo/internal/service" +) + +var ( + Role = cRole{} +) + +type cRole struct{} + +// List 获取列表 +func (c *cRole) List(ctx context.Context, req *role.ListReq) (res *role.ListRes, err error) { + list, totalCount, err := service.AdminRole().List(ctx, &req.RoleListInp) + if err != nil { + return + } + + res = new(role.ListRes) + res.RoleListModel = list + res.PageRes.Pack(req, totalCount) + return +} + +// Edit 修改角色 +func (c *cRole) Edit(ctx context.Context, req *role.EditReq) (res *role.EditRes, err error) { + err = service.AdminRole().Edit(ctx, &req.RoleEditInp) + return +} + +// Delete 删除 +func (c *cRole) Delete(ctx context.Context, req *role.DeleteReq) (res *role.DeleteRes, err error) { + err = service.AdminRole().Delete(ctx, &req.RoleDeleteInp) + return +} + +// Dynamic 动态路由 +func (c *cRole) Dynamic(ctx context.Context, _ *role.DynamicReq) (res *role.DynamicRes, err error) { + return service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx)) +} + +// GetPermissions 获取指定角色权限 +func (c *cRole) GetPermissions(ctx context.Context, req *role.GetPermissionsReq) (res *role.GetPermissionsRes, err error) { + data, err := service.AdminRole().GetPermissions(ctx, &req.GetPermissionsInp) + if err != nil { + return + } + + res = new(role.GetPermissionsRes) + res.GetPermissionsModel = data + return +} + +// UpdatePermissions 修改角色菜单权限 +func (c *cRole) UpdatePermissions(ctx context.Context, req *role.UpdatePermissionsReq) (res *role.UpdatePermissionsRes, err error) { + err = service.AdminRole().UpdatePermissions(ctx, &req.UpdatePermissionsInp) + return +} + +// DataScopeSelect 获取数据权限选项 +func (c *cRole) DataScopeSelect(_ context.Context, _ *role.DataScopeSelectReq) (res *role.DataScopeSelectRes, err error) { + res = new(role.DataScopeSelectRes) + res.List = consts.DataScopeSelect + return +} + +// DataScopeEdit 获取数据权限选项 +func (c *cRole) DataScopeEdit(ctx context.Context, req *role.DataScopeEditReq) (res *role.DataScopeEditRes, err error) { + err = service.AdminRole().DataScopeEdit(ctx, &req.DataScopeEditInp) + return +} diff --git a/server/internal/controller/admin/common/console.go b/server/internal/controller/admin/common/console.go new file mode 100644 index 0000000..9b2eaf6 --- /dev/null +++ b/server/internal/controller/admin/common/console.go @@ -0,0 +1,42 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "context" + "hotgo/api/admin/common" +) + +var Console = cConsole{} + +type cConsole struct{} + +// Stat 综合数据统计 +func (c *cConsole) Stat(_ context.Context, _ *common.ConsoleStatReq) (res *common.ConsoleStatRes, err error) { + res = new(common.ConsoleStatRes) + + // 此处均为模拟数据,可以根据实际业务情况替换成真实数据 + + res.Visits.DayVisits = 12010 + res.Visits.Rise = 13501 + res.Visits.Decline = 10502 + res.Visits.Amount = 10403 + + res.Saleroom.WeekSaleroom = 20501 + res.Saleroom.Amount = 21002 + res.Saleroom.Degree = 83.66 + + res.OrderLarge.WeekLarge = 39901 + res.OrderLarge.Rise = 31012 + res.OrderLarge.Decline = 30603 + res.OrderLarge.Amount = 36084 + + res.Volume.WeekLarge = 40021 + res.Volume.Rise = 40202 + res.Volume.Decline = 45003 + res.Volume.Amount = 49004 + return +} diff --git a/server/internal/controller/admin/common/ems.go b/server/internal/controller/admin/common/ems.go new file mode 100644 index 0000000..5c70c4e --- /dev/null +++ b/server/internal/controller/admin/common/ems.go @@ -0,0 +1,75 @@ +// Package common +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2023 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +package common + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "hotgo/api/admin/common" + "hotgo/internal/consts" + "hotgo/internal/dao" + "hotgo/internal/library/contexts" + "hotgo/internal/model/entity" + "hotgo/internal/model/input/sysin" + "hotgo/internal/service" +) + +var Ems = new(cEms) + +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: ` + + +
+ +
+ +