mirror of
				https://github.com/bufanyun/hotgo.git
				synced 2025-11-04 16:23:43 +08:00 
			
		
		
		
	发布v2.17.8版本,更新内容请查看:https://github.com/bufanyun/hotgo/blob/v2.0/docs/guide-zh-CN/start-update-log.md
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
				
			|||||||
# HotGo-V2
 | 
					# HotGo-V2
 | 
				
			||||||
<div align="center">
 | 
					<div align="center">
 | 
				
			||||||
	<img width="140px" src="https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png">
 | 
						<img width="140px" src="https://gmycos.facms.cn/hotgo/logo.sig.png">
 | 
				
			||||||
    <p>
 | 
					    <p>
 | 
				
			||||||
        <h1>HotGo V2</h1>
 | 
					        <h1>HotGo V2</h1>
 | 
				
			||||||
    </p>
 | 
					    </p>
 | 
				
			||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
	        <img src="https://img.shields.io/badge/vue.js-vue3.4-green" alt="vue">
 | 
						        <img src="https://img.shields.io/badge/vue.js-vue3.4-green" alt="vue">
 | 
				
			||||||
	    </a>
 | 
						    </a>
 | 
				
			||||||
	    <a href="https://www.naiveui.com" target="_blank">
 | 
						    <a href="https://www.naiveui.com" target="_blank">
 | 
				
			||||||
	        <img src="https://img.shields.io/badge/naiveui-%3E2.41.0-blue" alt="naiveui">
 | 
						        <img src="https://img.shields.io/badge/naiveui-%3E2.42.0-blue" alt="naiveui">
 | 
				
			||||||
	    </a>
 | 
						    </a>
 | 
				
			||||||
		<a href="https://www.tslang.cn/" target="_blank">
 | 
							<a href="https://www.tslang.cn/" target="_blank">
 | 
				
			||||||
	        <img src="https://img.shields.io/badge/typescript-%3E4.0.0-blue" alt="typescript">
 | 
						        <img src="https://img.shields.io/badge/typescript-%3E4.0.0-blue" alt="typescript">
 | 
				
			||||||
@@ -124,8 +124,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 交流QQ群
 | 
					## 交流QQ群
 | 
				
			||||||
交流群①:190966648  <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=mJafkvme3VNyiQlCFIFNRtY8Xlr7pj9U&jump_from=webapi&authKey=jL10vIESr+vO8wpxwyd6DlChzkrbHpzN9uhAsIHgAinL/Vvd+nvuRyilf2UqUlCy"><img border="0" src="https://bufanyun.cn-bj.ufileos.com/hotgo/group.png" alt="HotGo框架交流1群" title="HotGo框架交流1群"></a>
 | 
					交流群①:190966648  <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=mJafkvme3VNyiQlCFIFNRtY8Xlr7pj9U&jump_from=webapi&authKey=jL10vIESr+vO8wpxwyd6DlChzkrbHpzN9uhAsIHgAinL/Vvd+nvuRyilf2UqUlCy"><img border="0" src="https://gmycos.facms.cn/hotgo/group.png" alt="HotGo框架交流1群" title="HotGo框架交流1群"></a>
 | 
				
			||||||
> <img src="https://bufanyun.cn-bj.ufileos.com/hotgo/hotgo1qun.png" width="400px"/>
 | 
					> <img src="https://gmycos.facms.cn/hotgo/hotgo1qun.png" width="400px"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 商用说明
 | 
					## 商用说明
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.0.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 163 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 283 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 255 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/guide-zh-CN/images/issue/1.4.3.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 294 KiB  | 
@@ -78,7 +78,7 @@ pnpm run build 或 npm run build
 | 
				
			|||||||
### Nginx配置
 | 
					### Nginx配置
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
      # websocket
 | 
					      # websocket
 | 
				
			||||||
      location ^~ /socket  {
 | 
					      location = /socket  {
 | 
				
			||||||
  			proxy_pass http://127.0.0.1:8000/socket;
 | 
					  			proxy_pass http://127.0.0.1:8000/socket;
 | 
				
			||||||
  			proxy_set_header X-Real-IP $remote_addr;
 | 
					  			proxy_set_header X-Real-IP $remote_addr;
 | 
				
			||||||
  			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
					  			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
				
			||||||
@@ -98,7 +98,9 @@ pnpm run build 或 npm run build
 | 
				
			|||||||
          proxy_set_header  X-Real-IP $remote_addr;
 | 
					          proxy_set_header  X-Real-IP $remote_addr;
 | 
				
			||||||
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
					          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
				
			||||||
          proxy_set_header X-Forwarded-Proto $scheme;
 | 
					          proxy_set_header X-Forwarded-Proto $scheme;
 | 
				
			||||||
          proxy_pass http://127.0.0.1:8000/; # 设置代理服务器的协议和地址
 | 
					          proxy_pass http://127.0.0.1:8000/;
 | 
				
			||||||
 | 
					          proxy_redirect off;
 | 
				
			||||||
 | 
					          proxy_buffering off;
 | 
				
			||||||
          proxy_http_version 1.1;
 | 
					          proxy_http_version 1.1;
 | 
				
			||||||
          proxy_set_header Upgrade $http_upgrade;
 | 
					          proxy_set_header Upgrade $http_upgrade;
 | 
				
			||||||
          proxy_set_header Connection upgrade;
 | 
					          proxy_set_header Connection upgrade;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#### 1、安装数据库出现 json 报错不支持
 | 
					#### 1、安装数据库出现 json 报错不支持
 | 
				
			||||||
 | 
					
 | 
				
			||||||
请安装 mysql5.7 及以上版本的数据库
 | 
					请安装 mysql5.7 及以上版本的数据库。如果你使用的是mariadb请确认版本号,mariadb从 10.2 版本开始支持 json 数据类型。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,7 +50,31 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
系统运行目录下配置hack/config.yaml文件。如果是生产环境运行,并且不需要开发工具相关功能,可以将`manifest/config/config.yaml`配置文件中的`system.mode`值改为`product`,这样启动时不会加载开发工具相关功能
 | 
					系统运行目录下配置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中配置的菜单权限,保存即可
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 四、前端相关
 | 
					### 四、前端相关
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,20 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
> 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整
 | 
					> 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 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
 | 
					### v2.16.10
 | 
				
			||||||
updated 2025.3.22
 | 
					updated 2025.3.22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -176,7 +176,7 @@ CREATE TABLE `hg_test_category` (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
1.3 插入测试数据
 | 
					1.3 插入测试数据
 | 
				
			||||||
```mysql
 | 
					```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, '测试标题', '描述', '<h2><strong>不知道写点啥!</strong></h2><p><br></p><iframe class=\"ql-video\" frameborder=\"0\" allowfullscreen=\"true\" src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\"></iframe><p><br></p><p><img src=\"http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2023-02-09/cqdq9iuv0phsg8patk.png\"></p>', 'https://bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png', 'http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx', 110102, 1, 10, 1, 0, 1, '2022-12-15 19:30:14', '2023-02-23 13:55:32', NULL);
 | 
					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, '测试标题', '描述', '<h2><strong>不知道写点啥!</strong></h2><p><br></p><iframe class=\"ql-video\" frameborder=\"0\" allowfullscreen=\"true\" src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\"></iframe><p><br></p><p><img src=\"https://gmycos.facms.cn/hotgo/attachment/2023-02-09/cqdq9iuv0phsg8patk.png\"></p>', 'https://gmycos.facms.cn/hotgo/logo.sig.png', 'https://gmycos.facms.cn/hotgo/attachment/2022-12-30/cpf1x44idoycrtajf2.xlsx', 110102, 1, 10, 1, 0, 1, '2022-12-15 19:30:14', '2023-02-23 13:55:32', NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,4 +57,5 @@ var HTTPHandlerTimeOptions = []*model.Option{
 | 
				
			|||||||
var HTTPApiCodeOptions = []*model.Option{
 | 
					var HTTPApiCodeOptions = []*model.Option{
 | 
				
			||||||
	dict.GenSuccessOption(gcode.CodeOK.Code(), fmt.Sprintf("%v %v", gcode.CodeOK.Code(), "成功")),
 | 
						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.CodeNil.Code(), fmt.Sprintf("%v %v", gcode.CodeNil.Code(), "失败")),
 | 
				
			||||||
 | 
						dict.GenWarningOption(gcode.CodeSecurityReason.Code(), fmt.Sprintf("%v %v", gcode.CodeSecurityReason.Code(), "无访问权限")),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,5 +7,5 @@ package consts
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// VersionApp HotGo版本
 | 
					// VersionApp HotGo版本
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	VersionApp = "2.16.10"
 | 
						VersionApp = "2.17.8"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,9 +46,13 @@ func Sorter(in ISorter) func(m *gdb.Model) *gdb.Model {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				var sorter2 []*form.Sorter
 | 
									var sorter2 []*form.Sorter
 | 
				
			||||||
				for k, sorter := range sorters {
 | 
									for k, sorter := range sorters {
 | 
				
			||||||
					if gstr.HasPrefix(sorter.ColumnKey, as) {
 | 
										as2 := as
 | 
				
			||||||
 | 
										if gstr.Contains(sorter.ColumnKey, `.`) {
 | 
				
			||||||
 | 
											as2 += "."
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if gstr.HasPrefix(sorter.ColumnKey, as2) {
 | 
				
			||||||
						sorter2 = append(sorter2, &form.Sorter{
 | 
											sorter2 = append(sorter2, &form.Sorter{
 | 
				
			||||||
							ColumnKey: gstr.Replace(sorter.ColumnKey, as, ""),
 | 
												ColumnKey: gstr.Replace(sorter.ColumnKey, as2, ""),
 | 
				
			||||||
							Order:     sorter.Order,
 | 
												Order:     sorter.Order,
 | 
				
			||||||
						})
 | 
											})
 | 
				
			||||||
						removeIndex = append(removeIndex, k)
 | 
											removeIndex = append(removeIndex, k)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -757,7 +757,8 @@ func (s *sAdminMember) GetIdByCode(ctx context.Context, in *adminin.GetIdByCodeI
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Select 获取可选的用户选项
 | 
					// Select 获取可选的用户选项
 | 
				
			||||||
func (s *sAdminMember) Select(ctx context.Context, in *adminin.MemberSelectInp) (res []*adminin.MemberSelectModel, err error) {
 | 
					func (s *sAdminMember) Select(ctx context.Context, in *adminin.MemberSelectInp) (res []*adminin.MemberSelectModel, err error) {
 | 
				
			||||||
	err = dao.AdminMember.Ctx(ctx).Fields(fmt.Printf("%s as value,%s as label,%s,%s", dao.AdminMember.Columns().Id, dao.AdminMember.Columns().RealName, dao.AdminMember.Columns().Username, dao.AdminMember.Columns().Avatar)).
 | 
						fields := fmt.Sprintf("%s as value,%s as label,%s,%s", dao.AdminMember.Columns().Id, dao.AdminMember.Columns().RealName, dao.AdminMember.Columns().Username, dao.AdminMember.Columns().Avatar)
 | 
				
			||||||
 | 
						err = dao.AdminMember.Ctx(ctx).Fields(fields).
 | 
				
			||||||
		Handler(handler.FilterAuthWithField("id")).
 | 
							Handler(handler.FilterAuthWithField("id")).
 | 
				
			||||||
		Scan(&res)
 | 
							Scan(&res)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,7 +119,11 @@ func (s *sSysEmsLog) List(ctx context.Context, in *sysin.EmsLogListInp) (list []
 | 
				
			|||||||
// Send 发送邮件
 | 
					// Send 发送邮件
 | 
				
			||||||
func (s *sSysEmsLog) Send(ctx context.Context, in *sysin.SendEmsInp) (err error) {
 | 
					func (s *sSysEmsLog) Send(ctx context.Context, in *sysin.SendEmsInp) (err error) {
 | 
				
			||||||
	var models *entity.SysEmsLog
 | 
						var models *entity.SysEmsLog
 | 
				
			||||||
	if err = dao.SysEmsLog.Ctx(ctx).Where("event", in.Event).Where("email", in.Email).Scan(&models); err != nil {
 | 
						if err = dao.SysEmsLog.Ctx(ctx).
 | 
				
			||||||
 | 
							Where("event", in.Event).
 | 
				
			||||||
 | 
							Where("email", in.Email).
 | 
				
			||||||
 | 
							OrderDesc(dao.SysEmsLog.Columns().Id).
 | 
				
			||||||
 | 
							Scan(&models); err != nil {
 | 
				
			||||||
		err = gerror.Wrap(err, consts.ErrorORM)
 | 
							err = gerror.Wrap(err, consts.ErrorORM)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -239,7 +243,7 @@ func (s *sSysEmsLog) newView(ctx context.Context, in *sysin.SendEmsInp, config *
 | 
				
			|||||||
		basic = new(model.BasicConfig)
 | 
							basic = new(model.BasicConfig)
 | 
				
			||||||
		basic.Name = simple.AppName(ctx)
 | 
							basic.Name = simple.AppName(ctx)
 | 
				
			||||||
		basic.Domain = "https://hotgo.facms.cn"
 | 
							basic.Domain = "https://hotgo.facms.cn"
 | 
				
			||||||
		basic.Logo = "http://bufanyun.cn-bj.ufileos.com/haoka/attachment/images/2023-02-04/cq9kf7s66jt7hkpvbh.png"
 | 
							basic.Logo = "https://gmycos.facms.cn/haoka/attachment/images/2023-02-04/cq9kf7s66jt7hkpvbh.png"
 | 
				
			||||||
		basic.SystemOpen = true
 | 
							basic.SystemOpen = true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -380,7 +384,11 @@ func (s *sSysEmsLog) VerifyCode(ctx context.Context, in *sysin.VerifyEmsCodeInp)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var models *entity.SysEmsLog
 | 
						var models *entity.SysEmsLog
 | 
				
			||||||
	if err = dao.SysEmsLog.Ctx(ctx).Where(dao.SysEmsLog.Columns().Event, in.Event).Where(dao.SysEmsLog.Columns().Email, in.Email).Order(dao.SysEmsLog.Columns().Id, false).Scan(&models); err != nil {
 | 
						if err = dao.SysEmsLog.Ctx(ctx).
 | 
				
			||||||
 | 
							Where(dao.SysEmsLog.Columns().Event, in.Event).
 | 
				
			||||||
 | 
							Where(dao.SysEmsLog.Columns().Email, in.Email).
 | 
				
			||||||
 | 
							OrderDesc(dao.SysEmsLog.Columns().Id).
 | 
				
			||||||
 | 
							Scan(&models); err != nil {
 | 
				
			||||||
		err = gerror.Wrap(err, consts.ErrorORM)
 | 
							err = gerror.Wrap(err, consts.ErrorORM)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -103,7 +103,11 @@ func (s *sSysSmsLog) SendCode(ctx context.Context, in *sysin.SendCodeInp) (err e
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var models *entity.SysSmsLog
 | 
						var models *entity.SysSmsLog
 | 
				
			||||||
	if err = dao.SysSmsLog.Ctx(ctx).Where(dao.SysSmsLog.Columns().Event, in.Event).Where(dao.SysSmsLog.Columns().Mobile, in.Mobile).Scan(&models); err != nil {
 | 
						if err = dao.SysSmsLog.Ctx(ctx).
 | 
				
			||||||
 | 
							Where(dao.SysSmsLog.Columns().Event, in.Event).
 | 
				
			||||||
 | 
							Where(dao.SysSmsLog.Columns().Mobile, in.Mobile).
 | 
				
			||||||
 | 
							OrderDesc(dao.SysSmsLog.Columns().Id).
 | 
				
			||||||
 | 
							Scan(&models); err != nil {
 | 
				
			||||||
		err = gerror.Wrap(err, consts.ErrorORM)
 | 
							err = gerror.Wrap(err, consts.ErrorORM)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "hotgo",
 | 
					  "name": "hotgo",
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "version": "2.16.10",
 | 
					  "version": "2.17.8",
 | 
				
			||||||
  "author": {
 | 
					  "author": {
 | 
				
			||||||
    "name": "MengShuai",
 | 
					    "name": "MengShuai",
 | 
				
			||||||
    "email": "133814250@qq.com",
 | 
					    "email": "133814250@qq.com",
 | 
				
			||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
    "lodash-es": "^4.17.21",
 | 
					    "lodash-es": "^4.17.21",
 | 
				
			||||||
    "mint-filter": "^4.0.3",
 | 
					    "mint-filter": "^4.0.3",
 | 
				
			||||||
    "mitt": "^3.0.1",
 | 
					    "mitt": "^3.0.1",
 | 
				
			||||||
    "naive-ui": "^2.41.0",
 | 
					    "naive-ui": "^2.42.0",
 | 
				
			||||||
    "pinia": "^2.2.2",
 | 
					    "pinia": "^2.2.2",
 | 
				
			||||||
    "pinyin-pro": "^3.24.2",
 | 
					    "pinyin-pro": "^3.24.2",
 | 
				
			||||||
    "print-js": "^1.6.0",
 | 
					    "print-js": "^1.6.0",
 | 
				
			||||||
@@ -59,7 +59,7 @@
 | 
				
			|||||||
    "vue-router": "^4.4.3",
 | 
					    "vue-router": "^4.4.3",
 | 
				
			||||||
    "vue-types": "^5.1.3",
 | 
					    "vue-types": "^5.1.3",
 | 
				
			||||||
    "vue-waterfall-plugin-next": "^2.6.0",
 | 
					    "vue-waterfall-plugin-next": "^2.6.0",
 | 
				
			||||||
    "vue3-json-viewer": "^2.2.2",
 | 
					    "vue3-json-viewer": "^2.4.1",
 | 
				
			||||||
    "vuedraggable": "^4.1.0",
 | 
					    "vuedraggable": "^4.1.0",
 | 
				
			||||||
    "weixin-js-sdk": "^1.6.5"
 | 
					    "weixin-js-sdk": "^1.6.5"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <span :style="{ color }">
 | 
					  <span :style="{ color }" v-if="endVal > 0">
 | 
				
			||||||
    {{ value }}
 | 
					    {{ value }}
 | 
				
			||||||
  </span>
 | 
					  </span>
 | 
				
			||||||
 | 
					  <span :style="{ color }" v-else> 0 </span>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
  import { defineComponent, ref, computed, watchEffect, unref, onMounted, watch } from 'vue';
 | 
					  import { defineComponent, ref, computed, watchEffect, unref, onMounted, watch } from 'vue';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@
 | 
				
			|||||||
  import { ImportExcel } from '@/api/addons/hgexample/comp';
 | 
					  import { ImportExcel } from '@/api/addons/hgexample/comp';
 | 
				
			||||||
  import type { UploadFileParams } from '@/utils/http/axios/types';
 | 
					  import type { UploadFileParams } from '@/utils/http/axios/types';
 | 
				
			||||||
  import { JsonViewer } from 'vue3-json-viewer';
 | 
					  import { JsonViewer } from 'vue3-json-viewer';
 | 
				
			||||||
  import 'vue3-json-viewer/dist/index.css';
 | 
					  import 'vue3-json-viewer/dist/vue3-json-viewer.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const message = useMessage();
 | 
					  const message = useMessage();
 | 
				
			||||||
  const response = ref<any>({});
 | 
					  const response = ref<any>({});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -199,14 +199,19 @@
 | 
				
			|||||||
    <div class="mt-4">
 | 
					    <div class="mt-4">
 | 
				
			||||||
      <n-grid cols="1 s:2 m:3 l:8 xl:8 2xl:8" responsive="screen" :x-gap="16" :y-gap="8">
 | 
					      <n-grid cols="1 s:2 m:3 l:8 xl:8 2xl:8" responsive="screen" :x-gap="16" :y-gap="8">
 | 
				
			||||||
        <n-grid-item v-for="(item, index) in iconList" :key="index" @click="item.eventObject || {}">
 | 
					        <n-grid-item v-for="(item, index) in iconList" :key="index" @click="item.eventObject || {}">
 | 
				
			||||||
          <NCard content-style="padding-top: 0;" size="small" :bordered="false">
 | 
					          <NCard
 | 
				
			||||||
 | 
					            content-style="padding-top: 0;"
 | 
				
			||||||
 | 
					            size="small"
 | 
				
			||||||
 | 
					            :bordered="false"
 | 
				
			||||||
 | 
					            v-on="item.eventObject || {}"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
            <template #footer>
 | 
					            <template #footer>
 | 
				
			||||||
              <n-skeleton v-if="loading" size="medium" />
 | 
					              <n-skeleton v-if="loading" size="medium" />
 | 
				
			||||||
              <div class="cursor-pointer" v-else>
 | 
					              <div class="cursor-pointer" v-else>
 | 
				
			||||||
                <p class="flex justify-center">
 | 
					                <p class="flex justify-center">
 | 
				
			||||||
                  <span>
 | 
					                  <span>
 | 
				
			||||||
                    <n-icon :size="item.size" class="flex-1" :color="item.color">
 | 
					                    <n-icon :size="item.size" class="flex-1" :color="item.color">
 | 
				
			||||||
                      <component :is="item.icon" v-on="item.eventObject || {}" />
 | 
					                      <component :is="item.icon" />
 | 
				
			||||||
                    </n-icon>
 | 
					                    </n-icon>
 | 
				
			||||||
                  </span>
 | 
					                  </span>
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,7 +107,7 @@
 | 
				
			|||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
  import { onMounted, ref } from 'vue';
 | 
					  import { onMounted, ref } from 'vue';
 | 
				
			||||||
  import { JsonViewer } from 'vue3-json-viewer';
 | 
					  import { JsonViewer } from 'vue3-json-viewer';
 | 
				
			||||||
  import 'vue3-json-viewer/dist/index.css';
 | 
					  import 'vue3-json-viewer/dist/vue3-json-viewer.css';
 | 
				
			||||||
  import { useRouter } from 'vue-router';
 | 
					  import { useRouter } from 'vue-router';
 | 
				
			||||||
  import { useMessage } from 'naive-ui';
 | 
					  import { useMessage } from 'naive-ui';
 | 
				
			||||||
  import { View } from '@/api/log/log';
 | 
					  import { View } from '@/api/log/log';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,7 +136,7 @@
 | 
				
			|||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
  import { onMounted, ref } from 'vue';
 | 
					  import { onMounted, ref } from 'vue';
 | 
				
			||||||
  import { JsonViewer } from 'vue3-json-viewer';
 | 
					  import { JsonViewer } from 'vue3-json-viewer';
 | 
				
			||||||
  import 'vue3-json-viewer/dist/index.css';
 | 
					  import 'vue3-json-viewer/dist/vue3-json-viewer.css';
 | 
				
			||||||
  import { useRouter } from 'vue-router';
 | 
					  import { useRouter } from 'vue-router';
 | 
				
			||||||
  import { useMessage } from 'naive-ui';
 | 
					  import { useMessage } from 'naive-ui';
 | 
				
			||||||
  import { View } from '@/api/log/log';
 | 
					  import { View } from '@/api/log/log';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,7 +110,7 @@
 | 
				
			|||||||
  import { ExportOutlined, DeleteOutlined } from '@vicons/antd';
 | 
					  import { ExportOutlined, DeleteOutlined } from '@vicons/antd';
 | 
				
			||||||
  import { useRouter } from 'vue-router';
 | 
					  import { useRouter } from 'vue-router';
 | 
				
			||||||
  import { JsonViewer } from 'vue3-json-viewer';
 | 
					  import { JsonViewer } from 'vue3-json-viewer';
 | 
				
			||||||
  import 'vue3-json-viewer/dist/index.css';
 | 
					  import 'vue3-json-viewer/dist/vue3-json-viewer.css';
 | 
				
			||||||
  import { adaTableScrollX } from '@/utils/hotgo';
 | 
					  import { adaTableScrollX } from '@/utils/hotgo';
 | 
				
			||||||
  import { loadOptions } from './model';
 | 
					  import { loadOptions } from './model';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user