Compare commits

...
303 Commits
Author SHA1 Message Date
wenjianzhang 61bf06c49b v1.2.1
1. 登陆页面适配移动端
2. 调整sysconfig功能
3. 修复已知BUG
2020-10-17 17:58:30 +08:00
wenjianzhang 8ef816c2a9 Merge pull request #263 from wenjianzhang/dev
调整sysconfig结构
2020-10-17 17:56:20 +08:00
zhangwenjian 8705ad0436 调整sysconfig结构 2020-10-17 17:52:20 +08:00
wenjianzhang c350c8e32a Merge pull request #260 from go-admin-team/dev
优化sysconfig功能
2020-10-14 13:50:08 +08:00
wenjianzhang f2703f16d5 Merge pull request #259 from wenjianzhang/dev
Update 1602644950000_migrate.go
2020-10-14 12:19:59 +08:00
zhangwenjian 7a0fff117b Update 1602644950000_migrate.go 2020-10-14 12:18:39 +08:00
wenjianzhang 209db87d05 Merge pull request #258 from wenjianzhang/dev
优化sysconfig 业务,添加生成迁移文件命令
2020-10-14 11:59:12 +08:00
zhangwenjian d12b1b7384 添加生成迁移文件命令 2020-10-14 11:57:20 +08:00
zhangwenjian 21603d5a4c 优化sysconfig 业务 2020-10-14 11:42:01 +08:00
wenjianzhang bd658d9f0b Merge pull request #256 from go-admin-team/dev
fix:修复httpjob循环调用bug
2020-10-13 22:27:47 +08:00
wenjianzhang 9e640cf422 Merge pull request #255 from wenjianzhang/dev
fix:修复httpjob循环调用bug
2020-10-13 22:25:09 +08:00
zhangwenjian d1d545b29c fix:修复httpjob循环调用bug 2020-10-13 22:19:59 +08:00
linwenxiang 1e8544f1ce 支持限流,200QPS 2020-10-12 20:15:28 +08:00
wenjianzhang 2ecabd1202 Merge pull request #253 from go-admin-team/dev
整合gorm的log
2020-10-12 10:57:36 +08:00
linwenxiang 4741137c9a 整合gorm的log 2020-10-09 19:32:08 +08:00
wenjianzhang f4c5aacf32 Merge pull request #249 from go-admin-team/dev
fix:fix tpl gen bug (#248)
2020-10-09 17:48:32 +08:00
wenjianzhang 72a95babe5 fix:fix tpl gen bug (#248)
readme:update msg
2020-10-09 17:47:31 +08:00
zhangwenjian 3b5ce7ffaf bug:fix tpl gen bug (#248) 2020-10-09 17:46:16 +08:00
zhangwenjian 7db918c495 readme:update msg 2020-10-09 16:46:04 +08:00
linwenxiang faa8de7dc2 修改日志初始化值,level值不被覆盖 2020-10-09 16:15:51 +08:00
wenjianzhang 68c51fb480 Merge pull request #246 from go-admin-team/dev
feat:readme update
2020-10-08 20:17:34 +08:00
wenjianzhang 4fe68183ba Merge pull request #245 from wenjianzhang/dev
feat:readme update
2020-10-08 20:16:36 +08:00
zhangwenjian 918e5c2ce1 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-10-08 20:13:51 +08:00
zhangwenjian ce656bf7a1 readme:update team 2020-10-08 20:13:45 +08:00
wenjianzhang 4be26aa5d2 v1.2.0
添加资源管理
添加资源统一组件
代码生成工具支持关系表
调整了项目结构
添加了路由主动注册机制
添加了数据库迁移功能
添加无代码CRUD函数
添加通用CRUD函数
修复了部分已知bug
2020-10-05 18:29:32 +08:00
linwenxiang dd09f52343 修复字典值查重问题 2020-10-03 09:15:58 +08:00
zhangwenjian 606aa821d5 clear:clear no used file 2020-09-29 23:00:18 +08:00
zhangwenjian 99acf0086f feat:update file struct 2020-09-29 22:48:03 +08:00
zhangwenjian c9b073908e feat:clear no used file go 2020-09-29 22:32:53 +08:00
zhangwenjian 000cd1d07d feat:update sql init 2020-09-29 16:32:17 +08:00
zhangwenjian ca8d1e7e33 feat:update tpl 2020-09-29 12:23:16 +08:00
zhangwenjian bc648c3f2f test 2020-09-29 08:41:20 +08:00
linwenxiang 677cdb7821 修改参数验证,统一返回200 2020-09-24 21:47:48 +08:00
linwenxiang 7e2e40df56 修改随机字符串生成方法 2020-09-23 22:26:14 +08:00
zhangwenjian 2c23ef8c6d Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-09-23 00:38:44 +08:00
zhangwenjian dab93f16b0 tpl:update dto template 2020-09-23 00:38:38 +08:00
linwenxiang 43dd214a7e 修改模版兼容 2020-09-23 00:36:37 +08:00
linwenxiang c0ac9a6397 支持view自定义返回 2020-09-23 00:35:07 +08:00
linwenxiang 78bb246390 支持多应用路由注册示例写法 2020-09-22 23:18:54 +08:00
linwenxiang 029783a685 修复job删除问题 2020-09-22 22:16:58 +08:00
linwenxiang 8460b3f385 修改action和模版,使用log打印日志,修复job删除问题,已经所有删除问题 2020-09-22 22:04:29 +08:00
linwenxiang f3e0e4dbc6 简化代码生成 2020-09-22 20:39:11 +08:00
linwenxiang 72a876f37a 日志生效,
调整路由注册方式
2020-09-21 23:24:50 +08:00
linwenxiang 7d8a267da7 日志生效,
调整路由注册方式
2020-09-21 23:23:40 +08:00
linwenxiang 2fe2c96e82 语法规范 2020-09-21 13:07:41 +08:00
linwenxiang fdbb76086e 增加go-admin日志规范用法 2020-09-21 13:04:48 +08:00
linwenxiang a8d5846483 优化casbin接口鉴权问题,不再重复查询数据库 2020-09-21 11:39:19 +08:00
linwenxiang a06bd289b3 升级gorm 2020-09-17 21:04:10 +08:00
linwenxiang 6bc3e6c00b 优化模版生成 2020-09-16 22:42:13 +08:00
linwenxiang 91f2adb340 修复模版生成bug
关联表
新增字段选择
2020-09-16 21:12:13 +08:00
linwenxiang 21d217c42a 修复模版生成bug
关联表
新增字段选择
2020-09-16 20:59:53 +08:00
linwenxiang 50464dc6e6 修改忽略文件 2020-09-15 23:00:14 +08:00
linwenxiang bb07d90407 增加service实现 2020-09-15 13:59:01 +08:00
linwenxiang 3d5a2ea9f7 修复初始化已知bug 2020-09-14 21:52:08 +08:00
linwenxiang ca4ed89536 Merge branch 'dev' of github.com:wenjianzhang/go-admin into table/dev
 Conflicts:
	template/v2/dto.go.template
	template/v2/model.go.template
2020-09-14 20:06:35 +08:00
linwenxiang 9cab65af6a 模版修改 2020-09-14 20:02:55 +08:00
zhangwenjian 7bba9b44b5 tpl:update tpl 2020-09-13 22:29:43 +08:00
zhangwenjian fd27170946 feat:update tpl 2020-09-13 17:57:11 +08:00
linwenxiang c6735c4b1a Merge branch 'dev' of github.com:wenjianzhang/go-admin into table/dev 2020-09-12 21:38:32 +08:00
linwenxiang 106ca70acc 修改引用 2020-09-12 21:37:40 +08:00
zhangwenjian e0f5a9ede2 feat:update tpl 2020-09-12 21:25:27 +08:00
zhangwenjian ab28eea2f3 update:added gen init data 2020-09-12 20:38:54 +08:00
zhangwenjian 6f09ecca32 fix:init data sql 2020-09-12 20:11:30 +08:00
zhangwenjian 0b80ac635d fix:tpl bug 2020-09-12 20:06:13 +08:00
zhangwenjian 31544ff1ae doc:update readme 2020-09-12 02:09:10 +08:00
zhangwenjian d4b87c78a7 feat:date migrate 2020-09-12 01:27:39 +08:00
zhangwenjian b8f8bfd400 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-09-12 01:08:35 +08:00
zhangwenjian 2d15f91f2e feat:update gen 2020-09-12 01:07:35 +08:00
linwenxiang 3a6a06f52a 修改数据表迁移用法 2020-09-12 00:15:23 +08:00
linwenxiang 317d417824 升级go-admin-core库 2020-09-11 23:03:14 +08:00
zhangwenjian 8a7a9db7fd feat:update api model router tpl 2020-09-10 14:14:08 +08:00
zhangwenjian fa07a57d22 feat : update actions gen 2020-09-10 02:14:48 +08:00
zhangwenjian aaba20d42a Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-09-09 22:45:03 +08:00
zhangwenjian 4466482ad9 feat:update gen 2020-09-09 22:43:21 +08:00
linwenxiang 4140cad9dd 增加通用配置组件 2020-09-09 20:17:08 +08:00
linwenxiang 0c64d8b927 修复指针问题,提取by_id到公共结构体 2020-09-08 20:28:31 +08:00
linwenxiang 3bd3656d15 迁移方法set时增加锁 2020-09-04 14:33:46 +08:00
linwenxiang 77dfe418df 构建数据库迁移体系 2020-09-04 14:30:52 +08:00
wenjianzhang 8a3ee2e7af Merge pull request #231 from matchstalk/table/dev
添加数据权限
2020-09-04 00:37:02 +08:00
linwenxiang 01ea376015 修改文件目录 2020-09-04 00:21:52 +08:00
linwenxiang 41b06c806a 修改createBy和updateBy为uint类型 2020-09-03 22:14:34 +08:00
linwenxiang 0ae41f247c 兼容批量删除 2020-09-03 21:04:17 +08:00
linwenxiang 560e650070 拆分数据权限验证,让用户选择是否加 2020-09-03 19:52:15 +08:00
linwenxiang 3a9831fc8c 删除角色时,检查是否有用户绑定 2020-09-03 11:51:25 +08:00
linwenxiang 4b8c372038 1、action中各动作添加数据权限
2、修改jwt中key为常量
2020-09-03 10:49:31 +08:00
wenjianzhang d3622c93fc Merge pull request #226 from matchstalk/table/dev
调整indexAction,允许用户自定义接收的slice,配合gorm只能搜索
2020-09-01 20:12:05 +08:00
linwenxiang f0fde7f77c 规范curd动作流程 2020-09-01 13:37:49 +08:00
linwenxiang c93f3f01b3 格式化 2020-08-31 22:09:00 +08:00
linwenxiang 4e39e915ea 调整indexAction路径,允许用户自定义接收的slice,配合gorm只能搜索 2020-08-31 21:56:29 +08:00
zhangwenjian b98997a69f feat:update userinfo 2020-08-31 21:18:14 +08:00
zhangwenjian cb06f596e9 update: update router template 2020-08-30 14:43:29 +08:00
wenjianzhang 638e5b8311 Merge pull request #222 from matchstalk/table/dev
使用action代替api单个操作
2020-08-30 00:23:36 +08:00
linwenxiang b646ce9335 在actions中添加权限 2020-08-30 00:22:21 +08:00
linwenxiang abc8b271c4 在actions中添加权限 2020-08-30 00:21:03 +08:00
linwenxiang 61451d149a Merge branch 'dev' of github.com:wenjianzhang/go-admin into table/dev 2020-08-29 23:29:42 +08:00
zhangwenjian 671291d024 update: used gormv2 to handle permission process 2020-08-29 23:25:53 +08:00
linwenxiang 562e61cf4f 使用action代替api单个操作
改写job
2020-08-29 22:22:52 +08:00
wenjianzhang d53ba4ed7a Merge pull request #221 from matchstalk/table/dev
修改model写法
2020-08-29 19:33:41 +08:00
linwenxiang 78417c2d33 修改model写法 2020-08-29 19:32:22 +08:00
wenjianzhang 5b9225ac3a Merge pull request #220 from matchstalk/table/dev
写法修改
2020-08-29 19:10:55 +08:00
linwenxiang 05b53c0710 支持主动加入路由 2020-08-29 19:08:55 +08:00
linwenxiang ca98fd873c 修改curd基本写法 2020-08-29 18:54:39 +08:00
zhangwenjian 55496078f0 update: set orm log 2020-08-29 17:52:59 +08:00
zhangwenjian c210d2301c update:update gen code 2020-08-29 17:31:28 +08:00
zhangwenjian 77499b50cc update:update gen code temp 2020-08-29 16:32:59 +08:00
zhangwenjian 3063386ec6 fix:create args bug 2020-08-29 16:31:56 +08:00
zhangwenjian 58c7b43759 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-29 15:34:41 +08:00
zhangwenjian ce80857d5f feat:added dto 2020-08-29 15:33:44 +08:00
wenjianzhang a1e0b6cc5e Merge pull request #219 from matchstalk/integral-master
修改core仓库名称
2020-08-29 15:32:42 +08:00
linwenxiang 09e3c4f51d 修改环境变量名称 2020-08-29 15:30:55 +08:00
linwenxiang dc9bec2c22 添加debug 2020-08-29 15:19:01 +08:00
linwenxiang 8817f02038 修改core仓库名称 2020-08-29 15:15:03 +08:00
wenjianzhang 33b462217c Merge pull request #218 from matchstalk/table/dev
修改通用search语法结构
2020-08-28 21:13:15 +08:00
linwenxiang 486a77762c 修改通用search语法结构 2020-08-28 21:01:56 +08:00
zhangwenjian 87edf1099c feat:update search 2020-08-28 00:52:16 +08:00
zhangwenjian 1dffcb7199 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-28 00:06:55 +08:00
zhangwenjian c69a7d9fd9 feat: format reference 2020-08-28 00:02:53 +08:00
wenjianzhang 5db1495985 Merge pull request #217 from matchstalk/table/dev
支持search
2020-08-27 22:33:57 +08:00
linwenxiang 65c4cfd684 支持search 2020-08-27 22:24:32 +08:00
linwenxiang de67c5dc46 支持search 2020-08-27 21:44:44 +08:00
wenjianzhang 6877e1324c Merge pull request #216 from matchstalk/table/dev
gorm升级到v2版本
2020-08-27 13:52:03 +08:00
linwenxiang 60c7496f7b gorm升级到v2版本 2020-08-27 11:17:15 +08:00
wenjianzhang 93cfe443d6 Merge pull request #214 from matchstalk/table/dev
分表基础算法
2020-08-26 22:32:11 +08:00
linwenxiang ffbacea589 导入表字段根据数据库字段排序,支持mysql 2020-08-26 22:27:31 +08:00
linwenxiang 7373536d36 修改注释 2020-08-25 23:10:09 +08:00
zhangwenjian 9f0ceda347 feat:added file info pid search 2020-08-25 23:07:34 +08:00
linwenxiang 22f5d39209 加入字符串字段分表算法,供分表业务参考 2020-08-25 23:06:10 +08:00
zhangwenjian d3376acc34 feat : update gen code & sql file 2020-08-25 22:34:29 +08:00
zhangwenjian aca9e19551 deat:added automigrate 2020-08-25 20:07:07 +08:00
zhangwenjian d27583421b feat:cms + gen code 2020-08-25 19:58:39 +08:00
zhangwenjian 7215f7c236 fix:role remove bug 2020-08-24 22:48:11 +08:00
zhangwenjian c2742e5f96 feat:update pagelist func 2020-08-24 22:41:20 +08:00
zhangwenjian 7b4ff44360 feat:added api template insert doc 2020-08-23 23:22:28 +08:00
zhangwenjian 87aa013cf7 fix:update dir 2020-08-23 22:58:11 +08:00
zhangwenjian 5a793b9e34 fix :dir insert bug 2020-08-23 22:55:57 +08:00
zhangwenjian 128e34ab04 feat: file manage 2020-08-23 20:49:06 +08:00
zhangwenjian b9d3483ba3 fix : role deletion problem (#208) 2020-08-21 15:07:03 +08:00
zhangwenjian 2c8c7688b4 feat: log output in ws mode 2020-08-20 23:31:46 +08:00
zhangwenjian a2f1721ee1 clear:remove no used code 2020-08-20 23:30:36 +08:00
zhangwenjian b26258c8ab feat: Task scheduling supports function with parameters
注意:参数资源sql;
ALTER TABLE `sys_job`
ADD COLUMN `args` varchar(255) NULL COMMENT '目标参数' AFTER `invoke_target`;
2020-08-20 06:30:44 +08:00
zhangwenjian 242902d2bc fix:Modify role permissions (#208) 2020-08-20 05:43:59 +08:00
zhangwenjian 2d11163ce5 upgrade:float64 formatting method 2020-08-20 05:33:37 +08:00
wenjianzhang c2f593de48 releases 1.1.5
releases 1.1.5
2020-08-18 16:49:54 +08:00
zhangwenjian 7140ff8a3a upgrade:ver 1.1.5 2020-08-18 16:45:50 +08:00
zhangwenjian cc6c333372 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-18 00:03:28 +08:00
zhangwenjian 77bfc07826 fix: job nil bug 2020-08-18 00:03:02 +08:00
wenjianzhang a33b0d036a Merge pull request #200 from hqcchina/master
fix: Serve static javascript file with mime-type error
2020-08-16 19:35:00 +08:00
云景(Neil) 729154212f fix: Serve static javascript file mime-type error 2020-08-15 09:38:11 +08:00
wenjianzhang e345ffe9af releases 1.1.4
releases 1.1.4
2020-08-14 00:01:45 +08:00
zhangwenjian afb98f5e81 feat:update vue template & sql 2020-08-13 23:47:37 +08:00
zhangwenjian 826eef40a3 sql:update sql 2020-08-13 11:53:53 +08:00
zhangwenjian 589a9b7d9c version:update version No. 2020-08-13 11:33:35 +08:00
zhangwenjian 7889e49633 fix:Modify SQL and new business initialization bug 2020-08-13 11:21:54 +08:00
wenjianzhang ed238f0143 releases 1.1.3
releases 1.1.3
2020-08-12 21:31:57 +08:00
zhangwenjian 8ebcd772b2 fix:job list status invalid 2020-08-12 20:00:13 +08:00
zhangwenjian e9ef8a2d12 feat:update auto job 2020-08-12 19:59:04 +08:00
zhangwenjian 509709f3fb feat: update auto job (#191) 2020-08-12 18:21:04 +08:00
wenjianzhang 4dbacc7a16 Merge pull request #192 from matchstalk/master
修改job为接口类型
2020-08-11 23:36:32 +08:00
linwenxiang ee9f823bdd 修改job为接口类型 2020-08-11 23:30:20 +08:00
zhangwenjian 68eb8f1d51 feat : added func sql 2020-08-11 22:03:42 +08:00
zhangwenjian fcd91d3f18 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-11 21:58:34 +08:00
zhangwenjian ec4bb6ee3a feat:auto job (#191) 2020-08-11 21:57:36 +08:00
wenjianzhang 938c865089 feat: Support cache + queue
支持缓存+队列
2020-08-10 21:12:52 +08:00
linwenxiang 2b794c03cc 支持缓存+队列,支持驱动:redis、memory 2020-08-10 20:57:17 +08:00
zhangwenjian 94aed14389 feat:added settings data 2020-08-09 02:49:31 +08:00
zhangwenjian 70e0141f64 feat: update system setting 2020-08-09 02:45:05 +08:00
zhangwenjian 6f8ad4efe4 feat : added auto task 2020-08-09 02:44:42 +08:00
zhangwenjian 5d88273910 feat:added job db & data 2020-08-09 02:43:49 +08:00
wenjianzhang 45bc92eb46 feat:added system baseInfo api
Dev
2020-08-08 09:26:35 +08:00
wenjianzhang 65fd96b481 feat: added dockerfile
添加Dockerfile
2020-08-08 09:24:48 +08:00
jalins e37aaee861 添加Dockerfile 2020-08-07 22:01:46 +08:00
wxb dca1919c69 新增系统设置接口 2020-08-07 10:51:01 +08:00
wxb 389d2970c0 新增系统设置接口 2020-08-07 10:22:52 +08:00
zhangwenjian c396f318ef Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-06 22:32:15 +08:00
zhangwenjian 54f48377f0 feat:added auto job 2020-08-06 22:30:57 +08:00
linwenxiang bdde879238 修改connect函数定义 2020-08-06 00:25:21 +08:00
linwenxiang d2639ccf22 修改方法名称 2020-08-06 00:20:04 +08:00
wenjianzhang e0c8c8de6a Merge pull request #186 from matchstalk/master
定义缓存和队列接口
2020-08-05 23:32:28 +08:00
linwenxiang b57af6c542 定义缓存和队列接口 2020-08-05 23:31:01 +08:00
linwenxiang b9d30eee88 定义缓存和队列接口 2020-08-05 23:30:05 +08:00
linwenxiang 18a2aeadaa 定义缓存和队列接口 2020-08-05 23:22:09 +08:00
wenjianzhang 2ed4869c8b Merge pull request #185 from matchstalk/master
开放三方依赖使用模式
2020-08-05 21:12:18 +08:00
linwenxiang 980d0977fc 开放对象,项目可以作为第三方依赖 2020-08-05 21:05:43 +08:00
wenjianzhang 055a68de7f Merge pull request #183 from wenjianzhang/dev
fix: Use NewSyncedEnforcer instead NewEnforcer to solve the thread safe
2020-08-03 14:25:59 +08:00
zhangwenjian 328f7d4f4f Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-03 14:25:30 +08:00
wenjianzhang 40492e56a0 ver : update version 1.1.2 2020-08-03 14:23:47 +08:00
zhangwenjian e709ee6209 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-03 14:19:09 +08:00
zhangwenjian 80ecefb9f7 feat : added job 2020-08-03 14:18:33 +08:00
wenjianzhang e51b72d2e4 Merge pull request #182 from nodece/patch-1
fix: Use NewSyncedEnforcer instead NewEnforcer
2020-08-03 14:16:33 +08:00
Zixuan Liu cb9ae9b8ec fix: Use NewSyncedEnforcer instead NewEnforcer to solve the thread safe
Signed-off-by: Zixuan Liu <nodeces@gmail.com>
2020-08-03 14:12:07 +08:00
wenjianzhang 3316433f13 Merge pull request #178 from wenjianzhang/dev
1. 代码生成添加操作按钮确认提示;
2. 代码生成添加时间类型支持;
3. 代码生成添加时间控件、下拉控件、文本域的支持;
4. 修复代码生成无需权限的问题;
5. 修改了部分格式问题;
6. 默认开启log;
7. 修复了已知bug;
2020-08-01 14:52:29 +08:00
zhangwenjian c98f38cab4 gen :update import 2020-08-01 14:43:38 +08:00
zhangwenjian 88a458a003 gen : remove value-format 2020-08-01 14:07:06 +08:00
zhangwenjian 89fe63c915 gen : upgrade gen 2020-08-01 12:56:19 +08:00
zhangwenjian 80ef9e46ab Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-08-01 11:11:44 +08:00
zhangwenjian 259b77dc08 fix : fix no auth code gen router 2020-08-01 11:08:40 +08:00
zhangwenjian 55b055b9a0 version : update version 2020-08-01 11:00:36 +08:00
zhangwenjian 309be41b05 feat : added version & config 2020-08-01 11:00:06 +08:00
zhangwenjian 1a580366fc feat : enabledbus status to true 2020-08-01 10:52:49 +08:00
zhangwenjian 93ac874312 feat : logger type error to fatal 2020-08-01 10:52:17 +08:00
zhangwenjian e5d22c78c8 doc : update readme 2020-08-01 10:50:19 +08:00
zhangwenjian 8d7a6ef3bb feat : update log format 2020-08-01 10:49:36 +08:00
zhangwenjian f050924234 sql : remove no used sql 2020-07-29 23:32:34 +08:00
zhangwenjian 061cb61aa7 remove : Prot default value removal 2020-07-29 23:31:51 +08:00
zhangwenjian 59e966ede6 feat : Adjust the length of the title field from the original 64 to 128 2020-07-29 15:08:44 +08:00
wenjianzhang 697ec9fcd5 doc : update readme 2020-07-28 00:07:41 +08:00
wenjianzhang afc09f4ef4 Merge pull request #176 from wenjianzhang/dev
v1.1.0
2020-07-27 23:46:55 +08:00
wenjianzhang e95bdf03f6 Merge branch 'master' into dev 2020-07-27 23:46:35 +08:00
zhangwenjian 3d631d0fec doc : update version 2020-07-27 23:35:38 +08:00
zhangwenjian 88b680aeee feat : update config & time format adjustment 2020-07-27 22:46:37 +08:00
zhangwenjian f693ff60b2 doc : add notes 2020-07-27 22:45:47 +08:00
zhangwenjian 1a50570f6c doc : add notes 2020-07-27 22:45:12 +08:00
zhangwenjian ccb140d1d1 feat : added textcolor 2020-07-27 22:44:26 +08:00
zhangwenjian 8fbfaa6d1f config : update config 2020-07-27 22:44:01 +08:00
zhangwenjian 22124b236a feat : Log optimization 2020-07-27 22:43:17 +08:00
zhangwenjian f3a425a82b feat : Function name modification 2020-07-27 22:41:01 +08:00
zhangwenjian be19638a59 log : Log middleware modification 2020-07-27 22:40:12 +08:00
zhangwenjian f3104a2d28 feat : added global config items 2020-07-27 22:39:16 +08:00
zhangwenjian b64dfe9aa4 config : update config 2020-07-27 22:38:37 +08:00
zhangwenjian 20c3e528b0 config : added new full config 2020-07-27 22:38:21 +08:00
zhangwenjian 012a82821e log : update log import 2020-07-27 22:37:50 +08:00
zhangwenjian 61d3e7c080 remove : remove no used code 2020-07-27 22:36:00 +08:00
zhangwenjian 7e12e55b56 feat : update config 2020-07-27 22:34:01 +08:00
zhangwenjian 2b92b100e3 feat : update log import 2020-07-27 22:33:00 +08:00
zhangwenjian caab6097b8 feat:update template 2020-07-25 14:59:30 +08:00
zhangwenjian 485110f214 feat:remove db log 2020-07-25 11:27:57 +08:00
zhangwenjian d3276e3b41 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-07-25 10:21:27 +08:00
zhangwenjian 9b6de9ee79 doc:update readme.md 2020-07-25 10:20:00 +08:00
wenjianzhang f3adadd6ef feat:update log 2020-07-24 18:10:25 +08:00
wenjianzhang 0768efbcb3 doc:update README.md 2020-07-24 11:04:36 +08:00
zhangwenjian 2549f26147 upgrade:Template upgrade 2020-07-23 21:06:30 +08:00
zhangwenjian 791d07d09b fix:fix parameter setting 2020-07-23 18:11:10 +08:00
zhangwenjian ca62b4ef1d feat:Code generation upgrade(#173) 2020-07-23 14:07:57 +08:00
zhangwenjian 8c554d7ee7 clear:formatting code 2020-07-23 12:03:17 +08:00
zhangwenjian 426cec1b62 fix: Fix spelling errors 2020-07-23 11:59:47 +08:00
zhangwenjian f250ed1dc9 doc: Unified naming method of source file name(#171) 2020-07-23 11:58:38 +08:00
wenjianzhang bad111a633 feat:Routes are added directly to the structure 2020-07-22 18:08:39 +08:00
wenjianzhang 563b7ea10c feat : Add code generation to front-end directory 2020-07-22 17:23:40 +08:00
wenjianzhang 6f111ce9f1 feat:Code generation configuration item 2020-07-22 17:22:55 +08:00
wenjianzhang f95aba8345 feat:Add version information 2020-07-22 17:22:20 +08:00
wenjianzhang 3846a95f12 feat:Code generation configuration item 2020-07-22 17:21:47 +08:00
wenjianzhang 0ac2c2a423 fix:template list not define 2020-07-22 15:39:27 +08:00
wenjianzhang 51e0134fb8 feat:Upgrade the permission field length of menu table to 255 2020-07-22 15:38:15 +08:00
zhangwenjian 1483b63447 feat:In the development mode, the token timeout is adjusted to infinity 2020-07-18 15:25:55 +08:00
zhangwenjian 3af05af603 feat:In the development mode, the token timeout is adjusted to infinity(#169) 2020-07-18 14:59:21 +08:00
zhangwenjian d4d4c9f574 clean:Clean up SQL files 2020-07-18 14:44:55 +08:00
zhangwenjian eb36167baf feat:Optimizing SQL execution logic 2020-07-18 14:43:51 +08:00
zhangwenjian b9d0318b45 doc: swagger add auth tag 2020-07-18 14:24:59 +08:00
zhangwenjian ea3408de84 feat: Upgrade form build(#47 、#167)
Upgrade form build
2020-07-18 14:24:13 +08:00
zhangwenjian fe1ceb4332 fix:Fix the previous page components '/' 2020-07-18 14:22:14 +08:00
wenjianzhang 62a05daa5a fix:template list not define 2020-07-17 19:02:01 +08:00
zhangwenjian a49cb327fd feat:
The login interface verification code in the newly developed mode does not do mandatory verification(#164)
2020-07-15 22:12:04 +08:00
zhangwenjian f045515fc2 fix:Backend verification code is empty Verification error message description is inaccurate(#163) 2020-07-15 22:10:11 +08:00
zhangwenjian 22dc5f3407 doc: upgrade doc 2020-07-15 22:07:23 +08:00
zhangwenjian 7a48cd0084 feat:Basic functions add, delete, modify, check menu and api configuration data, support the system to write to the database with one click(#162) 2020-07-15 22:06:44 +08:00
zhangwenjian 073ef02c05 fix:Model doc information in api document is wrong(#161) 2020-07-15 22:02:40 +08:00
zhangwenjian 18d116bc0c clear: Mark a method that is about to expire 2020-07-15 21:57:27 +08:00
zhangwenjian 73f8572727 fix:The second menu time is displayed incorrectly(#160) 2020-07-15 21:55:36 +08:00
zhangwenjian 209339a1fa Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-07-14 20:52:40 +08:00
wenjianzhang c3fedf35aa Merge pull request #155 from appleboy/patch
chore(gin): upgrade to v1.6.3
2020-07-14 20:34:48 +08:00
Bo-Yi Wu d3d8e76d03 chore(gin): upgrade to v1.6.3
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-07-13 12:21:42 +08:00
zhangwenjian 56163f9a81 doc:update readme img height 2020-07-12 09:53:49 +08:00
wenjianzhang 451f6f9e78 doc:update readme img hight 2020-07-12 09:49:55 +08:00
zhangwenjian aa75242c1a doc:update readme 2020-07-12 09:19:52 +08:00
zhangwenjian 2280ce2b57 fix:Invalid post search criteria 2020-07-11 06:34:51 +08:00
wenjianzhang 4d32d94f23 Merge pull request #154 from wenjianzhang/v1
fix: Invalid job search criteria
2020-07-11 06:31:44 +08:00
zhangwenjian 2195c7a944 fix:Invalid post search criteria 2020-07-11 06:29:07 +08:00
zhangwenjian 494ee18b9f doc:Specification interface document description 2020-07-11 06:15:42 +08:00
zhangwenjian 6673e0aa37 fix:Fix data table name error 2020-07-11 06:14:54 +08:00
zhangwenjian 4f7e22a6f2 fix: fix User management Invalid search box search (#149) 2020-07-10 00:42:34 +08:00
wenjianzhang 4884f31550 Merge pull request #150 from wenjianzhang/fix-bug
Fix bug
2020-07-10 00:36:59 +08:00
zhangwenjian 82b78a728c fix: fix User management Invalid search box search (#149) 2020-07-10 00:33:10 +08:00
zhangwenjian 777ef212c8 fix: fix User management Invalid search box search 2020-07-10 00:31:55 +08:00
zhangwenjian 1f416cc8fd fear: Support sqlite and pgsql 2020-07-10 00:21:26 +08:00
zhangwenjian 8662209181 feat: update demo rotuter 2020-07-10 00:20:37 +08:00
zhangwenjian 00959406aa feat: update router template 2020-07-10 00:19:32 +08:00
zhangwenjian 02cc68daea feat: model type change 2020-07-10 00:17:01 +08:00
zhangwenjian 84a78d7b4f fix: fix name error 2020-07-10 00:16:33 +08:00
zhangwenjian 16d6aebbc2 feat: Interception of sqlite and pgsql database types in code generation 2020-07-10 00:15:09 +08:00
zhangwenjian 9aa9cf5d0e feat: add log 2020-07-10 00:12:41 +08:00
zhangwenjian 144b29ae2c feat: add pgsql sql file 2020-07-10 00:12:07 +08:00
zhangwenjian 4ec3a3016b fix:
fix: Fix current spelling error
2020-07-09 22:38:59 +08:00
wenjianzhang 916e30005f feat: update system 2020-07-06 18:13:29 +08:00
wenjianzhang 8a1614f64d feat:Extraction of configuration parameters 2020-07-06 13:53:15 +08:00
zhangwenjian bfbc5081ea feat:Extract global configuration 2020-07-06 07:53:34 +08:00
zhangwenjian a6970e9c67 feat: Database type support 2020-07-03 00:34:54 +08:00
wenjianzhang ab34ba8aad feat: add dbtype 2020-07-02 18:23:14 +08:00
zhangwenjian 75eec8eebe feat:gen code to path 2020-07-02 00:03:57 +08:00
zhangwenjian cd60410ac0 readme:update readme 2020-07-01 23:03:39 +08:00
zhangwenjian 985a6618a0 Merge branch 'v1-fixbug' into dev
# Conflicts:
#	models/dept.go
2020-07-01 22:57:44 +08:00
wenjianzhang 513f45ab75 Merge pull request #140 from wenjianzhang/v1-fixbug
V1 fixbug
2020-07-01 22:34:56 +08:00
zhangwenjian 8b68e98ebf fix: return value 2020-07-01 20:49:19 +08:00
zhangwenjian 58999ef1a4 feat:add CustomMigrate 2020-06-28 22:49:42 +08:00
zhangwenjian 4ce39764bc feat:update db file name to gorm 2020-06-28 22:49:17 +08:00
zhangwenjian 2eb5803432 fix:Correct typos 2020-06-28 22:48:32 +08:00
zhangwenjian ba3f4b7c23 docs: update init 2020-06-28 22:47:49 +08:00
zhangwenjian e05c5e8a8b feat: Add transaction (#124) 2020-06-28 22:14:53 +08:00
zhangwenjian 8407b1ad31 Merge branch 'dev' of https://github.com/wenjianzhang/go-admin into dev 2020-06-21 13:02:35 +08:00
zhangwenjian 9c0941cd37 feat:code gen to dir 2020-06-21 13:02:20 +08:00
wenjianzhang f150f3b10f Merge pull request #131 from wenjianzhang/v1-fixbug
fix: fix update password invalid
2020-06-21 13:00:58 +08:00
wenjianzhang 40127ac43c Merge pull request #129 from wenjianzhang/v1-fixbug
fix: fix update password invalid
2020-06-21 12:59:27 +08:00
zhangwenjian d73dbbf73c feat:Add file handling method 2020-06-19 22:47:56 +08:00
wenjianzhang 852333c56c Merge pull request #127 from wenjianzhang/v1-fixbug
feat: add global & logger
2020-06-19 22:21:03 +08:00
242 changed files with 13135 additions and 4933 deletions
+8
View File
@@ -1,4 +1,5 @@
.idea
.vscode
static/uploadfile
main.exe
go-admin
@@ -7,3 +8,10 @@ temp/
vendor
config/settings.dev.yml
go-admin
common/middleware/demo.go
config/settings.dev.*.yml
config/settings.dev.*.yml.log
temp/logs
config/settings.dev.yml.log
config/settings.b.dev.yml
cmd/migrate/migration/version_local/*
+29
View File
@@ -0,0 +1,29 @@
FROM golang:alpine as builder
MAINTAINER xxx
ENV GOPROXY https://goproxy.cn/
WORKDIR /go/release
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk add tzdata
COPY ./go.mod ./go.mod
RUN go mod download
COPY . .
RUN pwd && ls
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -a -installsuffix cgo -o go-admin .
FROM alpine
COPY --from=builder /go/release/go-admin /
COPY --from=builder /go/release/config/ /config/
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 8000
CMD ["/go-admin","server","-c", "/config/settings.yml"]
+83 -16
View File
@@ -16,14 +16,18 @@
</p>
[English](https://github.com/wenjianzhang/go-admin/blob/master/README.en.md) | 简体中文
[English](https://github.com/go-admin-team/go-admin/blob/master/README.en.md) | 简体中文
##### 基于Gin + Vue + Element UI的前后端分离权限管理系统
系统初始化极度简单,只需要配置文件中,修改数据库连接,系统启动后会自动初始化数据库信息以及必须的基础数据
[在线文档](https://wenjianzhang.github.io/go-admin-site)
[在线文档国际](https://wenjianzhang.github.io/go-admin-site)
[在线文档国内](http://mydearzwj.gitee.io/go-admin-site/)
[前端项目](https://github.com/go-admin-team/go-admin-ui)
[视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737)
@@ -86,21 +90,58 @@
[使用生成工具轻松实现业务](https://www.bilibili.com/video/BV1Dg4y1i79D)
[go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715)
[v1.1.0版本代码生成工具-释放双手](https://www.bilibili.com/video/BV1N54y1i71P) [进阶]
[多命令启动方式讲解以及IDE配置](https://www.bilibili.com/video/BV1Fg4y1q7ph)
[go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715) [必看]
[如何配置菜单信息以及接口信息](https://www.bilibili.com/video/BV1zv411B7nG) [必看]
[go-admin权限配置使用说明](https://www.bilibili.com/video/BV1rt4y197d3) [必看]
[go-admin数据权限使用说明](https://www.bilibili.com/video/BV1LK4y1s71e) [必看]
**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr ,视频教程和文档持续更新中**
## 🗞 系统架构
<p align="center">
<img src="https://gitee.com/mydearzwj/image/raw/d9f59ea603e3c8a3977491a1bfa8f122e1a80824/img/go-admin-system.png" width="936px" height="491px">
</p>
## 📦 本地开发
### 首次启动说明
### 开发目录创建
```bash
# 获取代码
git clone https://github.com/wenjianzhang/go-admin.git
# 进入工作路径
# 创建开发目录
mkdir goadmin
cd goadmin
```
### 获取代码
> 重点注意:两个项目必须放在同一文件夹下;
```bash
# 获取后端代码
git clone https://github.com/go-admin-team/go-admin.git
# 获取前端代码
git clone https://github.com/go-admin-team/go-admin-ui.git
```
### 启动说明
#### 服务端启动说明
```bash
# 进入 go-admin 后端项目
cd ./go-admin
# 编译项目
@@ -113,21 +154,33 @@ vi ./config/setting.yml
# 1. 配置文件中修改数据库信息
# 注意: settings.database 下对应的配置数据
# 2. 确认log路径
```
### 初始化数据库,以及服务启动
#### 初始化数据库,以及服务启动
```
# 首次配置需要初始化数据库资源信息
./go-admin init -c config/settings.yml -m dev
./go-admin migrate -c config/settings.yml
# 启动项目,也可以用IDE进行调试
./go-admin server -c config/settings.yml -p 8000 -m dev
./go-admin server -c config/settings.yml -p 8000
```
### 文档生成
#### 使用docker 编译启动
```shell
# 编译镜像
docker build -t go-admin .
# 启动容器,第一个go-admin是容器名字,第二个go-admin是镜像名称
docker run --name go-admin -p 8000:8000 -d go-admin
```
#### 文档生成
```bash
swag init
@@ -135,7 +188,7 @@ swag init
go get -u github.com/swaggo/swag/cmd/swag
```
### 交叉编译
#### 交叉编译
```bash
env GOOS=windows GOARCH=amd64 go build main.go
@@ -144,6 +197,18 @@ env GOOS=windows GOARCH=amd64 go build main.go
env GOOS=linux GOARCH=amd64 go build main.go
```
### UI交互端启动说明
```bash
# 安装依赖
npm install
# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org
# 启动服务
npm run dev
```
## 🎬 在线体验
> admin / 123456
@@ -187,11 +252,13 @@ env GOOS=linux GOARCH=amd64 go build main.go
## ❤️ 赞助者
zhuqiyun LLL狐
> 有部分是微信名称
zhuqiyun LLL狐 星星之火 cjj770 Sam 唐*i 晓聪 aLong *渊 海马 魏镇坪 + 111 *哥 我的宇哥哥 *声 *节
## 🔑 License
[MIT](https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md)
[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)
Copyright (c) 2020 wenjianzhang
-149
View File
@@ -1,149 +0,0 @@
package system
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
"net/http"
)
// @Summary 配置列表数据
// @Description 获取JSON
// @Tags 配置
// @Param configKey query string false "configKey"
// @Param configName query string false "configName"
// @Param configType query string false "configType"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/configList [get]
// @Security
func GetConfigList(c *gin.Context) {
var data models.SysConfig
var err error
var pageSize = 10
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools.StrToInt(err, size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools.StrToInt(err, index)
}
data.ConfigKey = c.Request.FormValue("configKey")
data.ConfigName = c.Request.FormValue("configName")
data.ConfigType = c.Request.FormValue("configType")
data.DataScope = tools.GetUserIdStr(c)
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
var mp = make(map[string]interface{}, 3)
mp["list"] = result
mp["count"] = count
mp["pageIndex"] = pageIndex
mp["pageSize"] = pageSize
var res app.Response
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
}
// @Summary 获取配置
// @Description 获取JSON
// @Tags 配置
// @Param configId path int true "配置编码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/config/{configId} [get]
// @Security
func GetConfig(c *gin.Context) {
var Config models.SysConfig
Config.ConfigId, _ = tools.StringToInt(c.Param("configId"))
result, err := Config.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
var res app.Response
res.Data = result
c.JSON(http.StatusOK, res.ReturnOK())
}
// @Summary 获取配置
// @Description 获取JSON
// @Tags 配置
// @Param configKey path int true "configKey"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/configKey/{configKey} [get]
// @Security
func GetConfigByConfigKey(c *gin.Context) {
var Config models.SysConfig
Config.ConfigKey = c.Param("configKey")
result, err := Config.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result,result.ConfigValue)
}
// @Summary 添加配置
// @Description 获取JSON
// @Tags 配置
// @Accept application/json
// @Product application/json
// @Param data body models.SysConfig true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/dict/data [post]
// @Security Bearer
func InsertConfig(c *gin.Context) {
var data models.SysConfig
err := c.BindWith(&data, binding.JSON)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c, result,"")
}
// @Summary 修改配置
// @Description 获取JSON
// @Tags 配置
// @Accept application/json
// @Product application/json
// @Param data body models.SysConfig true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/config [put]
// @Security Bearer
func UpdateConfig(c *gin.Context) {
var data models.SysConfig
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "数据解析失败", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.ConfigId)
tools.HasError(err, "", -1)
app.OK(c, result,"")
}
// @Summary 删除配置
// @Description 删除数据
// @Tags 配置
// @Param configId path int true "configId"
// @Success 200 {string} string "{"code": 200, "message": "删除成功"}"
// @Success 200 {string} string "{"code": -1, "message": "删除失败"}"
// @Router /api/v1/config/{configId} [delete]
func DeleteConfig(c *gin.Context) {
var data models.SysConfig
data.UpdateBy = tools.GetUserIdStr(c)
IDS := tools.IdsStrToIdsIntGroup("configId", c)
result, err := data.BatchDelete(IDS)
tools.HasError(err, "修改失败", 500)
app.OK(c, result, msg.DeletedSuccess)
}
-50
View File
@@ -1,50 +0,0 @@
package tools
import (
"bytes"
"github.com/gin-gonic/gin"
"go-admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
"net/http"
"text/template"
)
func Preview(c *gin.Context) {
table := tools.SysTables{}
id, err := tools2.StringToInt(c.Param("tableId"))
tools2.HasError(err, "", -1)
table.TableId = id
t1, err := template.ParseFiles("template/model.go.template")
tools2.HasError(err, "", -1)
t2, err := template.ParseFiles("template/api.go.template")
tools2.HasError(err, "", -1)
t3, err := template.ParseFiles("template/js.go.template")
tools2.HasError(err, "", -1)
t4, err := template.ParseFiles("template/vue.go.template")
tools2.HasError(err, "", -1)
t5, err := template.ParseFiles("template/router.go.template")
tools2.HasError(err, "", -1)
tab, _ := table.Get()
var b1 bytes.Buffer
err = t1.Execute(&b1, tab)
var b2 bytes.Buffer
err = t2.Execute(&b2, tab)
var b3 bytes.Buffer
err = t3.Execute(&b3, tab)
var b4 bytes.Buffer
err = t4.Execute(&b4, tab)
var b5 bytes.Buffer
err = t5.Execute(&b5, tab)
mp := make(map[string]interface{})
mp["template/model.go.template"] = b1.String()
mp["template/api.go.template"] = b2.String()
mp["template/js.go.template"] = b3.String()
mp["template/vue.go.template"] = b4.String()
mp["template/router.go.template"] = b5.String()
var res app.Response
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
}
@@ -1,12 +1,14 @@
package log
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"net/http"
)
// @Summary 登录日志列表
@@ -19,7 +21,7 @@ import (
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/loginloglist [get]
// @Security
// @Security Bearer
func GetLoginLogList(c *gin.Context) {
var data models.LoginLog
var err error
@@ -28,12 +30,12 @@ func GetLoginLogList(c *gin.Context) {
size := c.Request.FormValue("pageSize")
if size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
index := c.Request.FormValue("pageIndex")
if index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.Username = c.Request.FormValue("username")
@@ -59,7 +61,7 @@ func GetLoginLogList(c *gin.Context) {
// @Param infoId path int true "infoId"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/loginlog/{infoId} [get]
// @Security
// @Security Bearer
func GetLoginLog(c *gin.Context) {
var LoginLog models.LoginLog
LoginLog.InfoId, _ = tools.StringToInt(c.Param("infoId"))
@@ -1,12 +1,14 @@
package log
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"net/http"
)
// @Summary 登录日志列表
@@ -19,7 +21,7 @@ import (
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/operloglist [get]
// @Security
// @Security Bearer
func GetOperLogList(c *gin.Context) {
var data models.SysOperLog
var err error
@@ -28,12 +30,12 @@ func GetOperLogList(c *gin.Context) {
size := c.Request.FormValue("pageSize")
if size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
index := c.Request.FormValue("pageIndex")
if index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.OperName = c.Request.FormValue("operName")
@@ -60,7 +62,7 @@ func GetOperLogList(c *gin.Context) {
// @Param infoId path int true "infoId"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/operlog/{infoId} [get]
// @Security
// @Security Bearer
func GetOperLog(c *gin.Context) {
var OperLog models.SysOperLog
OperLog.OperId, _ = tools.StringToInt(c.Param("operId"))
@@ -1,12 +1,15 @@
package monitor
import (
"runtime"
"github.com/gin-gonic/gin"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"
"go-admin/tools"
"go-admin/tools/app"
"runtime"
)
const (
@@ -16,6 +19,11 @@ const (
GB = 1024 * MB
)
// @Summary 系统信息
// @Description 获取JSON
// @Tags 系统信息
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/settings/serverInfo [get]
func ServerInfo(c *gin.Context) {
osDic := make(map[string]interface{}, 0)
@@ -25,6 +33,8 @@ func ServerInfo(c *gin.Context) {
osDic["compiler"] = runtime.Compiler
osDic["version"] = runtime.Version()
osDic["numGoroutine"] = runtime.NumGoroutine()
osDic["ip"] = tools.GetLocaHonst()
osDic["projectDir"] = tools.GetCurrentPath()
dis, _ := disk.Usage("/")
diskTotalGB := int(dis.Total) / GB
@@ -45,9 +55,11 @@ func ServerInfo(c *gin.Context) {
memDic["usage"] = memUsedPercent
cpuDic := make(map[string]interface{}, 0)
cpuDic["cpuInfo"], _ = cpu.Info()
percent, _ := cpu.Percent(0, false)
cpuDic["Percent"] = tools.Round(percent[0], 2)
cpuDic["cpuNum"], _ = cpu.Counts(false)
app.Custum(c, gin.H{
"code": 200,
"os": osDic,
+104
View File
@@ -0,0 +1,104 @@
package public
import (
"encoding/base64"
"errors"
"fmt"
"io/ioutil"
"strings"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
imgType "github.com/shamsher31/goimgtype"
"go-admin/pkg/utils"
"go-admin/tools"
"go-admin/tools/app"
)
type FileResponse struct {
Size int64 `json:"size"`
Path string `json:"path"`
FullPath string `json:"full_path"`
Name string `json:"name"`
Type string `json:"type"`
}
// @Summary 上传图片
// @Description 获取JSON
// @Tags 公共接口
// @Accept multipart/form-data
// @Param type query string true "type" (1:单图,2:多图, 3:base64图片)
// @Param file formData file true "file"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/public/uploadFile [post]
func UploadFile(c *gin.Context) {
tag, _ := c.GetPostForm("type")
urlPerfix := fmt.Sprintf("http://%s/", c.Request.Host)
var fileResponse FileResponse
if tag == "" {
app.Error(c, 200, errors.New(""), "缺少标识")
return
} else {
switch tag {
case "1": // 单图
files, err := c.FormFile("file")
if err != nil {
app.Error(c, 200, errors.New(""), "图片不能为空")
return
}
// 上传文件至指定目录
guid := uuid.New().String()
singleFile := "static/uploadfile/" + guid + utils.GetExt(files.Filename)
_ = c.SaveUploadedFile(files, singleFile)
fileType, _ := imgType.Get(singleFile)
fileResponse = FileResponse{
Size: tools.GetFileSize(singleFile),
Path: singleFile,
FullPath: urlPerfix + singleFile,
Name: files.Filename,
Type: fileType,
}
app.OK(c, fileResponse, "上传成功")
return
case "2": // 多图
files := c.Request.MultipartForm.File["file"]
var multipartFile []FileResponse
for _, f := range files {
guid := uuid.New().String()
multipartFileName := "static/uploadfile/" + guid + utils.GetExt(f.Filename)
e := c.SaveUploadedFile(f, multipartFileName)
fileType, _ := imgType.Get(multipartFileName)
if e == nil {
multipartFile = append(multipartFile, FileResponse{
Size: tools.GetFileSize(multipartFileName),
Path: multipartFileName,
FullPath: urlPerfix + multipartFileName,
Name: f.Filename,
Type: fileType,
})
}
}
app.OK(c, multipartFile, "上传成功")
return
case "3": // base64
files, _ := c.GetPostForm("file")
file2list := strings.Split(files, ",")
ddd, _ := base64.StdEncoding.DecodeString(file2list[1])
guid := uuid.New().String()
base64File := "static/uploadfile/" + guid + ".jpg"
_ = ioutil.WriteFile(base64File, ddd, 0666)
typeStr := strings.Replace(strings.Replace(file2list[0], "data:", "", -1), ";base64", "", -1)
fileResponse = FileResponse{
Size: tools.GetFileSize(base64File),
Path: base64File,
FullPath: urlPerfix + base64File,
Name: "",
Type: typeStr,
}
app.OK(c, fileResponse, "上传成功")
}
}
}
+83
View File
@@ -0,0 +1,83 @@
package syscategory
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
)
func GetSysCategoryList(c *gin.Context) {
var data models.SysCategory
var err error
var pageSize = 10
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex, err = tools.StringToInt(index)
}
data.Name = c.Request.FormValue("name")
data.Status = c.Request.FormValue("status")
data.DataScope = tools.GetUserIdStr(c)
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
app.PageOK(c, result, count, pageIndex, pageSize, "")
}
func GetSysCategory(c *gin.Context) {
var data models.SysCategory
data.Id, _ = tools.StringToInt(c.Param("id"))
result, err := data.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result, "")
}
// @Summary 添加分类
// @Description 获取JSON
// @Tags 分类
// @Accept application/json
// @Product application/json
// @Param data body models.SysCategory true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/syscategory [post]
func InsertSysCategory(c *gin.Context) {
var data models.SysCategory
err := c.ShouldBindJSON(&data)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func UpdateSysCategory(c *gin.Context) {
var data models.SysCategory
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "数据解析失败", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.Id)
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func DeleteSysCategory(c *gin.Context) {
var data models.SysCategory
data.UpdateBy = tools.GetUserIdStr(c)
IDS := tools.IdsStrToIdsIntGroup("id", c)
_, err := data.BatchDelete(IDS)
tools.HasError(err, msg.DeletedFail, 500)
app.OK(c, nil, msg.DeletedSuccess)
}
+84
View File
@@ -0,0 +1,84 @@
package syscontent
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
)
func GetSysContentList(c *gin.Context) {
var data models.SysContent
var err error
var pageSize = 10
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex, err = tools.StringToInt(index)
}
data.CateId = c.Request.FormValue("cateId")
data.Name = c.Request.FormValue("name")
data.Status = c.Request.FormValue("status")
data.DataScope = tools.GetUserIdStr(c)
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
app.PageOK(c, result, count, pageIndex, pageSize, "")
}
func GetSysContent(c *gin.Context) {
var data models.SysContent
data.Id, _ = tools.StringToInt(c.Param("id"))
result, err := data.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result, "")
}
// @Summary 添加内容管理
// @Description 获取JSON
// @Tags 内容管理
// @Accept application/json
// @Product application/json
// @Param data body models.SysContent true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/syscontent [post]
func InsertSysContent(c *gin.Context) {
var data models.SysContent
err := c.ShouldBindJSON(&data)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func UpdateSysContent(c *gin.Context) {
var data models.SysContent
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "数据解析失败", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.Id)
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func DeleteSysContent(c *gin.Context) {
var data models.SysContent
data.UpdateBy = tools.GetUserIdStr(c)
IDS := tools.IdsStrToIdsIntGroup("id", c)
_, err := data.BatchDelete(IDS)
tools.HasError(err, msg.DeletedFail, 500)
app.OK(c, nil, msg.DeletedSuccess)
}
+71
View File
@@ -0,0 +1,71 @@
package sysfiledir
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
)
func GetSysFileDirList(c *gin.Context) {
var SysFileDir models.SysFileDir
SysFileDir.Label = c.Request.FormValue("label")
SysFileDir.PId, _ = tools.StringToInt(c.Request.FormValue("pid"))
SysFileDir.Id, _ = tools.StringToInt(c.Request.FormValue("id"))
SysFileDir.DataScope = tools.GetUserIdStr(c)
result, err := SysFileDir.SetSysFileDir()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result, "")
}
func GetSysFileDir(c *gin.Context) {
var data models.SysFileDir
data.Id, _ = tools.StringToInt(c.Param("id"))
result, err := data.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result, "")
}
// @Summary 添加SysFileDir
// @Description 获取JSON
// @Tags SysFileDir
// @Accept application/json
// @Product application/json
// @Param data body models.SysFileDir true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/sysfiledir [post]
func InsertSysFileDir(c *gin.Context) {
var data models.SysFileDir
err := c.ShouldBindJSON(&data)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func UpdateSysFileDir(c *gin.Context) {
var data models.SysFileDir
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "数据解析失败", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.Id)
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func DeleteSysFileDir(c *gin.Context) {
var data models.SysFileDir
data.UpdateBy = tools.GetUserIdStr(c)
IDS := tools.IdsStrToIdsIntGroup("id", c)
_, err := data.BatchDelete(IDS)
tools.HasError(err, msg.DeletedFail, 500)
app.OK(c, nil, msg.DeletedSuccess)
}
+77
View File
@@ -0,0 +1,77 @@
package sysfileinfo
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
)
func GetSysFileInfoList(c *gin.Context) {
var data models.SysFileInfo
var err error
var pageSize = 10
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize, err = tools.StringToInt(size)
}
tools.HasError(err, "", -1)
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex, err = tools.StringToInt(index)
}
tools.HasError(err, "", -1)
if pid := c.Request.FormValue("pId"); pid != "" {
data.PId, err = tools.StringToInt(pid)
}
tools.HasError(err, "", -1)
data.DataScope = tools.GetUserIdStr(c)
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
app.PageOK(c, result, count, pageIndex, pageSize, "")
}
func GetSysFileInfo(c *gin.Context) {
var data models.SysFileInfo
data.Id, _ = tools.StringToInt(c.Param("id"))
result, err := data.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c, result, "")
}
func InsertSysFileInfo(c *gin.Context) {
var data models.SysFileInfo
err := c.ShouldBindJSON(&data)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func UpdateSysFileInfo(c *gin.Context) {
var data models.SysFileInfo
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "数据解析失败", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.Id)
tools.HasError(err, "", -1)
app.OK(c, result, "")
}
func DeleteSysFileInfo(c *gin.Context) {
var data models.SysFileInfo
data.UpdateBy = tools.GetUserIdStr(c)
IDS := tools.IdsStrToIdsIntGroup("id", c)
_, err := data.BatchDelete(IDS)
tools.HasError(err, msg.DeletedFail, 500)
app.OK(c, nil, msg.DeletedSuccess)
}
+70
View File
@@ -0,0 +1,70 @@
package sysjob
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/service"
"go-admin/common/apis"
"go-admin/common/dto"
"go-admin/common/log"
"go-admin/tools"
"go-admin/tools/app"
)
type SysJob struct {
apis.Api
}
// RemoveJobForService 调用service实现
func (e *SysJob) RemoveJobForService(c *gin.Context) {
msgID := tools.GenerateMsgIDFromContext(c)
db, err := e.GetOrm(c)
if err != nil {
log.Errorf("msgID[%s] error:%s", msgID, err)
app.Error(c, 500, err, "")
return
}
var v dto.GeneralDelDto
err = c.BindUri(&v)
if err != nil {
log.Errorf("msgID[%s] 参数验证错误, error:%s", msgID, err)
app.Error(c, 422, err, "参数验证失败")
return
}
s := service.SysJob{}
s.MsgID = msgID
s.Orm = db
err = s.RemoveJob(&v)
if err != nil {
app.Error(c, 500, err, "")
return
}
app.OK(c, nil, s.Msg)
}
// StartJobForService 启动job service实现
func (e *SysJob) StartJobForService(c *gin.Context) {
msgID := tools.GenerateMsgIDFromContext(c)
db, err := e.GetOrm(c)
if err != nil {
log.Errorf("msgID[%s] error:%s", msgID, err)
app.Error(c, 500, err, "")
return
}
var v dto.GeneralGetDto
err = c.BindUri(&v)
if err != nil {
log.Errorf("msgID[%s] 参数验证错误, error:%s", msgID, err)
app.Error(c, 422, err, "参数验证失败")
return
}
s := service.SysJob{}
s.Orm = db
s.MsgID = msgID
err = s.StartJob(&v)
if err != nil {
app.Error(c, 500, err, "")
return
}
app.OK(c, nil, s.Msg)
}
@@ -2,6 +2,7 @@ package system
import (
"github.com/gin-gonic/gin"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/captcha"
@@ -3,7 +3,8 @@ package system
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/app/msg"
@@ -17,26 +18,26 @@ import (
// @Param position query string false "position"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/deptList [get]
// @Security
// @Security Bearer
func GetDeptList(c *gin.Context) {
var Dept models.Dept
var Dept models.SysDept
Dept.DeptName = c.Request.FormValue("deptName")
Dept.Status = c.Request.FormValue("status")
Dept.DeptId, _ = tools.StringToInt(c.Request.FormValue("deptId"))
Dept.DataScope = tools.GetUserIdStr(c)
result, err := Dept.SetDept(true)
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c,result,"")
app.OK(c, result, "")
}
func GetDeptTree(c *gin.Context) {
var Dept models.Dept
var Dept models.SysDept
Dept.DeptName = c.Request.FormValue("deptName")
Dept.Status= c.Request.FormValue("status")
Dept.Status = c.Request.FormValue("status")
Dept.DeptId, _ = tools.StringToInt(c.Request.FormValue("deptId"))
result, err := Dept.SetDept(false)
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c,result,"")
app.OK(c, result, "")
}
// @Summary 部门列表数据
@@ -46,14 +47,14 @@ func GetDeptTree(c *gin.Context) {
// @Param position query string false "position"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dept/{deptId} [get]
// @Security
// @Security Bearer
func GetDept(c *gin.Context) {
var Dept models.Dept
var Dept models.SysDept
Dept.DeptId, _ = tools.StringToInt(c.Param("deptId"))
Dept.DataScope = tools.GetUserIdStr(c)
result, err := Dept.Get()
tools.HasError(err, msg.NotFound, 404)
app.OK(c,result, msg.GetSuccess)
app.OK(c, result, msg.GetSuccess)
}
// @Summary 添加部门
@@ -61,19 +62,19 @@ func GetDept(c *gin.Context) {
// @Tags 部门
// @Accept application/json
// @Product application/json
// @Param data body models.Dept true "data"
// @Param data body models.SysDept true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/dept [post]
// @Security Bearer
func InsertDept(c *gin.Context) {
var data models.Dept
var data models.SysDept
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "", 500)
data.CreateBy = tools.GetUserIdStr(c)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c,result, msg.CreatedSuccess)
app.OK(c, result, msg.CreatedSuccess)
}
// @Summary 修改部门
@@ -82,19 +83,19 @@ func InsertDept(c *gin.Context) {
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body models.Dept true "body"
// @Param data body models.SysDept true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/dept [put]
// @Security Bearer
func UpdateDept(c *gin.Context) {
var data models.Dept
var data models.SysDept
err := c.BindJSON(&data)
tools.HasError(err, "", -1)
data.UpdateBy = tools.GetUserIdStr(c)
result, err := data.Update(data.DeptId)
tools.HasError(err, "", -1)
app.OK(c,result, msg.UpdatedSuccess)
app.OK(c, result, msg.UpdatedSuccess)
}
// @Summary 删除部门
@@ -105,15 +106,15 @@ func UpdateDept(c *gin.Context) {
// @Success 200 {string} string "{"code": -1, "message": "删除失败"}"
// @Router /api/v1/dept/{id} [delete]
func DeleteDept(c *gin.Context) {
var data models.Dept
var data models.SysDept
id, err := tools.StringToInt(c.Param("id"))
_, err = data.Delete(id)
tools.HasError(err, "删除失败", 500)
app.OK(c,"", msg.DeletedSuccess)
app.OK(c, "", msg.DeletedSuccess)
}
func GetDeptTreeRoleselect(c *gin.Context) {
var Dept models.Dept
var Dept models.SysDept
var SysRole models.SysRole
id, err := tools.StringToInt(c.Param("roleId"))
SysRole.RoleId = id
@@ -124,7 +125,7 @@ func GetDeptTreeRoleselect(c *gin.Context) {
menuIds, err = SysRole.GetRoleDeptId()
tools.HasError(err, "抱歉未找到相关信息", -1)
}
app.Custum(c,gin.H{
app.Custum(c, gin.H{
"code": 200,
"depts": result,
"checkedKeys": menuIds,
@@ -1,12 +1,14 @@
package dict
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"net/http"
)
// @Summary 字典数据列表
@@ -19,7 +21,7 @@ import (
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/data/list [get]
// @Security
// @Security Bearer
func GetDictDataList(c *gin.Context) {
var data models.DictData
var err error
@@ -27,11 +29,11 @@ func GetDictDataList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.DictLabel = c.Request.FormValue("dictLabel")
@@ -61,7 +63,7 @@ func GetDictDataList(c *gin.Context) {
// @Param dictCode path int true "字典编码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/data/{dictCode} [get]
// @Security
// @Security Bearer
func GetDictData(c *gin.Context) {
var DictData models.DictData
DictData.DictLabel = c.Request.FormValue("dictLabel")
@@ -79,7 +81,7 @@ func GetDictData(c *gin.Context) {
// @Param dictType path int true "dictType"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/databyType/{dictType} [get]
// @Security
// @Security Bearer
func GetDictDataByDictType(c *gin.Context) {
var DictData models.DictData
DictData.DictType = c.Param("dictType")
@@ -103,7 +105,7 @@ func GetDictDataByDictType(c *gin.Context) {
// @Security Bearer
func InsertDictData(c *gin.Context) {
var data models.DictData
err := c.BindWith(&data, binding.JSON)
err := c.ShouldBindJSON(&data)
data.CreateBy = tools.GetUserIdStr(c)
tools.HasError(err, "", 500)
result, err := data.Create()
@@ -148,5 +150,5 @@ func DeleteDictData(c *gin.Context) {
IDS := tools.IdsStrToIdsIntGroup("dictCode", c)
result, err := data.BatchDelete(IDS)
tools.HasError(err, "修改失败", 500)
app.OK(c,result,"删除成功")
app.OK(c, result, "删除成功")
}
@@ -1,12 +1,14 @@
package dict
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
"net/http"
)
// @Summary 字典类型列表数据
@@ -17,9 +19,9 @@ import (
// @Param dictType query string false "dictType"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Success 200 {object} app.PageResponse "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type/list [get]
// @Security
// @Security Bearer
func GetDictTypeList(c *gin.Context) {
var data models.DictType
var err error
@@ -27,11 +29,11 @@ func GetDictTypeList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.DictName = c.Request.FormValue("dictName")
@@ -42,15 +44,7 @@ func GetDictTypeList(c *gin.Context) {
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
var mp = make(map[string]interface{}, 3)
mp["list"] = result
mp["count"] = count
mp["pageIndex"] = pageIndex
mp["pageSize"] = pageSize
var res app.Response
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
app.PageOK(c, result, count, pageIndex, pageSize, "")
}
// @Summary 通过字典id获取字典类型
@@ -59,7 +53,7 @@ func GetDictTypeList(c *gin.Context) {
// @Param dictId path int true "字典类型编码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type/{dictId} [get]
// @Security
// @Security Bearer
func GetDictType(c *gin.Context) {
var DictType models.DictType
DictType.DictName = c.Request.FormValue("dictName")
@@ -1,6 +1,6 @@
package system
import(
import (
"github.com/gin-gonic/gin"
)
@@ -33,8 +33,7 @@ $(function(){
</html>
`
func HelloWorld(c *gin.Context){
func HelloWorld(c *gin.Context) {
c.Header("Content-Type", "text/html; charset=utf-8")
c.String(200, INDEX)
c.String(200, INDEX)
}
@@ -2,7 +2,8 @@ package system
import (
"github.com/gin-gonic/gin"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
)
@@ -3,7 +3,8 @@ package system
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
)
@@ -2,20 +2,22 @@ package system
import (
"github.com/gin-gonic/gin"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
)
// @Summary 职位列表数据
// @Summary 岗位列表数据
// @Description 获取JSON
// @Tags 职位
// @Param name query string false "name"
// @Param id query string false "id"
// @Param position query string false "position"
// @Tags 岗位
// @Param postName query string false "postName"
// @Param postCode query string false "postCode"
// @Param postId query string false "postId"
// @Param status query string false "status"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post [get]
// @Security
// @Security Bearer
func GetPostList(c *gin.Context) {
var data models.Post
var err error
@@ -23,42 +25,44 @@ func GetPostList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.PostName = c.Request.FormValue("postName")
id := c.Request.FormValue("postId")
data.PostId, _ = tools.StringToInt(id)
data.PostCode = c.Request.FormValue("postCode")
data.PostName = c.Request.FormValue("postName")
data.Status = c.Request.FormValue("status")
data.DataScope = tools.GetUserIdStr(c)
result, count, err := data.GetPage(pageSize, pageIndex)
tools.HasError(err, "", -1)
app.PageOK(c, result, count, pageIndex, pageSize, "")
}
// @Summary 获取字典数据
// @Summary 获取岗位信息
// @Description 获取JSON
// @Tags 字典数据
// @Tags 岗位
// @Param postId path int true "postId"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post/{postId} [get]
// @Security
// @Security Bearer
func GetPost(c *gin.Context) {
var Post models.Post
Post.PostId, _ = tools.StringToInt(c.Param("postId"))
result, err := Post.Get()
tools.HasError(err, "抱歉未找到相关信息", -1)
app.OK(c,result,"")
app.OK(c, result, "")
}
// @Summary 添加职位
// @Summary 添加岗位
// @Description 获取JSON
// @Tags 职位
// @Tags 岗位
// @Accept application/json
// @Product application/json
// @Param data body models.Post true "data"
@@ -73,15 +77,15 @@ func InsertPost(c *gin.Context) {
tools.HasError(err, "", 500)
result, err := data.Create()
tools.HasError(err, "", -1)
app.OK(c,result,"")
app.OK(c, result, "")
}
// @Summary 修改职位
// @Summary 修改岗位
// @Description 获取JSON
// @Tags 职位
// @Tags 岗位
// @Accept application/json
// @Product application/json
// @Param data body models.Dept true "body"
// @Param data body models.Post true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/post/ [put]
@@ -94,15 +98,15 @@ func UpdatePost(c *gin.Context) {
tools.HasError(err, "", -1)
result, err := data.Update(data.PostId)
tools.HasError(err, "", -1)
app.OK(c,result,"修改成功")
app.OK(c, result, "修改成功")
}
// @Summary 删除职位
// @Summary 删除岗位
// @Description 删除数据
// @Tags 职位
// @Tags 岗位
// @Param id path int true "id"
// @Success 200 {string} string "{"code": 200, "message": "删除成功"}"
// @Success 200 {string} string "{"code": -1, "message": "删除失败"}"
// @Success 500 {string} string "{"code": 500, "message": "删除失败"}"
// @Router /api/v1/post/{postId} [delete]
func DeletePost(c *gin.Context) {
var data models.Post
@@ -110,5 +114,5 @@ func DeletePost(c *gin.Context) {
IDS := tools.IdsStrToIdsIntGroup("postId", c)
result, err := data.BatchDelete(IDS)
tools.HasError(err, "删除失败", 500)
app.OK(c,result,"删除成功")
app.OK(c, result, "删除成功")
}
@@ -2,8 +2,9 @@ package system
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go-admin/models"
mycasbin "go-admin/pkg/casbin"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
)
@@ -18,7 +19,7 @@ import (
// @Param pageIndex query int false "页码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/rolelist [get]
// @Security
// @Security Bearer
func GetRoleList(c *gin.Context) {
var data models.SysRole
var err error
@@ -26,11 +27,11 @@ func GetRoleList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.RoleKey = c.Request.FormValue("roleKey")
@@ -75,14 +76,21 @@ func GetRole(c *gin.Context) {
func InsertRole(c *gin.Context) {
var data models.SysRole
data.CreateBy = tools.GetUserIdStr(c)
err := c.BindWith(&data, binding.JSON)
tools.HasError(err, "", 500)
err := c.Bind(&data)
tools.HasError(err, "数据解析失败", 500)
id, err := data.Insert()
tools.HasError(err, "", -1)
data.RoleId = id
tools.HasError(err, "", -1)
var t models.RoleMenu
_, err = t.Insert(id, data.MenuIds)
if len(data.MenuIds) > 0 {
_, err = t.Insert(id, data.MenuIds)
tools.HasError(err, "", -1)
}
_, err = mycasbin.LoadPolicy()
tools.HasError(err, "", -1)
app.OK(c, data, "添加成功")
}
@@ -104,9 +112,14 @@ func UpdateRole(c *gin.Context) {
tools.HasError(err, "", -1)
var t models.RoleMenu
_, err = t.DeleteRoleMenu(data.RoleId)
tools.HasError(err, "添加失败1", -1)
_, err2 := t.Insert(data.RoleId, data.MenuIds)
tools.HasError(err2, "添加失败2", -1)
tools.HasError(err, "修改失败(delete rm)", -1)
if len(data.MenuIds) > 0 {
_, err2 := t.Insert(data.RoleId, data.MenuIds)
tools.HasError(err2, "修改失败(insert)", -1)
}
_, err = mycasbin.LoadPolicy()
tools.HasError(err, "", -1)
app.OK(c, result, "修改成功")
}
@@ -141,9 +154,10 @@ func DeleteRole(c *gin.Context) {
IDS := tools.IdsStrToIdsIntGroup("roleId", c)
_, err := Role.BatchDelete(IDS)
tools.HasError(err, "删除失败1", -1)
var t models.RoleMenu
_, err = t.BatchDeleteRoleMenu(IDS)
tools.HasError(err, "删除失败1", -1)
tools.HasError(err, "删除失败", -1)
_, err = mycasbin.LoadPolicy()
tools.HasError(err, "", -1)
app.OK(c, "", "删除成功")
}
@@ -2,10 +2,12 @@ package system
import (
"fmt"
"github.com/gin-gonic/gin"
"go-admin/models"
"go-admin/tools/app"
"net/http"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/tools/app"
)
// @Summary RoleMenu列表数据
+67
View File
@@ -0,0 +1,67 @@
package system
import (
"errors"
"fmt"
"strings"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/tools"
"go-admin/tools/app"
)
// @Summary 查询系统信息
// @Description 获取JSON
// @Tags 系统信息
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/setting [get]
func GetSetting(c *gin.Context) {
var s models.SysSetting
r, e := s.Get()
if r.Logo != "" {
if !strings.HasPrefix(r.Logo, "http") {
r.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, r.Logo)
}
}
tools.HasError(e, "查询失败", 500)
app.OK(c, r, "查询成功")
}
// @Summary 更新或提交系统信息
// @Description 获取JSON
// @Tags 系统信息
// @Param data body models.SysUser true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/system/setting [post]
func CreateSetting(c *gin.Context) {
var s models.ResponseSystemConfig
if err := c.ShouldBind(&s); err != nil {
app.Error(c, 200, errors.New("缺少必要参数"), "")
return
}
var sModel models.SysSetting
sModel.Logo = s.Logo
sModel.Name = s.Name
a, e := sModel.Update()
if e != nil {
app.Error(c, 200, e, "")
return
}
if a.Logo != "" {
if !strings.HasPrefix(a.Logo, "http") {
a.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, a.Logo)
}
}
app.OK(c, a, "提交成功")
}
@@ -0,0 +1,43 @@
package sys_config
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/apis"
"go-admin/common/log"
"go-admin/tools"
"go-admin/tools/app"
)
type SysConfig struct {
apis.Api
}
// GetSysConfigByKEYForService 根据Key获取SysConfig的Service
func (e *SysConfig) GetSysConfigByKEYForService(c *gin.Context) {
msgID := tools.GenerateMsgIDFromContext(c)
db, err := e.GetOrm(c)
if err != nil {
log.Errorf("msgID[%s] error:%s", msgID, err)
app.Error(c, 500, err, "")
return
}
var v dto.SysConfigControl
err = c.Bind(&v)
if err != nil {
log.Errorf("msgID[%s] 参数验证错误, error:%s", msgID, err)
app.Error(c, 422, err, "参数验证失败")
return
}
s := service.SysConfig{}
s.MsgID = msgID
s.Orm = db
err = s.GetSysConfigByKEY(&v)
if err != nil {
app.Error(c, 500, err, "")
return
}
app.OK(c, v, s.Msg)
}
@@ -4,13 +4,14 @@ import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/google/uuid"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/common/global"
"go-admin/tools"
"go-admin/tools/app"
log "github.com/sirupsen/logrus"
)
// @Summary 列表数据
// @Summary 列表用户信息数据
// @Description 获取JSON
// @Tags 用户
// @Param username query string false "username"
@@ -26,15 +27,15 @@ func GetSysUserList(c *gin.Context) {
size := c.Request.FormValue("pageSize")
if size != "" {
pageSize = tools.StrToInt(err, size)
pageSize, err = tools.StringToInt(size)
}
index := c.Request.FormValue("pageIndex")
if index != "" {
pageIndex = tools.StrToInt(err, index)
pageIndex, err = tools.StringToInt(index)
}
data.Username = c.Request.FormValue("userName")
data.Username = c.Request.FormValue("username")
data.Status = c.Request.FormValue("status")
data.Phone = c.Request.FormValue("phone")
@@ -57,7 +58,7 @@ func GetSysUserList(c *gin.Context) {
// @Param userId path int true "用户编码"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sysUser/{userId} [get]
// @Security
// @Security Bearer
func GetSysUser(c *gin.Context) {
var SysUser models.SysUser
SysUser.UserId, _ = tools.StringToInt(c.Param("userId"))
@@ -83,12 +84,12 @@ func GetSysUser(c *gin.Context) {
})
}
// @Summary 获取当前登录用户
// @Summary 获取个人中心用户
// @Description 获取JSON
// @Tags 个人中心
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/profile [get]
// @Security
// @Security Bearer
func GetSysUserProfile(c *gin.Context) {
var SysUser models.SysUser
userId := tools.GetUserIdStr(c)
@@ -97,7 +98,7 @@ func GetSysUserProfile(c *gin.Context) {
tools.HasError(err, "抱歉未找到相关信息", -1)
var SysRole models.SysRole
var Post models.Post
var Dept models.Dept
var Dept models.SysDept
//获取角色列表
roles, err := SysRole.GetList()
//获取职位列表
@@ -128,7 +129,7 @@ func GetSysUserProfile(c *gin.Context) {
// @Tags 用户
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sysUser [get]
// @Security
// @Security Bearer
func GetSysUserInit(c *gin.Context) {
var SysRole models.SysRole
var Post models.Post
@@ -210,7 +211,7 @@ func InsetSysUserAvatar(c *gin.Context) {
guid := uuid.New().String()
filPath := "static/uploadfile/" + guid + ".jpg"
for _, file := range files {
log.Println(file.Filename)
global.Logger.Debug(file.Filename)
// 上传文件至指定目录
_ = c.SaveUploadedFile(file, filPath)
}
@@ -1,11 +1,13 @@
package tools
import (
"net/http"
"github.com/gin-gonic/gin"
"go-admin/models/tools"
"go-admin/app/admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
"net/http"
)
// @Summary 分页列表数据 / page list data
@@ -23,15 +25,15 @@ func GetDBColumnList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools2.StrToInt(err, size)
pageSize, err = tools2.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools2.StrToInt(err, index)
pageIndex, err = tools2.StringToInt(index)
}
data.TableName = c.Request.FormValue("tableName")
tools2.Assert(data.TableName=="","table name cannot be empty!",500)
tools2.Assert(data.TableName == "", "table name cannot be empty!", 500)
result, count, err := data.GetPage(pageSize, pageIndex)
tools2.HasError(err, "", -1)
@@ -1,12 +1,14 @@
package tools
import (
"net/http"
"github.com/gin-gonic/gin"
"go-admin/models/tools"
"go-admin/app/admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
config2 "go-admin/tools/config"
"net/http"
"go-admin/tools/config"
)
// @Summary 分页列表数据 / page list data
@@ -23,18 +25,18 @@ func GetDBTableList(c *gin.Context) {
var err error
var pageSize = 10
var pageIndex = 1
if config2.DatabaseConfig.Dbtype=="sqlite3"{
res.Msg="对不起,sqlite3 暂不支持代码生成!"
if config.DatabaseConfig.Driver == "sqlite3" || config.DatabaseConfig.Driver == "postgres" {
res.Msg = "对不起,sqlite3 或 postgres 不支持代码生成!"
c.JSON(http.StatusOK, res.ReturnError(500))
return
}
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools2.StrToInt(err, size)
pageSize, err = tools2.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools2.StrToInt(err, index)
pageIndex, err = tools2.StringToInt(index)
}
data.TableName = c.Request.FormValue("tableName")
@@ -47,7 +49,6 @@ func GetDBTableList(c *gin.Context) {
mp["pageIndex"] = pageIndex
mp["pageSize"] = pageSize
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
+408
View File
@@ -0,0 +1,408 @@
package tools
import (
"bytes"
"net/http"
"text/template"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/app/admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/config"
)
func Preview(c *gin.Context) {
table := tools.SysTables{}
id, err := tools2.StringToInt(c.Param("tableId"))
tools2.HasError(err, "", -1)
table.TableId = id
t1, err := template.ParseFiles("template/v3/model.go.template")
tools2.HasError(err, "", -1)
t2, err := template.ParseFiles("template/v3/no_actions/apis.go.template")
tools2.HasError(err, "", -1)
t3, err := template.ParseFiles("template/v3/js.go.template")
tools2.HasError(err, "", -1)
t4, err := template.ParseFiles("template/v3/vue.go.template")
tools2.HasError(err, "", -1)
t5, err := template.ParseFiles("template/v3/no_actions/router_check_role.go.template")
tools2.HasError(err, "", -1)
t6, err := template.ParseFiles("template/v3/dto.go.template")
tools2.HasError(err, "", -1)
tab, _ := table.Get()
var b1 bytes.Buffer
err = t1.Execute(&b1, tab)
var b2 bytes.Buffer
err = t2.Execute(&b2, tab)
var b3 bytes.Buffer
err = t3.Execute(&b3, tab)
var b4 bytes.Buffer
err = t4.Execute(&b4, tab)
var b5 bytes.Buffer
err = t5.Execute(&b5, tab)
var b6 bytes.Buffer
err = t6.Execute(&b6, tab)
mp := make(map[string]interface{})
mp["template/model.go.template"] = b1.String()
mp["template/api.go.template"] = b2.String()
mp["template/js.go.template"] = b3.String()
mp["template/vue.go.template"] = b4.String()
mp["template/router.go.template"] = b5.String()
mp["template/dto.go.template"] = b6.String()
var res app.Response
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
}
func GenCodeV3(c *gin.Context) {
table := tools.SysTables{}
id, err := tools2.StringToInt(c.Param("tableId"))
tools2.HasError(err, "", -1)
table.TableId = id
tab, _ := table.Get()
if tab.IsActions == 1 {
ActionsGenV3(tab)
} else {
NOActionsGenV3(tab)
}
app.OK(c, "", "Code generated successfully!")
}
func NOActionsGenV3(tab tools.SysTables) {
basePath := "template/v3/"
routerFile := basePath + "no_actions/router_check_role.go.template"
if tab.IsAuth == 2 {
routerFile = basePath + "no_actions/router_no_check_role.go.template"
}
t1, err := template.ParseFiles(basePath + "model.go.template")
tools2.HasError(err, "", -1)
t2, err := template.ParseFiles(basePath + "no_actions/apis.go.template")
tools2.HasError(err, "", -1)
t3, err := template.ParseFiles(routerFile)
tools2.HasError(err, "", -1)
t4, err := template.ParseFiles(basePath + "js.go.template")
tools2.HasError(err, "", -1)
t5, err := template.ParseFiles(basePath + "vue.go.template")
tools2.HasError(err, "", -1)
t6, err := template.ParseFiles(basePath + "dto.go.template")
tools2.HasError(err, "", -1)
t7, err := template.ParseFiles(basePath + "no_actions/service.go.template")
tools2.HasError(err, "", -1)
_ = tools2.PathCreate("./app/" + tab.PackageName + "/apis/" + tab.ModuleName)
_ = tools2.PathCreate("./app/" + tab.PackageName + "/models/")
_ = tools2.PathCreate("./app/" + tab.PackageName + "/router/")
_ = tools2.PathCreate("./app/" + tab.PackageName + "/service/dto/")
_ = tools2.PathCreate(config.GenConfig.FrontPath + "/api/")
_ = tools2.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName)
var b1 bytes.Buffer
err = t1.Execute(&b1, tab)
var b2 bytes.Buffer
err = t2.Execute(&b2, tab)
var b3 bytes.Buffer
err = t3.Execute(&b3, tab)
var b4 bytes.Buffer
err = t4.Execute(&b4, tab)
var b5 bytes.Buffer
err = t5.Execute(&b5, tab)
var b6 bytes.Buffer
err = t6.Execute(&b6, tab)
var b7 bytes.Buffer
err = t7.Execute(&b7, tab)
tools2.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go")
tools2.FileCreate(b2, "./app/"+tab.PackageName+"/apis/"+tab.ModuleName+"/"+tab.BusinessName+".go")
tools2.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go")
tools2.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js")
tools2.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue")
tools2.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go")
tools2.FileCreate(b7, "./app/"+tab.PackageName+"/service/"+tab.BusinessName+".go")
}
func ActionsGenV3(tab tools.SysTables) {
basePath := "template/v3/"
routerFile := basePath + "actions/router_check_role.go.template"
if tab.IsAuth == 2 {
routerFile = basePath + "actions/router_no_check_role.go.template"
}
t1, err := template.ParseFiles(basePath + "model.go.template")
tools2.HasError(err, "", -1)
t3, err := template.ParseFiles(routerFile)
tools2.HasError(err, "", -1)
t4, err := template.ParseFiles(basePath + "js.go.template")
tools2.HasError(err, "", -1)
t5, err := template.ParseFiles(basePath + "vue.go.template")
tools2.HasError(err, "", -1)
t6, err := template.ParseFiles(basePath + "dto.go.template")
tools2.HasError(err, "", -1)
_ = tools2.PathCreate("./app/" + tab.PackageName + "/models/")
_ = tools2.PathCreate("./app/" + tab.PackageName + "/router/")
_ = tools2.PathCreate("./app/" + tab.PackageName + "/service/dto/")
_ = tools2.PathCreate(config.GenConfig.FrontPath + "/api/")
_ = tools2.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName)
var b1 bytes.Buffer
err = t1.Execute(&b1, tab)
var b3 bytes.Buffer
err = t3.Execute(&b3, tab)
var b4 bytes.Buffer
err = t4.Execute(&b4, tab)
var b5 bytes.Buffer
err = t5.Execute(&b5, tab)
var b6 bytes.Buffer
err = t6.Execute(&b6, tab)
tools2.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go")
tools2.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go")
tools2.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js")
tools2.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue")
tools2.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go")
}
func GenMenuAndApi(c *gin.Context) {
table := tools.SysTables{}
timeNow := tools2.GetCurrentTime()
id, err := tools2.StringToInt(c.Param("tableId"))
tools2.HasError(err, "", -1)
table.TableId = id
tab, _ := table.Get()
Mmenu := models.Menu{}
Mmenu.MenuName = tab.TBName + "Manage"
Mmenu.Title = tab.TableComment
Mmenu.Icon = "pass"
Mmenu.Path = "/" + tab.TBName
Mmenu.MenuType = "M"
Mmenu.Action = "无"
Mmenu.ParentId = 0
Mmenu.NoCache = false
Mmenu.Component = "Layout"
Mmenu.Sort = 0
Mmenu.Visible = "0"
Mmenu.IsFrame = "0"
Mmenu.CreateBy = "1"
Mmenu.UpdateBy = "1"
Mmenu.CreatedAt = timeNow
Mmenu.UpdatedAt = timeNow
Mmenu.MenuId, err = Mmenu.Create()
Cmenu := models.Menu{}
Cmenu.MenuName = tab.TBName
Cmenu.Title = tab.TableComment
Cmenu.Icon = "pass"
Cmenu.Path = tab.TBName
Cmenu.MenuType = "C"
Cmenu.Action = "无"
Cmenu.Permission = tab.ModuleName + ":" + tab.BusinessName + ":list"
Cmenu.ParentId = Mmenu.MenuId
Cmenu.NoCache = false
Cmenu.Component = "/" + tab.BusinessName + "/index"
Cmenu.Sort = 0
Cmenu.Visible = "0"
Cmenu.IsFrame = "0"
Cmenu.CreateBy = "1"
Cmenu.UpdateBy = "1"
Cmenu.CreatedAt = timeNow
Cmenu.UpdatedAt = timeNow
Cmenu.MenuId, err = Cmenu.Create()
MList := models.Menu{}
MList.MenuName = ""
MList.Title = "分页获取" + tab.TableComment
MList.Icon = ""
MList.Path = tab.TBName
MList.MenuType = "F"
MList.Action = "无"
MList.Permission = tab.ModuleName + ":" + tab.BusinessName + ":query"
MList.ParentId = Cmenu.MenuId
MList.NoCache = false
MList.Sort = 0
MList.Visible = "0"
MList.IsFrame = "0"
MList.CreateBy = "1"
MList.UpdateBy = "1"
MList.CreatedAt = timeNow
MList.UpdatedAt = timeNow
MList.MenuId, err = MList.Create()
MCreate := models.Menu{}
MCreate.MenuName = ""
MCreate.Title = "创建" + tab.TableComment
MCreate.Icon = ""
MCreate.Path = tab.TBName
MCreate.MenuType = "F"
MCreate.Action = "无"
MCreate.Permission = tab.ModuleName + ":" + tab.BusinessName + ":add"
MCreate.ParentId = Cmenu.MenuId
MCreate.NoCache = false
MCreate.Sort = 0
MCreate.Visible = "0"
MCreate.IsFrame = "0"
MCreate.CreateBy = "1"
MCreate.UpdateBy = "1"
MCreate.CreatedAt = timeNow
MCreate.UpdatedAt = timeNow
MCreate.MenuId, err = MCreate.Create()
MUpdate := models.Menu{}
MUpdate.MenuName = ""
MUpdate.Title = "修改" + tab.TableComment
MUpdate.Icon = ""
MUpdate.Path = tab.TBName
MUpdate.MenuType = "F"
MUpdate.Action = "无"
MUpdate.Permission = tab.ModuleName + ":" + tab.BusinessName + ":edit"
MUpdate.ParentId = Cmenu.MenuId
MUpdate.NoCache = false
MUpdate.Sort = 0
MUpdate.Visible = "0"
MUpdate.IsFrame = "0"
MUpdate.CreateBy = "1"
MUpdate.UpdateBy = "1"
MUpdate.CreatedAt = timeNow
MUpdate.UpdatedAt = timeNow
MUpdate.MenuId, err = MUpdate.Create()
MDelete := models.Menu{}
MDelete.MenuName = ""
MDelete.Title = "删除" + tab.TableComment
MDelete.Icon = ""
MDelete.Path = tab.TBName
MDelete.MenuType = "F"
MDelete.Action = "无"
MDelete.Permission = tab.ModuleName + ":" + tab.BusinessName + ":remove"
MDelete.ParentId = Cmenu.MenuId
MDelete.NoCache = false
MDelete.Sort = 0
MDelete.Visible = "0"
MDelete.IsFrame = "0"
MDelete.CreateBy = "1"
MDelete.UpdateBy = "1"
MDelete.CreatedAt = timeNow
MDelete.UpdatedAt = timeNow
MDelete.MenuId, err = MDelete.Create()
var InterfaceId = 63
Amenu := models.Menu{}
Amenu.MenuName = tab.TBName
Amenu.Title = tab.TableComment
Amenu.Icon = "bug"
Amenu.Path = tab.TBName
Amenu.MenuType = "M"
Amenu.Action = "无"
Amenu.ParentId = InterfaceId
Amenu.NoCache = false
Amenu.Sort = 0
Amenu.Visible = "1"
Amenu.IsFrame = "0"
Amenu.CreateBy = "1"
Amenu.UpdateBy = "1"
Amenu.CreatedAt = timeNow
Amenu.UpdatedAt = timeNow
Amenu.MenuId, err = Amenu.Create()
AList := models.Menu{}
AList.MenuName = ""
AList.Title = "分页获取" + tab.TableComment
AList.Icon = "bug"
AList.Path = "/api/v1/" + tab.ModuleName
AList.MenuType = "A"
AList.Action = "GET"
AList.ParentId = Amenu.MenuId
AList.NoCache = false
AList.Sort = 0
AList.Visible = "1"
AList.IsFrame = "0"
AList.CreateBy = "1"
AList.UpdateBy = "1"
AList.CreatedAt = timeNow
AList.UpdatedAt = timeNow
AList.MenuId, err = AList.Create()
AGet := models.Menu{}
AGet.MenuName = ""
AGet.Title = "根据id获取" + tab.TableComment
AGet.Icon = "bug"
AGet.Path = "/api/v1/" + tab.ModuleName + "/:id"
AGet.MenuType = "A"
AGet.Action = "GET"
AGet.ParentId = Amenu.MenuId
AGet.NoCache = false
AGet.Sort = 0
AGet.Visible = "1"
AGet.IsFrame = "0"
AGet.CreateBy = "1"
AGet.UpdateBy = "1"
AGet.CreatedAt = timeNow
AGet.UpdatedAt = timeNow
AGet.MenuId, err = AGet.Create()
ACreate := models.Menu{}
ACreate.MenuName = ""
ACreate.Title = "创建" + tab.TableComment
ACreate.Icon = "bug"
ACreate.Path = "/api/v1/" + tab.ModuleName
ACreate.MenuType = "A"
ACreate.Action = "POST"
ACreate.ParentId = Amenu.MenuId
ACreate.NoCache = false
ACreate.Sort = 0
ACreate.Visible = "1"
ACreate.IsFrame = "0"
ACreate.CreateBy = "1"
ACreate.UpdateBy = "1"
ACreate.CreatedAt = timeNow
ACreate.UpdatedAt = timeNow
ACreate.MenuId, err = ACreate.Create()
AUpdate := models.Menu{}
AUpdate.MenuName = ""
AUpdate.Title = "修改" + tab.TableComment
AUpdate.Icon = "bug"
AUpdate.Path = "/api/v1/" + tab.ModuleName + "/:id"
AUpdate.MenuType = "A"
AUpdate.Action = "PUT"
AUpdate.ParentId = Amenu.MenuId
AUpdate.NoCache = false
AUpdate.Sort = 0
AUpdate.Visible = "1"
AUpdate.IsFrame = "0"
AUpdate.CreateBy = "1"
AUpdate.UpdateBy = "1"
AUpdate.CreatedAt = timeNow
AUpdate.UpdatedAt = timeNow
AUpdate.MenuId, err = AUpdate.Create()
ADelete := models.Menu{}
ADelete.MenuName = ""
ADelete.Title = "删除" + tab.TableComment
ADelete.Icon = "bug"
ADelete.Path = "/api/v1/" + tab.ModuleName
ADelete.MenuType = "A"
ADelete.Action = "DELETE"
ADelete.ParentId = Amenu.MenuId
ADelete.NoCache = false
ADelete.Sort = 0
ADelete.Visible = "1"
ADelete.IsFrame = "0"
ADelete.CreateBy = "1"
ADelete.UpdateBy = "1"
ADelete.CreatedAt = timeNow
ADelete.UpdatedAt = timeNow
ADelete.MenuId, err = ADelete.Create()
app.OK(c, "", "数据生成成功!")
}
@@ -1,12 +1,14 @@
package tools
import (
"github.com/gin-gonic/gin"
"go-admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models/tools"
tools2 "go-admin/tools"
"go-admin/tools/app"
)
// @Summary 分页列表数据
@@ -24,11 +26,11 @@ func GetSysTableList(c *gin.Context) {
var pageIndex = 1
if size := c.Request.FormValue("pageSize"); size != "" {
pageSize = tools2.StrToInt(err, size)
pageSize, err = tools2.StringToInt(size)
}
if index := c.Request.FormValue("pageIndex"); index != "" {
pageIndex = tools2.StrToInt(err, index)
pageIndex, err = tools2.StringToInt(index)
}
data.TBName = c.Request.FormValue("tableName")
@@ -54,7 +56,7 @@ func GetSysTableList(c *gin.Context) {
// @Param configKey path int true "configKey"
// @Success 200 {object} app.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys/tables/info/{tableId} [get]
// @Security
// @Security Bearer
func GetSysTables(c *gin.Context) {
var data tools.SysTables
data.TableId, _ = tools2.StringToInt(c.Param("tableId"))
@@ -64,12 +66,39 @@ func GetSysTables(c *gin.Context) {
var res app.Response
res.Data = result
mp := make(map[string]interface{})
mp["rows"] = result.Columns
mp["list"] = result.Columns
mp["info"] = result
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
}
func GetSysTablesInfo(c *gin.Context) {
var data tools.SysTables
if c.Request.FormValue("tableName") != "" {
data.TBName = c.Request.FormValue("tableName")
}
result, err := data.Get()
tools2.HasError(err, "抱歉未找到相关信息", -1)
var res app.Response
res.Data = result
mp := make(map[string]interface{})
mp["list"] = result.Columns
mp["info"] = result
res.Data = mp
c.JSON(http.StatusOK, res.ReturnOK())
}
func GetSysTablesTree(c *gin.Context) {
var data tools.SysTables
result, err := data.GetTree()
tools2.HasError(err, "抱歉未找到相关信息", -1)
var res app.Response
res.Data = result
c.JSON(http.StatusOK, res.ReturnOK())
}
// @Summary 添加表结构
// @Description 添加表结构
// @Tags 工具 - 生成表
@@ -112,9 +141,10 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
strStart := string([]byte(tablenamelist[i])[:1])
strend := string([]byte(tablenamelist[i])[1:])
data.ClassName += strings.ToUpper(strStart) + strend
data.PackageName += strings.ToLower(strStart) + strings.ToLower(strend)
//data.PackageName += strings.ToLower(strStart) + strings.ToLower(strend)
data.ModuleName += strings.ToLower(strStart) + strings.ToLower(strend)
}
data.PackageName = "admin"
data.TplCategory = "crud"
data.Crud = true
@@ -130,6 +160,9 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
data.IsLogicalDelete = "1"
data.LogicalDelete = true
data.LogicalDeleteColumn = "is_del"
data.IsActions = 1
data.IsDataScope = 1
data.IsAuth = 1
data.FunctionAuthor = "wenjianzhang"
for i := 0; i < len(dbcolumn); i++ {
@@ -158,6 +191,8 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
column.IsPk = "1"
column.Pk = true
data.PkColumn = dbcolumn[i].ColumnName
column.GoField = strings.ToUpper(column.GoField)
column.JsonField = strings.ToUpper(column.JsonField)
data.PkGoField = column.GoField
data.PkJsonField = column.JsonField
}
@@ -168,8 +203,20 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
}
if strings.Contains(dbcolumn[i].ColumnType, "int") {
column.GoType = "int"
if strings.Contains(dbcolumn[i].ColumnKey, "PR") {
column.GoType = "uint"
} else if strings.Contains(dbcolumn[i].ColumnType, "unsigned") {
column.GoType = "uint"
} else {
column.GoType = "string"
}
column.HtmlType = "input"
} else if strings.Contains(dbcolumn[i].ColumnType, "timestamp") {
column.GoType = "time.Time"
column.HtmlType = "datetime"
} else if strings.Contains(dbcolumn[i].ColumnType, "datetime") {
column.GoType = "time.Time"
column.HtmlType = "datetime"
} else {
column.GoType = "string"
column.HtmlType = "input"
@@ -185,7 +232,7 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
// @Tags 工具 - 生成表
// @Accept application/json
// @Product application/json
// @Param data body models.Dept true "body"
// @Param data body tools.SysTables true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/sys/tables/info [put]
@@ -193,7 +240,7 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables,
func UpdateSysTable(c *gin.Context) {
var data tools.SysTables
err := c.Bind(&data)
tools2.HasError(err, "数据解析失败", -1)
tools2.HasError(err, "数据解析失败", 500)
data.UpdateBy = tools2.GetUserIdStr(c)
result, err := data.Update()
tools2.HasError(err, "", -1)
@@ -1,10 +1,11 @@
package middleware
import (
"go-admin/handler"
"time"
"go-admin/app/admin/middleware/handler"
jwt "go-admin/pkg/jwtauth"
"go-admin/tools/config"
"time"
)
func AuthInit() (*jwt.GinJWTMiddleware, error) {
@@ -2,11 +2,12 @@ package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
func CustomError(c *gin.Context) {
@@ -26,7 +27,7 @@ func CustomError(c *gin.Context) {
}
c.Status(statusCode)
fmt.Println(
time.Now().Format("\n 2006-01-02 15:04:05.9999"),
time.Now().Format("2006-01-02 15:04:05"),
"[ERROR]",
c.Request.Method,
c.Request.URL,
+58
View File
@@ -0,0 +1,58 @@
package middleware
import (
"database/sql"
"errors"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"go-admin/common/config"
"go-admin/common/global"
"go-admin/common/middleware"
"go-admin/tools"
)
var WithContextDb = middleware.WithContextDb
func getGormFromDb(driver string, db *sql.DB, config *gorm.Config) (*gorm.DB, error) {
switch driver {
case "mysql":
return gorm.Open(mysql.New(mysql.Config{Conn: db}), config)
case "postgres":
return gorm.Open(postgres.New(postgres.Config{Conn: db}), config)
default:
return nil, errors.New("not support this db driver")
}
}
func GetGormFromConfig(cfg config.Conf) map[string]*gorm.DB {
gormDB := make(map[string]*gorm.DB)
if cfg.GetSaas() {
var err error
for k, v := range cfg.GetDbs() {
gormDB[k], err = getGormFromDb(v.Driver, v.DB, &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
global.Logger.Fatal(tools.Red(k+" connect error :"), err)
}
}
return gormDB
}
c := cfg.GetDb()
db, err := getGormFromDb(c.Driver, c.DB, &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
global.Logger.Fatal(tools.Red(c.Driver+" connect error :"), err)
}
gormDB["*"] = db
return gormDB
}
@@ -1,14 +1,17 @@
package handler
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
"github.com/mssola/user_agent"
"go-admin/models"
"go-admin/app/admin/models"
"go-admin/common/global"
jwt "go-admin/pkg/jwtauth"
"go-admin/tools"
log "github.com/sirupsen/logrus"
"net/http"
"go-admin/tools/config"
)
var store = base64Captcha.DefaultMemStore
@@ -43,60 +46,76 @@ func IdentityHandler(c *gin.Context) interface{} {
// @Summary 登陆
// @Description 获取token
// LoginHandler can be used by clients to get a jwt token.
// Payload needs to be json in the form of {"username": "USERNAME", "password": "PASSWORD"}.
// Reply will be of the form {"token": "TOKEN"}.
// @Description LoginHandler can be used by clients to get a jwt token.
// @Description Payload needs to be json in the form of {"username": "USERNAME", "password": "PASSWORD"}.
// @Description Reply will be of the form {"token": "TOKEN"}.
// @Description dev mode:It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password
// @Description 注意:开发模式:需要注意全部字段不能为空,账号密码外可以传入0值
// @Accept application/json
// @Product application/json
// @Param username body models.Login true "Add account"
// @Param account body models.Login true "account"
// @Success 200 {string} string "{"code": 200, "expire": "2019-08-07T12:45:48+08:00", "token": ".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A" }"
// @Router /login [post]
func Authenticator(c *gin.Context) (interface{}, error) {
var loginVals models.Login
var loginlog models.LoginLog
ua := user_agent.New(c.Request.UserAgent())
loginlog.Ipaddr = c.ClientIP()
location := tools.GetLocation(c.ClientIP())
loginlog.LoginLocation = location
loginlog.LoginTime = tools.GetCurrntTime()
loginlog.Status = "0"
loginlog.Remark = c.Request.UserAgent()
browserName, browserVersion := ua.Browser()
loginlog.Browser = browserName + " " + browserVersion
loginlog.Os = ua.OS()
loginlog.Msg = "登录成功"
loginlog.Platform = ua.Platform()
var status = "0"
var msg = "登录成功"
var username = ""
if err := c.ShouldBind(&loginVals); err != nil {
loginlog.Status = "1"
loginlog.Msg = "数据解析失败"
loginlog.Username = loginVals.Username
loginlog.Create()
username = loginVals.Username
msg = "数据解析失败"
status = "1"
LoginLogToDB(c, status, msg, username)
return nil, jwt.ErrMissingLoginValues
}
loginlog.Username = loginVals.Username
if !store.Verify(loginVals.UUID, loginVals.Code, true) {
loginlog.Status = "1"
loginlog.Msg = "验证码错误"
loginlog.Create()
return nil, jwt.ErrInvalidVerificationode
}
if config.ApplicationConfig.Mode != "dev" {
if !store.Verify(loginVals.UUID, loginVals.Code, true) {
username = loginVals.Username
msg = "验证码错误"
status = "1"
LoginLogToDB(c, status, msg, username)
return nil, jwt.ErrInvalidVerificationode
}
}
user, role, e := loginVals.GetUser()
if e == nil {
loginlog.Create()
username = loginVals.Username
LoginLogToDB(c, status, msg, username)
return map[string]interface{}{"user": user, "role": role}, nil
} else {
loginlog.Status = "1"
loginlog.Msg = "登录失败"
loginlog.Create()
log.Println(e.Error())
msg = "登录失败"
status = "1"
LoginLogToDB(c, status, msg, username)
global.RequestLogger.Println(e.Error())
}
return nil, jwt.ErrFailedAuthentication
}
// Write log to database
func LoginLogToDB(c *gin.Context, status string, msg string, username string) {
if config.LoggerConfig.EnabledDB {
var loginlog models.LoginLog
ua := user_agent.New(c.Request.UserAgent())
loginlog.Ipaddr = c.ClientIP()
loginlog.Username = username
location := tools.GetLocation(c.ClientIP())
loginlog.LoginLocation = location
loginlog.LoginTime = tools.GetCurrentTime()
loginlog.Status = status
loginlog.Remark = c.Request.UserAgent()
browserName, browserVersion := ua.Browser()
loginlog.Browser = browserName + " " + browserVersion
loginlog.Os = ua.OS()
loginlog.Msg = msg
loginlog.Platform = ua.Platform()
_, _ = loginlog.Create()
}
}
// @Summary 退出登录
// @Description 获取token
// LoginHandler can be used by clients to get a jwt token.
@@ -105,14 +124,14 @@ func Authenticator(c *gin.Context) (interface{}, error) {
// @Product application/json
// @Success 200 {string} string "{"code": 200, "msg": "成功退出系统" }"
// @Router /logout [post]
// @Security
// @Security Bearer
func LogOut(c *gin.Context) {
var loginlog models.LoginLog
ua := user_agent.New(c.Request.UserAgent())
loginlog.Ipaddr = c.ClientIP()
location := tools.GetLocation(c.ClientIP())
loginlog.LoginLocation = location
loginlog.LoginTime = tools.GetCurrntTime()
loginlog.LoginTime = tools.GetCurrentTime()
loginlog.Status = "0"
loginlog.Remark = c.Request.UserAgent()
browserName, browserVersion := ua.Browser()
@@ -122,6 +141,7 @@ func LogOut(c *gin.Context) {
loginlog.Username = tools.GetUserName(c)
loginlog.Msg = "退出成功"
loginlog.Create()
c.JSON(http.StatusOK, gin.H{
"code": 200,
"msg": "退出成功",
@@ -3,6 +3,7 @@ package handler
import (
"github.com/gin-gonic/gin"
"github.com/unrolled/secure"
"go-admin/tools/config"
)
@@ -10,7 +11,7 @@ func TlsHandler() gin.HandlerFunc {
return func(c *gin.Context) {
secureMiddleware := secure.New(secure.Options{
SSLRedirect: true,
SSLHost: config.ApplicationConfig.Domain,
SSLHost: config.SslConfig.Domain,
})
err := secureMiddleware.Process(c.Writer, c.Request)
if err != nil {
@@ -8,4 +8,4 @@ func Ping(c *gin.Context) {
c.JSON(200, gin.H{
"message": "ok",
})
}
}
@@ -1,9 +1,10 @@
package middleware
import (
"github.com/gin-gonic/gin"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
// NoCache is a middleware function that appends headers
@@ -2,10 +2,8 @@ package middleware
import (
"github.com/gin-gonic/gin"
)
func InitMiddleware(r *gin.Engine) {
// 日志处理
r.Use(LoggerToFile())
@@ -17,6 +15,4 @@ func InitMiddleware(r *gin.Engine) {
r.Use(Options)
// Secure is a middleware function that appends security
r.Use(Secure)
// Set X-Request-Id header
r.Use(RequestId())
}
}
@@ -1,13 +1,16 @@
package middleware
import (
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"go-admin/models"
"go-admin/tools"
config2 "go-admin/tools/config"
"fmt"
"strings"
"time"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/common/global"
"go-admin/tools"
config2 "go-admin/tools/config"
)
// 日志记录到文件
@@ -39,16 +42,18 @@ func LoggerToFile() gin.HandlerFunc {
clientIP := c.ClientIP()
// 日志格式
log.Infof(" %s %3d %13v %15s %s %s \r\n",
startTime.Format("2006-01-02 15:04:05.9999"),
fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n",
startTime.Format("2006-01-02 15:04:05"),
reqMethod,
reqUri,
statusCode,
latencyTime,
clientIP,
reqMethod,
reqUri,
)
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LogConfig.Operdb {
global.RequestLogger.Info(statusCode, latencyTime, clientIP, reqMethod, reqUri)
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB {
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime)
}
}
@@ -93,7 +98,7 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string
b, _ := c.Get("body")
sysOperLog.OperParam, _ = tools.StructToJsonStr(b)
sysOperLog.CreateBy = tools.GetUserName(c)
sysOperLog.OperTime = tools.GetCurrntTime()
sysOperLog.OperTime = tools.GetCurrentTime()
sysOperLog.LatencyTime = (latencyTime).String()
sysOperLog.UserAgent = c.Request.UserAgent()
if c.Err() == nil {
@@ -1,28 +1,33 @@
package middleware
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
mycasbin "go-admin/pkg/casbin"
"go-admin/pkg/jwtauth"
_ "go-admin/pkg/jwtauth"
"go-admin/tools"
log "github.com/sirupsen/logrus"
"net/http"
)
//权限检查中间件
func AuthCheckRole() gin.HandlerFunc {
return func(c *gin.Context) {
data, _ := c.Get("JWT_PAYLOAD")
data, _ := c.Get(jwtauth.JwtPayloadKey)
v := data.(jwtauth.MapClaims)
e, err := mycasbin.Casbin()
tools.HasError(err, "", 500)
e := mycasbin.Casbin()
//检查权限
res, err := e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method)
log.Println("----------------", v["rolekey"], c.Request.URL.Path, c.Request.Method)
tools.HasError(err, "", 500)
fmt.Printf("%s [INFO] %s %s %s \r\n",
tools.GetCurrentTimeStr(),
c.Request.Method,
c.Request.URL.Path,
v["rolekey"],
)
if res {
c.Next()
} else {
+16
View File
@@ -0,0 +1,16 @@
package models
//sys_casbin_rule
type CasbinRule struct {
PType string `json:"p_type" gorm:"size:100;"`
V0 string `json:"v0" gorm:"size:100;"`
V1 string `json:"v1" gorm:"size:100;"`
V2 string `json:"v2" gorm:"size:100;"`
V3 string `json:"v3" gorm:"size:100;"`
V4 string `json:"v4" gorm:"size:100;"`
V5 string `json:"v5" gorm:"size:100;"`
}
func (CasbinRule) TableName() string {
return "sys_casbin_rule"
}
+85
View File
@@ -0,0 +1,85 @@
package models
import (
"errors"
"fmt"
"gorm.io/gorm"
"go-admin/tools"
"go-admin/tools/config"
)
type DataPermission struct {
DataScope string
UserId int
DeptId int
RoleId int
}
func (e *DataPermission) GetDataScope(tbname string, table *gorm.DB) (*gorm.DB, error) {
if !config.ApplicationConfig.EnableDP {
usageStr := `数据权限已经为您` + tools.Green(`关闭`) + `,如需开启请参考配置文件字段说明`
fmt.Printf("%s\n", usageStr)
return table, nil
}
SysUser := new(SysUser)
SysRole := new(SysRole)
SysUser.UserId = e.UserId
user, err := SysUser.Get()
if err != nil {
return nil, errors.New("获取用户数据出错 msg:" + err.Error())
}
SysRole.RoleId = user.RoleId
role, err := SysRole.Get()
if err != nil {
return nil, errors.New("获取用户数据出错 msg:" + err.Error())
}
if role.DataScope == "2" {
table = table.Where(tbname+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId)
}
if role.DataScope == "3" {
table = table.Where(tbname+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId)
}
if role.DataScope == "4" {
table = table.Where(tbname+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(user.DeptId)+"%")
}
if role.DataScope == "5" || role.DataScope == "" {
table = table.Where(tbname+".create_by = ?", e.UserId)
}
return table, nil
}
func DataScopes(tableName string, userid int) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
SysUser := new(SysUser)
SysRole := new(SysRole)
SysUser.UserId = userid
user, err := SysUser.Get()
if err != nil {
db.Error = errors.New("获取用户数据出错 msg:" + err.Error())
return db
}
SysRole.RoleId = user.RoleId
role, err := SysRole.Get()
if err != nil {
db.Error = errors.New("获取用户数据出错 msg:" + err.Error())
return db
}
if role.DataScope == "2" {
return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId)
}
if role.DataScope == "3" {
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId)
}
if role.DataScope == "4" {
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(user.DeptId)+"%")
}
if role.DataScope == "5" || role.DataScope == "" {
return db.Where(tableName+".create_by = ?", userid)
}
return db
}
}
+62 -42
View File
@@ -2,30 +2,32 @@ package models
import (
"errors"
"go-admin/global/orm"
"go-admin/tools"
_ "time"
orm "go-admin/common/global"
"go-admin/tools"
)
type Dept struct {
DeptId int `json:"deptId" gorm:"primary_key;AUTO_INCREMENT"` //部门编码
ParentId int `json:"parentId" gorm:"type:int(11);"` //上级部门
DeptPath string `json:"deptPath" gorm:"type:varchar(255);"` //
DeptName string `json:"deptName" gorm:"type:varchar(128);"` //部门名称
Sort int `json:"sort" gorm:"type:int(4);"` //排序
Leader string `json:"leader" gorm:"type:varchar(128);"` //负责人
Phone string `json:"phone" gorm:"type:varchar(11);"` //手机
Email string `json:"email" gorm:"type:varchar(64);"` //邮箱
Status string `json:"status" gorm:"type:int(1);"` //状态
CreateBy string `json:"createBy" gorm:"type:varchar(64);"`
UpdateBy string `json:"updateBy" gorm:"type:varchar(64);"`
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
Children []Dept `json:"children" gorm:"-"`
type SysDept struct {
DeptId int `json:"deptId" gorm:"primary_key;auto_increment;"` //部门编码
ParentId int `json:"parentId" gorm:""` //上级部门
DeptPath string `json:"deptPath" gorm:"size:255;"` //
DeptName string `json:"deptName" gorm:"size:128;"` //部门名称
Sort int `json:"sort" gorm:""` //排序
Leader string `json:"leader" gorm:"size:128;"` //负责人
Phone string `json:"phone" gorm:"size:11;"` //手机
Email string `json:"email" gorm:"size:64;"` //邮箱
Status string `json:"status" gorm:"size:4;"` //状态
CreateBy string `json:"createBy" gorm:"size:64;"`
UpdateBy string `json:"updateBy" gorm:"size:64;"`
BaseModel
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
Children []SysDept `json:"children" gorm:"-"`
}
func (Dept) TableName() string {
func (SysDept) TableName() string {
return "sys_dept"
}
@@ -35,8 +37,8 @@ type DeptLable struct {
Children []DeptLable `gorm:"-" json:"children"`
}
func (e *Dept) Create() (Dept, error) {
var doc Dept
func (e *SysDept) Create() (SysDept, error) {
var doc SysDept
result := orm.Eloquent.Table(e.TableName()).Create(&e)
if result.Error != nil {
err := result.Error
@@ -44,7 +46,7 @@ func (e *Dept) Create() (Dept, error) {
}
deptPath := "/" + tools.IntToString(e.DeptId)
if int(e.ParentId) != 0 {
var deptP Dept
var deptP SysDept
orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.ParentId).First(&deptP)
deptPath = deptP.DeptPath + deptPath
} else {
@@ -52,7 +54,7 @@ func (e *Dept) Create() (Dept, error) {
}
var mp = map[string]string{}
mp["deptPath"] = deptPath
if err := orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.DeptId).Update(mp).Error; err != nil {
if err := orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.DeptId).Updates(mp).Error; err != nil {
err := result.Error
return doc, err
}
@@ -61,8 +63,8 @@ func (e *Dept) Create() (Dept, error) {
return doc, nil
}
func (e *Dept) Get() (Dept, error) {
var doc Dept
func (e *SysDept) Get() (SysDept, error) {
var doc SysDept
table := orm.Eloquent.Table(e.TableName())
if e.DeptId != 0 {
@@ -78,8 +80,8 @@ func (e *Dept) Get() (Dept, error) {
return doc, nil
}
func (e *Dept) GetList() ([]Dept, error) {
var doc []Dept
func (e *SysDept) GetList() ([]SysDept, error) {
var doc []SysDept
table := orm.Eloquent.Table(e.TableName())
if e.DeptId != 0 {
@@ -98,10 +100,10 @@ func (e *Dept) GetList() ([]Dept, error) {
return doc, nil
}
func (e *Dept) GetPage(bl bool) ([]Dept, error) {
var doc []Dept
func (e *SysDept) GetPage(bl bool) ([]SysDept, error) {
var doc []SysDept
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.DeptId != 0 {
table = table.Where("dept_id = ?", e.DeptId)
}
@@ -131,10 +133,10 @@ func (e *Dept) GetPage(bl bool) ([]Dept, error) {
return doc, nil
}
func (e *Dept) SetDept(bl bool) ([]Dept, error) {
func (e *SysDept) SetDept(bl bool) ([]SysDept, error) {
list, err := e.GetPage(bl)
m := make([]Dept, 0)
m := make([]SysDept, 0)
for i := 0; i < len(list); i++ {
if list[i].ParentId != 0 {
continue
@@ -146,16 +148,16 @@ func (e *Dept) SetDept(bl bool) ([]Dept, error) {
return m, err
}
func Digui(deptlist *[]Dept, menu Dept) Dept {
func Digui(deptlist *[]SysDept, menu SysDept) SysDept {
list := *deptlist
min := make([]Dept, 0)
min := make([]SysDept, 0)
for j := 0; j < len(list); j++ {
if menu.DeptId != list[j].ParentId {
continue
}
mi := Dept{}
mi := SysDept{}
mi.DeptId = list[j].DeptId
mi.ParentId = list[j].ParentId
mi.DeptPath = list[j].DeptPath
@@ -165,7 +167,7 @@ func Digui(deptlist *[]Dept, menu Dept) Dept {
mi.Phone = list[j].Phone
mi.Email = list[j].Email
mi.Status = list[j].Status
mi.Children = []Dept{}
mi.Children = []SysDept{}
ms := Digui(deptlist, mi)
min = append(min, ms)
@@ -174,14 +176,14 @@ func Digui(deptlist *[]Dept, menu Dept) Dept {
return menu
}
func (e *Dept) Update(id int) (update Dept, err error) {
func (e *SysDept) Update(id int) (update SysDept, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", id).First(&update).Error; err != nil {
return
}
deptPath := "/" + tools.IntToString(e.DeptId)
if int(e.ParentId) != 0 {
var deptP Dept
var deptP SysDept
orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.ParentId).First(&deptP)
deptPath = deptP.DeptPath + deptPath
} else {
@@ -203,23 +205,41 @@ func (e *Dept) Update(id int) (update Dept, err error) {
return
}
func (e *Dept) Delete(id int) (success bool, err error) {
func (e *SysDept) Delete(id int) (success bool, err error) {
user := SysUser{}
user.DeptId = id
userlist, err := user.GetList()
tools.HasError(err, "", 500)
tools.Assert(len(userlist) <= 0, "当前部门存在用户,不能删除!",500)
tools.Assert(len(userlist) <= 0, "当前部门存在用户,不能删除!", 500)
if err = orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", id).Delete(&Dept{}).Error; err != nil {
tx := orm.Eloquent.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err = tx.Error; err != nil {
success = false
return
}
if err = tx.Table(e.TableName()).Where("dept_id = ?", id).Delete(&SysDept{}).Error; err != nil {
success = false
tx.Rollback()
return
}
if err = tx.Commit().Error; err != nil {
success = false
return
}
success = true
return
}
func (dept *Dept) SetDeptLable() (m []DeptLable, err error) {
func (dept *SysDept) SetDeptLable() (m []DeptLable, err error) {
deptlist, err := dept.GetList()
m = make([]DeptLable, 0)
@@ -237,7 +257,7 @@ func (dept *Dept) SetDeptLable() (m []DeptLable, err error) {
return
}
func DiguiDeptLable(deptlist *[]Dept, dept DeptLable) DeptLable {
func DiguiDeptLable(deptlist *[]SysDept, dept DeptLable) DeptLable {
list := *deptlist
min := make([]DeptLable, 0)
@@ -2,27 +2,29 @@ package models
import (
"errors"
"go-admin/global/orm"
orm "go-admin/common/global"
"go-admin/tools"
)
type DictData struct {
DictCode int `gorm:"primary_key;AUTO_INCREMENT" json:"dictCode" example:"1"` //字典编码
DictSort int `gorm:"type:int(4);" json:"dictSort"` //显示顺序
DictLabel string `gorm:"type:varchar(128);" json:"dictLabel"` //数据标签
DictValue string `gorm:"type:varchar(255);" json:"dictValue"` //数据键值
DictType string `gorm:"type:varchar(64);" json:"dictType"` //字典类型
CssClass string `gorm:"type:varchar(128);" json:"cssClass"` //
ListClass string `gorm:"type:varchar(128);" json:"listClass"` //
IsDefault string `gorm:"type:varchar(8);" json:"isDefault"` //
Status string `gorm:"type:int(1);" json:"status"` //状态
Default string `gorm:"type:varchar(8);" json:"default"` //
CreateBy string `gorm:"type:varchar(64);" json:"createBy"` //
UpdateBy string `gorm:"type:varchar(64);" json:"updateBy"` //
Remark string `gorm:"type:varchar(255);" json:"remark"` //备注
DictCode int `gorm:"primary_key;auto_increment;" json:"dictCode" example:"1"` //字典编码
DictSort int `gorm:"" json:"dictSort"` //显示顺序
DictLabel string `gorm:"size:128;" json:"dictLabel"` //数据标签
DictValue string `gorm:"size:255;" json:"dictValue"` //数据键值
DictType string `gorm:"size:64;" json:"dictType"` //字典类型
CssClass string `gorm:"size:128;" json:"cssClass"` //
ListClass string `gorm:"size:128;" json:"listClass"` //
IsDefault string `gorm:"size:8;" json:"isDefault"` //
Status string `gorm:"size:4;" json:"status"` //状态
Default string `gorm:"size:8;" json:"default"` //
CreateBy string `gorm:"size:64;" json:"createBy"` //
UpdateBy string `gorm:"size:64;" json:"updateBy"` //
Remark string `gorm:"size:255;" json:"remark"` //备注
BaseModel
Params string `gorm:"-" json:"params"`
DataScope string `gorm:"-" json:"dataScope"`
BaseModel
}
func (DictData) TableName() string {
@@ -32,8 +34,13 @@ func (DictData) TableName() string {
func (e *DictData) Create() (DictData, error) {
var doc DictData
i := 0
orm.Eloquent.Table(e.TableName()).Where("dict_label=? or (dict_label=? and dict_value = ?)", e.DictLabel, e.DictValue).Count(&i)
var i int64
if err := orm.Eloquent.Table(e.TableName()).
Where("dict_type = ?", e.DictType).
Where("dict_label=? or (dict_label=? and dict_value = ?)", e.DictLabel, e.DictLabel, e.DictValue).
Count(&i).Error; err != nil {
return doc, err
}
if i > 0 {
return doc, errors.New("字典标签或者字典键值已经存在!")
}
@@ -90,7 +97,7 @@ func (e *DictData) Get() ([]DictData, error) {
func (e *DictData) GetPage(pageSize int, pageIndex int) ([]DictData, int, error) {
var doc []DictData
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.DictCode != 0 {
table = table.Where("dict_code = ?", e.DictCode)
}
@@ -111,13 +118,13 @@ func (e *DictData) GetPage(pageSize int, pageIndex int) ([]DictData, int, error)
if err != nil {
return nil, 0, err
}
var count int
var count int64
if err := table.Order("dict_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Order("dict_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, count, nil
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (e *DictData) Update(id int) (update DictData, err error) {
@@ -2,21 +2,25 @@ package models
import (
"errors"
"go-admin/global/orm"
"gorm.io/gorm"
orm "go-admin/common/global"
"go-admin/tools"
)
type DictType struct {
DictId int `gorm:"primary_key;AUTO_INCREMENT" json:"dictId"`
DictName string `gorm:"type:varchar(128);" json:"dictName"` //字典名称
DictType string `gorm:"type:varchar(128);" json:"dictType"` //字典类型
Status string `gorm:"type:int(1);" json:"status"` //状态
DataScope string `gorm:"-" json:"dataScope"` //
Params string `gorm:"-" json:"params"` //
CreateBy string `gorm:"type:varchar(11);" json:"createBy"` //创建者
UpdateBy string `gorm:"type:varchar(11);" json:"updateBy"` //更新者
Remark string `gorm:"type:varchar(255);" json:"remark"` //备注
DictId int `gorm:"primary_key;auto_increment;" json:"dictId"`
DictName string `gorm:"size:128;" json:"dictName"` //字典名称
DictType string `gorm:"size:128;" json:"dictType"` //字典类型
Status string `gorm:"size:4;" json:"status"` //状态
CreateBy string `gorm:"size:11;" json:"createBy"` //创建者
UpdateBy string `gorm:"size:11;" json:"updateBy"` //更新者
Remark string `gorm:"size:255;" json:"remark"` //备注
BaseModel
DataScope string `gorm:"-" json:"dataScope"` //
Params string `gorm:"-" json:"params"` //
}
func (DictType) TableName() string {
@@ -26,7 +30,7 @@ func (DictType) TableName() string {
func (e *DictType) Create() (DictType, error) {
var doc DictType
i := 0
var i int64
orm.Eloquent.Table(e.TableName()).Where("dict_name=? or dict_type = ?", e.DictName, e.DictType).Count(&i)
if i > 0 {
return doc, errors.New("字典名称或者字典类型已经存在!")
@@ -83,13 +87,14 @@ func (e *DictType) GetList() ([]DictType, error) {
func (e *DictType) GetPage(pageSize int, pageIndex int) ([]DictType, int, error) {
var doc []DictType
var db *gorm.DB
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.DictId != 0 {
table = table.Where("dict_id = ?", e.DictId)
db = db.Where("dict_id = ?", e.DictId)
}
if e.DictName != "" {
table = table.Where("dict_name = ?", e.DictName)
db = db.Where("dict_name = ?", e.DictName)
}
// 数据权限控制
@@ -99,13 +104,13 @@ func (e *DictType) GetPage(pageSize int, pageIndex int) ([]DictType, int, error)
if err != nil {
return nil, 0, err
}
var count int
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, count, nil
//table.Count(&count)
return doc, int(count), nil
}
func (e *DictType) Update(id int) (update DictType, err error) {
+177
View File
@@ -0,0 +1,177 @@
package models
import (
orm "go-admin/common/global"
"go-admin/tools"
)
type SysFileDir struct {
Id int `json:"id"`
Label string `json:"label" gorm:"type:varchar(255);"` // 名称
PId int `json:"pId" gorm:"type:int(11);"` // 父id
Sort int `json:"sort" gorm:""` //排序
Path string `json:"path" gorm:"size:255;"` //
CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建人
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 编辑人
Children []SysFileDir `json:"children" gorm:"-"`
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
BaseModel
}
func (SysFileDir) TableName() string {
return "sys_file_dir"
}
// 创建SysFileDir
func (e *SysFileDir) Create() (SysFileDir, error) {
var doc SysFileDir
result := orm.Eloquent.Table(e.TableName()).Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
path := "/" + tools.IntToString(e.Id)
if int(e.PId) != 0 {
var deptP SysFileDir
orm.Eloquent.Table(e.TableName()).Where("id = ?", e.PId).First(&deptP)
path = deptP.Path + path
} else {
path = "/0" + path
}
var mp = map[string]string{}
mp["path"] = path
if err := orm.Eloquent.Table(e.TableName()).Where("id = ?", e.Id).Updates(mp).Error; err != nil {
err := result.Error
return doc, err
}
doc = *e
doc.Path = path
return doc, nil
}
// 获取SysFileDir
func (e *SysFileDir) Get() (SysFileDir, error) {
var doc SysFileDir
table := orm.Eloquent.Table(e.TableName())
if e.Id != 0 {
table = table.Where("id = ?", e.Id)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
return doc, nil
}
// 获取SysFileDir带分页
func (e *SysFileDir) GetPage() ([]SysFileDir, int, error) {
var doc []SysFileDir
table := orm.Eloquent.Table(e.TableName())
// 数据权限控制(如果不需要数据权限请将此处去掉)
//dataPermission := new(DataPermission)
//dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
//table, err := dataPermission.GetDataScope(e.TableName(), table)
//if err != nil {
// return nil, 0, err
//}
var count int64
if err := table.Find(&doc).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
// 更新SysFileDir
func (e *SysFileDir) Update(id int) (update SysFileDir, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil {
return
}
path := "/" + tools.IntToString(e.Id)
if int(e.Id) != 0 {
var deptP SysFileDir
orm.Eloquent.Table(e.TableName()).Where("id = ?", e.Id).First(&deptP)
path = deptP.Path + path
} else {
path = "/0" + path
}
e.Path = path
//if e.Path != "" && e.Path != update.Path {
// return update, errors.New("上级不允许修改!")
//}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
return
}
return
}
// 删除SysFileDir
func (e *SysFileDir) Delete(id int) (success bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysFileDir{}).Error; err != nil {
success = false
return
}
success = true
return
}
//批量删除
func (e *SysFileDir) BatchDelete(id []int) (Result bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileDir{}).Error; err != nil {
return
}
Result = true
return
}
func (e *SysFileDir) SetSysFileDir() ([]SysFileDir, error) {
list, _, err := e.GetPage()
m := make([]SysFileDir, 0)
for i := 0; i < len(list); i++ {
if list[i].PId != 0 {
continue
}
info := SysFileDirDigui(&list, list[i])
m = append(m, info)
}
return m, err
}
func SysFileDirDigui(deptlist *[]SysFileDir, menu SysFileDir) SysFileDir {
list := *deptlist
min := make([]SysFileDir, 0)
for j := 0; j < len(list); j++ {
if menu.Id != list[j].PId {
continue
}
mi := SysFileDir{}
mi.Id = list[j].Id
mi.PId = list[j].PId
mi.Label = list[j].Label
mi.Sort = list[j].Sort
mi.CreatedAt = list[j].CreatedAt
mi.UpdatedAt = list[j].UpdatedAt
mi.Children = []SysFileDir{}
ms := SysFileDirDigui(deptlist, mi)
min = append(min, ms)
}
menu.Children = min
return menu
}
+88
View File
@@ -0,0 +1,88 @@
package gorm
import (
"gorm.io/gorm"
"go-admin/app/admin/models"
)
func InitData(db *gorm.DB) {
list := []models.CasbinRule{
{"p", "admin", "/api/v1/menulist", "GET", "", "", ""},
{"p", "admin", "/api/v1/menu", "POST", "", "", ""},
{"p", "admin", "/api/v1/dict/databytype/", "GET", "", "", ""},
{"p", "admin", "/api/v1/menu", "PUT", "", "", ""},
{"p", "admin", "/api/v1/menu/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/sysUserList", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysUser/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysUser/", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysUser", "POST", "", "", ""},
{"p", "admin", "/api/v1/sysUser", "PUT", "", "", ""},
{"p", "admin", "/api/v1/sysUser/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/user/profile", "GET", "", "", ""},
{"p", "admin", "/api/v1/rolelist", "GET", "", "", ""},
{"p", "admin", "/api/v1/role/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/role", "POST", "", "", ""},
{"p", "admin", "/api/v1/role", "PUT", "", "", ""},
{"p", "admin", "/api/v1/role/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/configList", "GET", "", "", ""},
{"p", "admin", "/api/v1/config/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/config", "POST", "", "", ""},
{"p", "admin", "/api/v1/config", "PUT", "", "", ""},
{"p", "admin", "/api/v1/config/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/menurole", "GET", "", "", ""},
{"p", "admin", "/api/v1/roleMenuTreeselect/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/menuTreeselect", "GET", "", "", ""},
{"p", "admin", "/api/v1/rolemenu", "GET", "", "", ""},
{"p", "admin", "/api/v1/rolemenu", "POST", "", "", ""},
{"p", "admin", "/api/v1/rolemenu/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/deptList", "GET", "", "", ""},
{"p", "admin", "/api/v1/dept/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/dept", "POST", "", "", ""},
{"p", "admin", "/api/v1/dept", "PUT", "", "", ""},
{"p", "admin", "/api/v1/dept/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/dict/datalist", "GET", "", "", ""},
{"p", "admin", "/api/v1/dict/data/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/dict/databytype/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/dict/data", "POST", "", "", ""},
{"p", "admin", "/api/v1/dict/data/", "PUT", "", "", ""},
{"p", "admin", "/api/v1/dict/data/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/dict/typelist", "GET", "", "", ""},
{"p", "admin", "/api/v1/dict/type/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/dict/type", "POST", "", "", ""},
{"p", "admin", "/api/v1/dict/type", "PUT", "", "", ""},
{"p", "admin", "/api/v1/dict/type/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/postlist", "GET", "", "", ""},
{"p", "admin", "/api/v1/post/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/post", "POST", "", "", ""},
{"p", "admin", "/api/v1/post", "PUT", "", "", ""},
{"p", "admin", "/api/v1/post/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/menu/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/menuids", "GET", "", "", ""},
{"p", "admin", "/api/v1/loginloglist", "GET", "", "", ""},
{"p", "admin", "/api/v1/loginlog/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/operloglist", "GET", "", "", ""},
{"p", "admin", "/api/v1/getinfo", "GET", "", "", ""},
{"p", "admin", "/api/v1/roledatascope", "PUT", "", "", ""},
{"p", "admin", "/api/v1/roleDeptTreeselect/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/deptTree", "GET", "", "", ""},
{"p", "admin", "/api/v1/configKey/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/logout", "POST", "", "", ""},
{"p", "admin", "/api/v1/user/avatar", "POST", "", "", ""},
{"p", "admin", "/api/v1/user/pwd", "PUT", "", "", ""},
{"p", "admin", "/api/v1/dict/typeoptionselect", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysjobList", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysjob/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/sysjob", "POST", "", "", ""},
{"p", "admin", "/api/v1/sysjob", "PUT", "", "", ""},
{"p", "admin", "/api/v1/sysjob/:id", "DELETE", "", "", ""},
{"p", "admin", "/api/v1/syssettingList", "GET", "", "", ""},
{"p", "admin", "/api/v1/syssetting/:id", "GET", "", "", ""},
{"p", "admin", "/api/v1/syssetting", "POST", "", "", ""},
{"p", "admin", "/api/v1/syssetting", "PUT", "", "", ""},
{"p", "admin", "/api/v1/syssetting/:id", "DELETE", "", "", ""},
}
db.Table("sys_casbin_rule").Create(list)
}
+19 -10
View File
@@ -2,31 +2,40 @@ package models
import (
"fmt"
"go-admin/global/orm"
config2 "go-admin/tools/config"
"gorm.io/gorm"
"io/ioutil"
"log"
"strings"
"go-admin/common/global"
)
func InitDb() error {
func InitDb(db *gorm.DB) (err error) {
filePath := "config/db.sql"
if config2.DatabaseConfig.Dbtype == "sqlite3" {
fmt.Println("sqlite3数据库无需初始化!")
return nil
err = ExecSql(db, filePath)
if global.Driver == "postgres" {
filePath = "config/pg.sql"
err = ExecSql(db, filePath)
}
return err
}
func ExecSql(db *gorm.DB, filePath string) error {
sql, err := Ioutil(filePath)
if err != nil {
fmt.Println("数据库基础数据初始化脚本读取失败!原因:", err.Error())
return err
}
sqlList := strings.Split(sql, ";")
for i := 0; i < len(sqlList) - 1; i++ {
for i := 0; i < len(sqlList)-1; i++ {
if strings.Contains(sqlList[i], "--") {
fmt.Println(sqlList[i])
continue
}
sql := strings.Replace(sqlList[i]+";", "\n", "", 0)
if err = orm.Eloquent.Exec(sql).Error; err != nil {
sql = strings.TrimSpace(sql)
if err = db.Exec(sql).Error; err != nil {
log.Printf("error sql: %s", sql)
if !strings.Contains(err.Error(), "Query was empty") {
return err
}
@@ -35,8 +44,8 @@ func InitDb() error {
return nil
}
func Ioutil(name string) (string, error) {
if contents, err := ioutil.ReadFile(name); err == nil {
func Ioutil(filePath string) (string, error) {
if contents, err := ioutil.ReadFile(filePath); err == nil {
//因为contents是[]byte类型,直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符
result := strings.Replace(string(contents), "\n", "", 1)
fmt.Println("Use ioutil.ReadFile to read a file:", result)
@@ -1,7 +1,7 @@
package models
import (
"go-admin/global/orm"
orm "go-admin/common/global"
"go-admin/tools"
)
@@ -1,26 +1,27 @@
package models
import (
"go-admin/global/orm"
"time"
orm "go-admin/common/global"
)
type LoginLog struct {
InfoId int `json:"infoId" gorm:"primary_key;AUTO_INCREMENT"` //主键
Username string `json:"username" gorm:"type:varchar(128);"` //用户名
Status string `json:"status" gorm:"type:int(1);"` //状态
Ipaddr string `json:"ipaddr" gorm:"type:varchar(255);"` //ip地址
LoginLocation string `json:"loginLocation" gorm:"type:varchar(255);"` //归属地
Browser string `json:"browser" gorm:"type:varchar(255);"` //浏览器
Os string `json:"os" gorm:"type:varchar(255);"` //系统
Platform string `json:"platform" gorm:"type:varchar(255);"` // 固件
LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;"` //登录时间
CreateBy string `json:"createBy" gorm:"type:varchar(128);"` //创建人
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` //更新者
DataScope string `json:"dataScope" gorm:"-"` //数据
Params string `json:"params" gorm:"-"` //
Remark string `json:"remark" gorm:"type:varchar(255);"` //备注
Msg string `json:"msg" gorm:"type:varchar(255);"`
InfoId int `json:"infoId" gorm:"primary_key;auto_increment;"` //主键
Username string `json:"username" gorm:"size:128;"` //用户名
Status string `json:"status" gorm:"size:4;"` //状态
Ipaddr string `json:"ipaddr" gorm:"size:255;"` //ip地址
LoginLocation string `json:"loginLocation" gorm:"size:255;"` //归属地
Browser string `json:"browser" gorm:"size:255;"` //浏览器
Os string `json:"os" gorm:"size:255;"` //系统
Platform string `json:"platform" gorm:"size:255;"` // 固件
LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;"` //登录时间
CreateBy string `json:"createBy" gorm:"size:128;"` //创建人
UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者
DataScope string `json:"dataScope" gorm:"-"` //数据
Params string `json:"params" gorm:"-"` //
Remark string `json:"remark" gorm:"size:255;"` //备注
Msg string `json:"msg" gorm:"size:255;"`
BaseModel
}
@@ -48,7 +49,7 @@ func (e *LoginLog) Get() (LoginLog, error) {
func (e *LoginLog) GetPage(pageSize int, pageIndex int) ([]LoginLog, int, error) {
var doc []LoginLog
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.Ipaddr != "" {
table = table.Where("ipaddr = ?", e.Ipaddr)
}
@@ -59,13 +60,13 @@ func (e *LoginLog) GetPage(pageSize int, pageIndex int) ([]LoginLog, int, error)
table = table.Where("userName = ?", e.Username)
}
var count int
var count int64
if err := table.Order("info_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Order("info_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, count, nil
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (e *LoginLog) Create() (LoginLog, error) {
+21 -19
View File
@@ -2,29 +2,30 @@ package models
import (
"errors"
"go-admin/global/orm"
orm "go-admin/common/global"
"go-admin/tools"
)
type Menu struct {
MenuId int `json:"menuId" gorm:"primary_key;AUTO_INCREMENT"`
MenuName string `json:"menuName" gorm:"type:varchar(128);"`
Title string `json:"title" gorm:"type:varchar(64);"`
Icon string `json:"icon" gorm:"type:varchar(128);"`
Path string `json:"path" gorm:"type:varchar(128);"`
Paths string `json:"paths" gorm:"type:varchar(128);"`
MenuType string `json:"menuType" gorm:"type:varchar(1);"`
Action string `json:"action" gorm:"type:varchar(16);"`
Permission string `json:"permission" gorm:"type:varchar(32);"`
ParentId int `json:"parentId" gorm:"type:int(11);"`
NoCache bool `json:"noCache" gorm:"type:char(1);"`
Breadcrumb string `json:"breadcrumb" gorm:"type:varchar(255);"`
Component string `json:"component" gorm:"type:varchar(255);"`
Sort int `json:"sort" gorm:"type:int(4);"`
Visible string `json:"visible" gorm:"type:char(1);"`
CreateBy string `json:"createBy" gorm:"type:varchar(128);"`
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"`
IsFrame string `json:"isFrame" gorm:"type:int(1);DEFAULT:0;"`
MenuName string `json:"menuName" gorm:"size:128;"`
Title string `json:"title" gorm:"size:128;"`
Icon string `json:"icon" gorm:"size:128;"`
Path string `json:"path" gorm:"size:128;"`
Paths string `json:"paths" gorm:"size:128;"`
MenuType string `json:"menuType" gorm:"size:1;"`
Action string `json:"action" gorm:"size:16;"`
Permission string `json:"permission" gorm:"size:255;"`
ParentId int `json:"parentId" gorm:"size:11;"`
NoCache bool `json:"noCache" gorm:"size:8;"`
Breadcrumb string `json:"breadcrumb" gorm:"size:255;"`
Component string `json:"component" gorm:"size:255;"`
Sort int `json:"sort" gorm:"size:4;"`
Visible string `json:"visible" gorm:"size:1;"`
CreateBy string `json:"createBy" gorm:"size:128;"`
UpdateBy string `json:"updateBy" gorm:"size:128;"`
IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"`
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
RoleId int `gorm:"-"`
@@ -44,7 +45,7 @@ type MenuLable struct {
}
type Menus struct {
MenuId int `json:"menuId" gorm:"column:menu_id;primary_key"`
MenuId int `json:"menuId" gorm:"column:menu_id;primary_key;"`
MenuName string `json:"menuName" gorm:"column:menu_name"`
Title string `json:"title" gorm:"column:title"`
Icon string `json:"icon" gorm:"column:icon"`
@@ -128,6 +129,7 @@ func DiguiMenu(menulist *[]Menu, menu Menu) Menu {
mi.Component = list[j].Component
mi.Sort = list[j].Sort
mi.Visible = list[j].Visible
mi.CreatedAt = list[j].CreatedAt
mi.Children = []Menu{}
if mi.MenuType != "F" {
+11
View File
@@ -0,0 +1,11 @@
package models
import (
"time"
)
type BaseModel struct {
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt *time.Time `json:"deletedAt"`
}
@@ -1,35 +1,36 @@
package models
import (
"go-admin/global/orm"
"time"
orm "go-admin/common/global"
)
//sys_operlog
type SysOperLog struct {
OperId int `json:"operId" gorm:"primary_key;AUTO_INCREMENT"` //日志编码
Title string `json:"title" gorm:"size(255);"` //操作模块
BusinessType string `json:"businessType" gorm:"type:varchar(128);"` //操作类型
BusinessTypes string `json:"businessTypes" gorm:"type:varchar(128);"`
Method string `json:"method" gorm:"type:varchar(128);"` //函数
RequestMethod string `json:"requestMethod" gorm:"type:varchar(128);"` //请求方式
OperatorType string `json:"operatorType" gorm:"type:varchar(128);"` //操作类型
OperName string `json:"operName" gorm:"type:varchar(128);"` //操作者
DeptName string `json:"deptName" gorm:"type:varchar(128);"` //部门名称
OperUrl string `json:"operUrl" gorm:"type:varchar(255);"` //访问地址
OperIp string `json:"operIp" gorm:"type:varchar(128);"` //客户端ip
OperLocation string `json:"operLocation" gorm:"type:varchar(128);"` //访问位置
OperParam string `json:"operParam" gorm:"type:varchar(255);"` //请求参数
Status string `json:"status" gorm:"type:int(1);"` //操作状态
OperTime time.Time `json:"operTime" gorm:"type:timestamp;"` //操作时间
JsonResult string `json:"jsonResult" gorm:"type:varchar(255);"` //返回数据
CreateBy string `json:"createBy" gorm:"type:varchar(128);"` //创建人
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` //更新者
DataScope string `json:"dataScope" gorm:"-"` //数据
Params string `json:"params" gorm:"-"` //参数
Remark string `json:"remark" gorm:"type:varchar(255);"` //备注
LatencyTime string `json:"latencyime" gorm:"type:varchar(128);"` //耗时
UserAgent string `json:"userAgent" gorm:"type:varchar(255);"` //ua
Title string `json:"title" gorm:"size:255;"` //操作模块
BusinessType string `json:"businessType" gorm:"size:128;"` //操作类型
BusinessTypes string `json:"businessTypes" gorm:"size:128;"`
Method string `json:"method" gorm:"size:128;"` //函数
RequestMethod string `json:"requestMethod" gorm:"size:128;"` //请求方式
OperatorType string `json:"operatorType" gorm:"size:128;"` //操作类型
OperName string `json:"operName" gorm:"size:128;"` //操作者
DeptName string `json:"deptName" gorm:"size:128;"` //部门名称
OperUrl string `json:"operUrl" gorm:"size:255;"` //访问地址
OperIp string `json:"operIp" gorm:"size:128;"` //客户端ip
OperLocation string `json:"operLocation" gorm:"size:128;"` //访问位置
OperParam string `json:"operParam" gorm:"size:255;"` //请求参数
Status string `json:"status" gorm:"size:4;"` //操作状态
OperTime time.Time `json:"operTime" gorm:"type:timestamp;"` //操作时间
JsonResult string `json:"jsonResult" gorm:"size:255;"` //返回数据
CreateBy string `json:"createBy" gorm:"size:128;"` //创建人
UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者
DataScope string `json:"dataScope" gorm:"-"` //数据
Params string `json:"params" gorm:"-"` //参数
Remark string `json:"remark" gorm:"size:255;"` //备注
LatencyTime string `json:"latencyime" gorm:"size:128;"` //耗时
UserAgent string `json:"userAgent" gorm:"size:255;"` //ua
BaseModel
}
@@ -57,7 +58,7 @@ func (e *SysOperLog) Get() (SysOperLog, error) {
func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, error) {
var doc []SysOperLog
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.OperIp != "" {
table = table.Where("oper_ip = ?", e.OperIp)
}
@@ -71,13 +72,13 @@ func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, er
table = table.Where("business_type = ?", e.BusinessType)
}
var count int
var count int64
if err := table.Order("oper_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Order("oper_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, count, nil
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (e *SysOperLog) Create() (SysOperLog, error) {
+18 -14
View File
@@ -1,22 +1,23 @@
package models
import (
"go-admin/global/orm"
orm "go-admin/common/global"
"go-admin/tools"
)
type Post struct {
PostId int `gorm:"primary_key;AUTO_INCREMENT" json:"postId"` //岗位编号
PostName string `gorm:"type:varchar(128);" json:"postName"` //岗位名称
PostCode string `gorm:"type:varchar(128);" json:"postCode"` //岗位代码
Sort int `gorm:"type:int(4);" json:"sort"` //岗位排序
Status string `gorm:"type:int(1);" json:"status"` //状态
Remark string `gorm:"type:varchar(255);" json:"remark"` //描述
CreateBy string `gorm:"type:varchar(128);" json:"createBy"`
UpdateBy string `gorm:"type:varchar(128);" json:"updateBy"`
PostName string `gorm:"size:128;" json:"postName"` //岗位名称
PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码
Sort int `gorm:"" json:"sort"` //岗位排序
Status string `gorm:"size:4;" json:"status"` //状态
Remark string `gorm:"size:255;" json:"remark"` //描述
CreateBy string `gorm:"size:128;" json:"createBy"`
UpdateBy string `gorm:"size:128;" json:"updateBy"`
BaseModel
DataScope string `gorm:"-" json:"dataScope"`
Params string `gorm:"-" json:"params"`
BaseModel
}
func (Post) TableName() string {
@@ -83,13 +84,16 @@ func (e *Post) GetList() ([]Post, error) {
func (e *Post) GetPage(pageSize int, pageIndex int) ([]Post, int, error) {
var doc []Post
table := orm.Eloquent.Select("*").Table(e.TableName())
table := orm.Eloquent.Table(e.TableName())
if e.PostId != 0 {
table = table.Where("post_id = ?", e.PostId)
}
if e.PostName != "" {
table = table.Where("post_name = ?", e.PostName)
}
if e.PostCode != "" {
table = table.Where("post_code = ?", e.PostCode)
}
if e.Status != "" {
table = table.Where("status = ?", e.Status)
}
@@ -101,13 +105,13 @@ func (e *Post) GetPage(pageSize int, pageIndex int) ([]Post, int, error) {
if err != nil {
return nil, 0, err
}
var count int
var count int64
if err := table.Order("sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Order("sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("`deleted_at` IS NULL").Count(&count)
return doc, count, nil
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (e *Post) Update(id int) (update Post, err error) {
+230
View File
@@ -0,0 +1,230 @@
package models
import (
"github.com/pkg/errors"
"gorm.io/gorm"
orm "go-admin/common/global"
"go-admin/tools"
)
type SysRole struct {
RoleId int `json:"roleId" gorm:"primary_key;AUTO_INCREMENT"` // 角色编码
RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称
Status string `json:"status" gorm:"size:4;"` //
RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码
RoleSort int `json:"roleSort" gorm:""` //角色排序
Flag string `json:"flag" gorm:"size:128;"` //
CreateBy string `json:"createBy" gorm:"size:128;"` //
UpdateBy string `json:"updateBy" gorm:"size:128;"` //
Remark string `json:"remark" gorm:"size:255;"` //备注
Admin bool `json:"admin" gorm:"size:4;"`
DataScope string `json:"dataScope" gorm:"size:128;"`
BaseModel
Params string `json:"params" gorm:"-"`
MenuIds []int `json:"menuIds" gorm:"-"`
DeptIds []int `json:"deptIds" gorm:"-"`
}
func (SysRole) TableName() string {
return "sys_role"
}
type MenuIdList struct {
MenuId int `json:"menuId"`
}
func (role *SysRole) GetById(tx *gorm.DB, id interface{}) error {
return tx.First(role, id).Error
}
func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error) {
var doc []SysRole
table := orm.Eloquent.Table("sys_role")
if role.RoleId != 0 {
table = table.Where("role_id = ?", role.RoleId)
}
if role.RoleName != "" {
table = table.Where("role_name = ?", role.RoleName)
}
if role.Status != "" {
table = table.Where("status = ?", role.Status)
}
if role.RoleKey != "" {
table = table.Where("role_key = ?", role.RoleKey)
}
// 数据权限控制
dataPermission := new(DataPermission)
dataPermission.UserId, _ = tools.StringToInt(role.DataScope)
table, err := dataPermission.GetDataScope("sys_role", table)
if err != nil {
return nil, 0, err
}
var count int64
if err := table.Order("role_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (role *SysRole) Get() (SysRole SysRole, err error) {
table := orm.Eloquent.Table("sys_role")
if role.RoleId != 0 {
table = table.Where("role_id = ?", role.RoleId)
}
if role.RoleName != "" {
table = table.Where("role_name = ?", role.RoleName)
}
if err = table.First(&SysRole).Error; err != nil {
return
}
return
}
func (role *SysRole) GetList() (SysRole []SysRole, err error) {
table := orm.Eloquent.Table("sys_role")
if role.RoleId != 0 {
table = table.Where("role_id = ?", role.RoleId)
}
if role.RoleName != "" {
table = table.Where("role_name = ?", role.RoleName)
}
if err = table.Order("role_sort").Find(&SysRole).Error; err != nil {
return
}
return
}
// 获取角色对应的菜单ids
func (role *SysRole) GetRoleMeunId() ([]int, error) {
menuIds := make([]int, 0)
menuList := make([]MenuIdList, 0)
if err := orm.Eloquent.Table("sys_role_menu").Select("sys_role_menu.menu_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", role.RoleId).Find(&menuList).Error; err != nil {
return nil, err
}
for i := 0; i < len(menuList); i++ {
menuIds = append(menuIds, menuList[i].MenuId)
}
return menuIds, nil
}
func (role *SysRole) Insert() (id int, err error) {
var i int64
orm.Eloquent.Table(role.TableName()).Where("role_name=? or role_key = ?", role.RoleName, role.RoleKey).Count(&i)
if i > 0 {
return 0, errors.New("角色名称或者角色标识已经存在!")
}
role.UpdateBy = ""
result := orm.Eloquent.Table(role.TableName()).Create(&role)
if result.Error != nil {
err = result.Error
return
}
id = role.RoleId
return
}
type DeptIdList struct {
DeptId int `json:"DeptId"`
}
func (role *SysRole) GetRoleDeptId() ([]int, error) {
deptIds := make([]int, 0)
deptList := make([]DeptIdList, 0)
if err := orm.Eloquent.Table("sys_role_dept").Select("sys_role_dept.dept_id").Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", role.RoleId).Find(&deptList).Error; err != nil {
return nil, err
}
for i := 0; i < len(deptList); i++ {
deptIds = append(deptIds, deptList[i].DeptId)
}
return deptIds, nil
}
//修改
func (role *SysRole) Update(id int) (update SysRole, err error) {
if err = orm.Eloquent.Table(role.TableName()).First(&update, id).Error; err != nil {
return
}
if role.RoleName != "" && role.RoleName != update.RoleName {
return update, errors.New("角色名称不允许修改!")
}
if role.RoleKey != "" && role.RoleKey != update.RoleKey {
return update, errors.New("角色标识不允许修改!")
}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table(role.TableName()).Model(&update).Updates(&role).Error; err != nil {
return
}
return
}
//批量删除
func (role *SysRole) BatchDelete(id []int) (Result bool, err error) {
tx := orm.Eloquent.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return false, err
}
// 查询角色
var roles []SysRole
if err := tx.Table("sys_role").Where("role_id in (?)", id).Find(&roles).Error; err != nil {
tx.Rollback()
return false, err
}
var count int64
if err := tx.Table("sys_user").Where("role_id in (?)", id).Count(&count).Error; err != nil {
tx.Rollback()
return false, err
}
if count > 0 {
tx.Rollback()
return false, errors.New("存在绑定用户,请解绑后重试")
}
// 删除角色
if err = tx.Table(role.TableName()).Where("role_id in (?)", id).Unscoped().Delete(&SysRole{}).Error; err != nil {
tx.Rollback()
return false, err
}
// 删除角色菜单
if err := tx.Table("sys_role_menu").Where("role_id in (?)", id).Delete(&RoleMenu{}).Error; err != nil {
tx.Rollback()
return false, err
}
// 删除casbin配置
for i := 0; i < len(roles); i++ {
if err := tx.Table("sys_casbin_rule").Where("v0 in (?)", roles[0].RoleKey).Delete(&CasbinRule{}).Error; err != nil {
tx.Rollback()
return false, err
}
}
if err := tx.Commit().Error; err != nil {
return false, err
}
return true, nil
}
@@ -2,13 +2,14 @@ package models
import (
"fmt"
"go-admin/global/orm"
orm "go-admin/common/global"
)
//sys_role_dept
type SysRoleDept struct {
RoleId int `gorm:"type:int(11)"`
DeptId int `gorm:"type:int(11)"`
RoleId int `gorm:""`
DeptId int `gorm:""`
}
func (SysRoleDept) TableName() string {
+234
View File
@@ -0,0 +1,234 @@
package models
import (
"fmt"
orm "go-admin/common/global"
"go-admin/tools"
)
type RoleMenu struct {
RoleId int `gorm:""`
MenuId int `gorm:""`
RoleName string `gorm:"size:128)"`
CreateBy string `gorm:"size:128)"`
UpdateBy string `gorm:"size:128)"`
}
func (RoleMenu) TableName() string {
return "sys_role_menu"
}
type MenuPath struct {
Path string `json:"path"`
}
func (rm *RoleMenu) Get() ([]RoleMenu, error) {
var r []RoleMenu
table := orm.Eloquent.Table("sys_role_menu")
if rm.RoleId != 0 {
table = table.Where("role_id = ?", rm.RoleId)
}
if err := table.Find(&r).Error; err != nil {
return nil, err
}
return r, nil
}
func (rm *RoleMenu) GetPermis() ([]string, error) {
var r []Menu
table := orm.Eloquent.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id")
table = table.Where("role_id = ?", rm.RoleId)
table = table.Where("sys_menu.menu_type in('F','C')")
if err := table.Find(&r).Error; err != nil {
return nil, err
}
var list []string
for i := 0; i < len(r); i++ {
list = append(list, r[i].Permission)
}
return list, nil
}
func (rm *RoleMenu) GetIDS() ([]MenuPath, error) {
var r []MenuPath
table := orm.Eloquent.Select("sys_menu.path").Table("sys_role_menu")
table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName)
if err := table.Find(&r).Error; err != nil {
return nil, err
}
return r, nil
}
func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) {
tx := orm.Eloquent.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return false, err
}
if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
tx.Rollback()
return false, err
}
if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
tx.Rollback()
return false, err
}
var role SysRole
if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
tx.Rollback()
return false, err
}
sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';"
if err := tx.Exec(sql3).Error; err != nil {
tx.Rollback()
return false, err
}
if err := tx.Commit().Error; err != nil {
return false, err
}
return true, nil
}
// 该方法即将弃用
func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) {
tx := orm.Eloquent.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return false, err
}
if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
tx.Rollback()
return false, err
}
var role []SysRole
if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
tx.Rollback()
return false, err
}
sql := ""
for i := 0; i < len(role); i++ {
sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';"
}
if err := tx.Exec(sql).Error; err != nil {
tx.Rollback()
return false, err
}
if err := tx.Commit().Error; err != nil {
return false, err
}
return true, nil
}
func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
var (
role SysRole
menu []Menu
casbinRuleQueue []CasbinRule // casbinRule 待插入队列
)
// 开始事务
tx := orm.Eloquent.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return false, err
}
// 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
tx.Rollback()
return false, err
}
if err := tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
tx.Rollback()
return false, err
}
//ORM不支持批量插入所以需要拼接 sql 串
sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES "
casbinRuleSql := "INSERT INTO `sys_casbin_rule` (`p_type`,`v0`,`v1`,`v2`) VALUES "
for i, m := range menu {
// 拼装'role_menu'表批量插入SQL语句
sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey)
if i == len(menu)-1 {
sysRoleMenuSql += ";" //最后一条数据 以分号结尾
} else {
sysRoleMenuSql += ","
}
if m.MenuType == "A" {
// 加入队列
casbinRuleQueue = append(casbinRuleQueue,
CasbinRule{
V0: role.RoleKey,
V1: m.Path,
V2: m.Action,
})
}
}
// 执行批量插入sys_role_menu
if err := tx.Exec(sysRoleMenuSql).Error; err != nil {
tx.Rollback()
return false, err
}
// 拼装'sys_casbin_rule'批量插入SQL语句
// TODO: casbinRuleQueue队列不为空时才会拼装,否则直接忽略不执行'for'循环
for i, v := range casbinRuleQueue {
casbinRuleSql += fmt.Sprintf("('p','%s','%s','%s')", v.V0, v.V1, v.V2)
if i == len(casbinRuleQueue)-1 {
casbinRuleSql += ";"
} else {
casbinRuleSql += ","
}
}
// 执行批量插入sys_casbin_rule
if len(casbinRuleQueue) > 0 {
if err := tx.Exec(casbinRuleSql).Error; err != nil {
tx.Rollback()
return false, err
}
}
if err := tx.Commit().Error; err != nil {
return false, err
}
return true, nil
}
func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) {
rm.RoleId, _ = tools.StringToInt(RoleId)
table := orm.Eloquent.Table("sys_role_menu").Where("role_id = ?", RoleId)
if MenuID != "" {
table = table.Where("menu_id = ?", MenuID)
}
if err := table.Delete(&rm).Error; err != nil {
return false, err
}
return true, nil
}
+122
View File
@@ -0,0 +1,122 @@
package models
import (
orm "go-admin/common/global"
"go-admin/tools"
)
type SysCategory struct {
Id int `json:"id" gorm:"type:int(11);primary_key;AUTO_INCREMENT"` // 分类Id
Name string `json:"name" gorm:"type:varchar(255);"` // 名称
Img string `json:"img" gorm:"type:varchar(255);"` // 图片
Sort string `json:"sort" gorm:"type:int(4);"` // 排序
Status string `json:"status" gorm:"type:int(1);"` // 状态
Remark string `json:"remark" gorm:"type:varchar(255);"` // 备注
CreateBy string `json:"createBy" gorm:"type:varchar(64);"` // 创建者
UpdateBy string `json:"updateBy" gorm:"type:varchar(64);"` // 更新者
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
BaseModel
}
func (SysCategory) TableName() string {
return "sys_category"
}
// 创建SysCategory
func (e *SysCategory) Create() (SysCategory, error) {
var doc SysCategory
result := orm.Eloquent.Table(e.TableName()).Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
doc = *e
return doc, nil
}
// 获取SysCategory
func (e *SysCategory) Get() (SysCategory, error) {
var doc SysCategory
table := orm.Eloquent.Table(e.TableName())
if e.Id != 0 {
table = table.Where("id = ?", e.Id)
}
if e.Name != "" {
table = table.Where("name = ?", e.Name)
}
if e.Status != "" {
table = table.Where("status = ?", e.Status)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
return doc, nil
}
// 获取SysCategory带分页
func (e *SysCategory) GetPage(pageSize int, pageIndex int) ([]SysCategory, int, error) {
var doc []SysCategory
table := orm.Eloquent.Table(e.TableName())
if e.Name != "" {
table = table.Where("name = ?", e.Name)
}
if e.Status != "" {
table = table.Where("status = ?", e.Status)
}
// 数据权限控制(如果不需要数据权限请将此处去掉)
dataPermission := new(DataPermission)
dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
table, err := dataPermission.GetDataScope(e.TableName(), table)
if err != nil {
return nil, 0, err
}
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
// 更新SysCategory
func (e *SysCategory) Update(id int) (update SysCategory, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil {
return
}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
return
}
return
}
// 删除SysCategory
func (e *SysCategory) Delete(id int) (success bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysCategory{}).Error; err != nil {
success = false
return
}
success = true
return
}
//批量删除
func (e *SysCategory) BatchDelete(id []int) (Result bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysCategory{}).Error; err != nil {
return
}
Result = true
return
}
+132
View File
@@ -0,0 +1,132 @@
package models
import (
orm "go-admin/common/global"
"go-admin/tools"
)
type SysContent struct {
Id int `json:"id" gorm:"type:int(11);primary_key;auto_increment"` // id
CateId string `json:"cateId" gorm:"type:int(11);"` // 分类id
Name string `json:"name" gorm:"type:varchar(255);"` // 名称
Status string `json:"status" gorm:"type:int(1);"` // 状态
Img string `json:"img" gorm:"type:varchar(255);"` // 图片
Content string `json:"content" gorm:"type:text;"` // 内容
Remark string `json:"remark" gorm:"type:varchar(255);"` // 备注
Sort string `json:"sort" gorm:"type:int(4);"` // 排序
CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建者
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 更新者
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
BaseModel
}
func (SysContent) TableName() string {
return "sys_content"
}
// 创建SysContent
func (e *SysContent) Create() (SysContent, error) {
var doc SysContent
result := orm.Eloquent.Table(e.TableName()).Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
doc = *e
return doc, nil
}
// 获取SysContent
func (e *SysContent) Get() (SysContent, error) {
var doc SysContent
table := orm.Eloquent.Table(e.TableName())
if e.Id != 0 {
table = table.Where("id = ?", e.Id)
}
if e.CateId != "" {
table = table.Where("cate_id = ?", e.CateId)
}
if e.Name != "" {
table = table.Where("name like ?", "%"+e.Name+"%")
}
if e.Status != "" {
table = table.Where("status = ?", e.Status)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
return doc, nil
}
// 获取SysContent带分页
func (e *SysContent) GetPage(pageSize int, pageIndex int) ([]SysContent, int, error) {
var doc []SysContent
table := orm.Eloquent.Table(e.TableName())
if e.CateId != "" {
table = table.Where("cate_id = ?", e.CateId)
}
if e.Name != "" {
table = table.Where("name like ?", "%"+e.Name+"%")
}
if e.Status != "" {
table = table.Where("status = ?", e.Status)
}
// 数据权限控制(如果不需要数据权限请将此处去掉)
dataPermission := new(DataPermission)
dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
table, err := dataPermission.GetDataScope(e.TableName(), table)
if err != nil {
return nil, 0, err
}
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
// 更新SysContent
func (e *SysContent) Update(id int) (update SysContent, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil {
return
}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
return
}
return
}
// 删除SysContent
func (e *SysContent) Delete(id int) (success bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysContent{}).Error; err != nil {
success = false
return
}
success = true
return
}
//批量删除
func (e *SysContent) BatchDelete(id []int) (Result bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysContent{}).Error; err != nil {
return
}
Result = true
return
}
+111
View File
@@ -0,0 +1,111 @@
package models
import (
orm "go-admin/common/global"
)
type SysFileInfo struct {
Id int `json:"id"` // id
Type string `json:"type" gorm:"type:varchar(255);"` // 文件类型
Name string `json:"name" gorm:"type:varchar(255);"` // 文件名称
Size string `json:"size" gorm:"type:int(11);"` // 文件大小
PId int `json:"pId" gorm:"type:int(11);"` // 目录id
Source string `json:"source" gorm:"type:varchar(255);"` // 文件源
Url string `json:"url" gorm:"type:varchar(255);"` // 文件路径
FullUrl string `json:"fullUrl" gorm:"type:varchar(255);"` // 文件全路径
CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建人
UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 编辑人
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
BaseModel
}
func (SysFileInfo) TableName() string {
return "sys_file_info"
}
// 创建SysFileInfo
func (e *SysFileInfo) Create() (SysFileInfo, error) {
var doc SysFileInfo
result := orm.Eloquent.Table(e.TableName()).Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
doc = *e
return doc, nil
}
// 获取SysFileInfo
func (e *SysFileInfo) Get() (SysFileInfo, error) {
var doc SysFileInfo
table := orm.Eloquent.Table(e.TableName())
if e.Id != 0 {
table = table.Where("id = ?", e.Id)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
return doc, nil
}
// 获取SysFileInfo带分页
func (e *SysFileInfo) GetPage(pageSize int, pageIndex int) ([]SysFileInfo, int, error) {
var doc []SysFileInfo
table := orm.Eloquent.Table(e.TableName())
if e.PId != 0 {
table = table.Where("p_id = ?", e.PId)
}
// 数据权限控制(如果不需要数据权限请将此处去掉)
//dataPermission := new(DataPermission)
//dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
//table, err := dataPermission.GetDataScope(e.TableName(), table)
//if err != nil {
// return nil, 0, err
//}
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
// 更新SysFileInfo
func (e *SysFileInfo) Update(id int) (update SysFileInfo, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil {
return
}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
return
}
return
}
// 删除SysFileInfo
func (e *SysFileInfo) Delete(id int) (success bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysFileInfo{}).Error; err != nil {
success = false
return
}
success = true
return
}
//批量删除
func (e *SysFileInfo) BatchDelete(id []int) (Result bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileInfo{}).Error; err != nil {
return
}
Result = true
return
}
+113
View File
@@ -0,0 +1,113 @@
package models
import (
"go-admin/common/dto"
orm "go-admin/common/global"
"go-admin/common/models"
"go-admin/tools"
"strconv"
)
type SysJob struct {
JobId uint `json:"jobId" gorm:"primary_key;AUTO_INCREMENT"` // 编码
JobName string `json:"jobName" gorm:"size:255;"` // 名称
JobGroup string `json:"jobGroup" gorm:"size:255;"` // 任务分组
JobType int `json:"jobType" gorm:"size:1;"` // 任务类型
CronExpression string `json:"cronExpression" gorm:"size:255;"` // cron表达式
InvokeTarget string `json:"invokeTarget" gorm:"size:255;"` // 调用目标
Args string `json:"args" gorm:"size:255;"` // 目标参数
MisfirePolicy int `json:"misfirePolicy" gorm:"size:255;"` // 执行策略
Concurrent int `json:"concurrent" gorm:"size:1;"` // 是否并发
Status int `json:"status" gorm:"size:1;"` // 状态
EntryId int `json:"entry_id" gorm:"size:11;"` // job启动时返回的id
CreateBy string `json:"createBy" gorm:"size:128;"` //
UpdateBy string `json:"updateBy" gorm:"size:128;"` //
BaseModel
DataScope string `json:"dataScope" gorm:"-"`
}
func (SysJob) TableName() string {
return "sys_job"
}
func (e *SysJob) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysJob) GetId() interface{} {
return e.JobId
}
func (e *SysJob) SetCreateBy(createBy uint) {
e.CreateBy = strconv.Itoa(int(createBy))
}
func (e *SysJob) SetUpdateBy(updateBy uint) {
e.UpdateBy = strconv.Itoa(int(updateBy))
}
// 创建SysJob
func (e *SysJob) Create() (err error) {
return orm.Eloquent.Table(e.TableName()).Create(e).Error
}
// 获取SysJob
func (e *SysJob) Get(id interface{}) (err error) {
return orm.Eloquent.Table(e.TableName()).First(e, id).Error
}
// 获取SysJob带分页
func (e *SysJob) GetPage(pageSize int, pageIndex int, v interface{}, list interface{}) (int, error) {
table := orm.Eloquent.Table(e.TableName()).Scopes(dto.MakeCondition(v))
// 数据权限控制(如果不需要数据权限请将此处去掉)
//dataPermission := new(DataPermission)
userid, _ := tools.StringToInt(e.DataScope)
var count int64
if err := table.Scopes(DataScopes(e.TableName(), userid), dto.Paginate(pageSize, pageIndex)).Find(list).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return 0, err
}
return int(count), nil
}
func (e *SysJob) GetList(list interface{}) (err error) {
return orm.Eloquent.Table(e.TableName()).Where("status = ?", 2).Find(list).Error
}
// 更新SysJob
func (e *SysJob) Update(id interface{}) (err error) {
return orm.Eloquent.Table(e.TableName()).Where(id).Updates(&e).Error
}
func (e *SysJob) RemoveAllEntryID() (update SysJob, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("entry_id > ?", 0).Update("entry_id", 0).Error; err != nil {
return
}
return
}
func (e *SysJob) RemoveEntryID(entryID int) (update SysJob, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where("entry_id = ?", entryID).Updates(map[string]interface{}{"entry_id": 0}).Error; err != nil {
return
}
return
}
// 删除SysJob
func (e *SysJob) Delete(id int) (success bool, err error) {
if err = orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error; err != nil {
success = false
return
}
success = true
return
}
//批量删除
func (e *SysJob) BatchDelete(id []int) error {
return orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error
}
+39
View File
@@ -0,0 +1,39 @@
package models
import (
orm "go-admin/common/global"
)
type SysSetting struct {
SettingsId int `json:"settings_id" gorm:"primary_key;AUTO_INCREMENT"`
Name string `json:"name" gorm:"type:varchar(256);"`
Logo string `json:"logo" gorm:"type:varchar(256);"`
BaseModel
}
func (SysSetting) TableName() string {
return "sys_setting"
}
//查询
func (s *SysSetting) Get() (create SysSetting, err error) {
result := orm.Eloquent.Table("sys_setting").First(&create)
if result.Error != nil {
err = result.Error
return
}
return create, nil
}
//修改
func (s *SysSetting) Update() (update SysSetting, err error) {
if err = orm.Eloquent.Table("sys_setting").Model(&update).Updates(&s).Error; err != nil {
return
}
return
}
type ResponseSystemConfig struct {
Name string `json:"name" binding:"required"` // 名称
Logo string `json:"logo" binding:"required"` // 头像
}
+30
View File
@@ -0,0 +1,30 @@
package system
import (
"gorm.io/gorm"
"go-admin/common/models"
)
type SysConfig struct {
gorm.Model
models.ControlBy
ConfigName string `json:"configName" gorm:"type:varchar(128);comment:ConfigName"` //
ConfigKey string `json:"configKey" gorm:"type:varchar(128);comment:ConfigKey"` //
ConfigValue string `json:"configValue" gorm:"type:varchar(255);comment:ConfigValue"` //
ConfigType string `json:"configType" gorm:"type:varchar(64);comment:ConfigType"` //
Remark string `json:"remark" gorm:"type:varchar(128);comment:Remark"` //
}
func (SysConfig) TableName() string {
return "sys_config"
}
func (e *SysConfig) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysConfig) GetId() interface{} {
return e.ID
}
@@ -2,11 +2,14 @@ package models
import (
"errors"
"go-admin/global/orm"
"go-admin/tools"
"golang.org/x/crypto/bcrypt"
log "github.com/sirupsen/logrus"
"gorm.io/gorm"
"log"
"strings"
"golang.org/x/crypto/bcrypt"
orm "go-admin/common/global"
"go-admin/tools"
)
// User
@@ -22,12 +25,12 @@ type User struct {
}
type UserName struct {
Username string `gorm:"type:varchar(64)" json:"username"`
Username string `gorm:"size:64" json:"username"`
}
type PassWord struct {
// 密码
Password string `gorm:"type:varchar(128)" json:"password"`
Password string `gorm:"size:128" json:"password"`
}
type LoginM struct {
@@ -40,29 +43,29 @@ type SysUserId struct {
}
type SysUserB struct {
NickName string `gorm:"type:varchar(128)" json:"nickName"` // 昵称
Phone string `gorm:"type:varchar(11)" json:"phone"` // 手机号
RoleId int `gorm:"type:int(11)" json:"roleId"` // 角色编码
Salt string `gorm:"type:varchar(255)" json:"salt"` //盐
Avatar string `gorm:"type:varchar(255)" json:"avatar"` //头像
Sex string `gorm:"type:varchar(255)" json:"sex"` //性别
Email string `gorm:"type:varchar(128)" json:"email"` //邮箱
DeptId int `gorm:"type:int(11)" json:"deptId"` //部门编码
PostId int `gorm:"type:int(11)" json:"postId"` //职位编码
CreateBy string `gorm:"type:varchar(128)" json:"createBy"` //
UpdateBy string `gorm:"type:varchar(128)" json:"updateBy"` //
Remark string `gorm:"type:varchar(255)" json:"remark"` //备注
Status string `gorm:"type:int(1);" json:"status"`
NickName string `gorm:"size:128" json:"nickName"` // 昵称
Phone string `gorm:"size:11" json:"phone"` // 手机号
RoleId int `gorm:"" json:"roleId"` // 角色编码
Salt string `gorm:"size:255" json:"salt"` //盐
Avatar string `gorm:"size:255" json:"avatar"` //头像
Sex string `gorm:"size:255" json:"sex"` //性别
Email string `gorm:"size:128" json:"email"` //邮箱
DeptId int `gorm:"" json:"deptId"` //部门编码
PostId int `gorm:"" json:"postId"` //职位编码
CreateBy string `gorm:"size:128" json:"createBy"` //
UpdateBy string `gorm:"size:128" json:"updateBy"` //
Remark string `gorm:"size:255" json:"remark"` //备注
Status string `gorm:"size:4;" json:"status"`
BaseModel
DataScope string `gorm:"-" json:"dataScope"`
Params string `gorm:"-" json:"params"`
BaseModel
}
type SysUser struct {
SysUserId
SysUserB
LoginM
SysUserB
}
func (SysUser) TableName() string {
@@ -213,20 +216,19 @@ func (e *SysUser) GetPage(pageSize int, pageIndex int) ([]SysUserPage, int, erro
table = table.Where("sys_user.dept_id in (select dept_id from sys_dept where dept_path like ? )", "%"+tools.IntToString(e.DeptId)+"%")
}
// 数据权限控制
// 数据权限控制(如果不需要数据权限请将此处去掉)
dataPermission := new(DataPermission)
dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
table, err := dataPermission.GetDataScope("sys_user", table)
table, err := dataPermission.GetDataScope(e.TableName(), table)
if err != nil {
return nil, 0, err
}
var count int
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Where("sys_user.deleted_at IS NULL").Count(&count)
return doc, count, nil
return doc, int(count), nil
}
//加密
@@ -251,7 +253,7 @@ func (e SysUser) Insert() (id int, err error) {
}
// check 用户名
var count int
var count int64
orm.Eloquent.Table(e.TableName()).Where("username = ?", e.Username).Count(&count)
if count > 0 {
err = errors.New("账户已存在!")
@@ -314,3 +316,7 @@ func (e *SysUser) SetPwd(pwd SysUserPwd) (Result bool, err error) {
tools.HasError(err, "更新密码失败(代码202)", 500)
return
}
func (e *SysUser) GetByUserId(tx *gorm.DB, id interface{}) error {
return tx.First(e, id).Error
}
@@ -2,7 +2,11 @@ package tools
import (
"errors"
"go-admin/global/orm"
"gorm.io/gorm"
orm "go-admin/common/global"
"go-admin/tools"
config2 "go-admin/tools/config"
)
@@ -23,37 +27,44 @@ type DBColumns struct {
func (e *DBColumns) GetPage(pageSize int, pageIndex int) ([]DBColumns, int, error) {
var doc []DBColumns
var count int64
table := new(gorm.DB)
table := orm.Eloquent.Select("*").Table("information_schema.`COLUMNS`")
table = table.Where("table_schema= ? ", config2.DatabaseConfig.Name)
if config2.DatabaseConfig.Driver == "mysql" {
table = orm.Eloquent.Table("information_schema.`COLUMNS`")
table = table.Where("table_schema= ? ", config2.GenConfig.DBName)
if e.TableName != "" {
return nil, 0, errors.New("table name cannot be empty!")
if e.TableName != "" {
return nil, 0, errors.New("table name cannot be empty!")
}
table = table.Where("TABLE_NAME = ?", e.TableName)
}
table = table.Where("TABLE_NAME = ?", e.TableName)
var count int
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
table.Count(&count)
return doc, count, nil
//table.Count(&count)
return doc, int(count), nil
}
func (e *DBColumns) GetList() ([]DBColumns, error) {
var doc []DBColumns
table := orm.Eloquent.Select("*").Table("information_schema.columns")
table = table.Where("table_schema= ? ", config2.DatabaseConfig.Name)
table := new(gorm.DB)
if e.TableName == "" {
return nil, errors.New("table name cannot be empty!")
}
table = table.Where("TABLE_NAME = ?", e.TableName)
if config2.DatabaseConfig.Driver == "mysql" {
table = orm.Eloquent.Table("information_schema.columns")
table = table.Where("table_schema= ? ", config2.GenConfig.DBName)
table = table.Where("TABLE_NAME = ?", e.TableName).Order("ORDINAL_POSITION asc")
} else {
tools.Assert(true, "目前只支持mysql数据库", 500)
}
if err := table.Find(&doc).Error; err != nil {
return doc, err
}
+64
View File
@@ -0,0 +1,64 @@
package tools
import (
"errors"
"gorm.io/gorm"
orm "go-admin/common/global"
"go-admin/tools"
config2 "go-admin/tools/config"
)
type DBTables struct {
TableName string `gorm:"column:TABLE_NAME" json:"tableName"`
Engine string `gorm:"column:ENGINE" json:"engine"`
TableRows string `gorm:"column:TABLE_ROWS" json:"tableRows"`
TableCollation string `gorm:"column:TABLE_COLLATION" json:"tableCollation"`
CreateTime string `gorm:"column:CREATE_TIME" json:"createTime"`
UpdateTime string `gorm:"column:UPDATE_TIME" json:"updateTime"`
TableComment string `gorm:"column:TABLE_COMMENT" json:"tableComment"`
}
func (e *DBTables) GetPage(pageSize int, pageIndex int) ([]DBTables, int, error) {
var doc []DBTables
table := new(gorm.DB)
var count int64
if config2.DatabaseConfig.Driver == "mysql" {
table = orm.Eloquent.Table("information_schema.tables")
table = table.Where("TABLE_NAME not in (select table_name from " + config2.GenConfig.DBName + ".sys_tables) ")
table = table.Where("table_schema= ? ", config2.GenConfig.DBName)
if e.TableName != "" {
table = table.Where("TABLE_NAME = ?", e.TableName)
}
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
} else {
tools.Assert(true, "目前只支持mysql数据库", 500)
}
//table.Count(&count)
return doc, int(count), nil
}
func (e *DBTables) Get() (DBTables, error) {
var doc DBTables
table := new(gorm.DB)
if config2.DatabaseConfig.Driver == "mysql" {
table = orm.Eloquent.Table("information_schema.tables")
table = table.Where("table_schema= ? ", config2.GenConfig.DBName)
if e.TableName == "" {
return doc, errors.New("table name cannot be empty!")
}
table = table.Where("TABLE_NAME = ?", e.TableName)
} else {
tools.Assert(true, "目前只支持mysql数据库", 500)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
return doc, nil
}
+90
View File
@@ -0,0 +1,90 @@
package tools
import (
"go-admin/app/admin/models"
orm "go-admin/common/global"
)
type SysColumns struct {
ColumnId int `gorm:"primary_key;auto_increment" json:"columnId"`
TableId int `gorm:"" json:"tableId"`
ColumnName string `gorm:"size:128;" json:"columnName"`
ColumnComment string `gorm:"column:column_comment;size:128;" json:"columnComment"`
ColumnType string `gorm:"column:column_type;size:128;" json:"columnType"`
GoType string `gorm:"column:go_type;size:128;" json:"goType"`
GoField string `gorm:"column:go_field;size:128;" json:"goField"`
JsonField string `gorm:"column:json_field;size:128;" json:"jsonField"`
IsPk string `gorm:"column:is_pk;size:4;" json:"isPk"`
IsIncrement string `gorm:"column:is_increment;size:4;" json:"isIncrement"`
IsRequired string `gorm:"column:is_required;size:4;" json:"isRequired"`
IsInsert string `gorm:"column:is_insert;size:4;" json:"isInsert"`
IsEdit string `gorm:"column:is_edit;size:4;" json:"isEdit"`
IsList string `gorm:"column:is_list;size:4;" json:"isList"`
IsQuery string `gorm:"column:is_query;size:4;" json:"isQuery"`
QueryType string `gorm:"column:query_type;size:128;" json:"queryType"`
HtmlType string `gorm:"column:html_type;size:128;" json:"htmlType"`
DictType string `gorm:"column:dict_type;size:128;" json:"dictType"`
Sort int `gorm:"column:sort;" json:"sort"`
List string `gorm:"column:list;size:1;" json:"list"`
Pk bool `gorm:"column:pk;size:1;" json:"pk"`
Required bool `gorm:"column:required;size:1;" json:"required"`
SuperColumn bool `gorm:"column:super_column;size:1;" json:"superColumn"`
UsableColumn bool `gorm:"column:usable_column;size:1;" json:"usableColumn"`
Increment bool `gorm:"column:increment;size:1;" json:"increment"`
Insert bool `gorm:"column:insert;size:1;" json:"insert"`
Edit bool `gorm:"column:edit;size:1;" json:"edit"`
Query bool `gorm:"column:query;size:1;" json:"query"`
Remark string `gorm:"column:remark;size:255;" json:"remark"`
FkTableName string `gorm:"" json:"fkTableName"`
FkTableNameClass string `gorm:"" json:"fkTableNameClass"`
FkTableNamePackage string `gorm:"" json:"fkTableNamePackage"`
FkCol []SysColumns `gorm:"-" json:"fkCol"`
FkLabelId string `gorm:"" json:"fkLabelId"`
FkLabelName string `gorm:"size:255;" json:"fkLabelName"`
CreateBy string `gorm:"column:create_by;size:128;" json:"createBy"`
UpdateBy string `gorm:"column:update_By;size:128;" json:"updateBy"`
models.BaseModel
}
func (SysColumns) TableName() string {
return "sys_columns"
}
func (e *SysColumns) GetList() ([]SysColumns, error) {
var doc []SysColumns
table := orm.Eloquent.Table("sys_columns")
table = table.Where("table_id = ?", e.TableId)
if err := table.Find(&doc).Error; err != nil {
return nil, err
}
return doc, nil
}
func (e *SysColumns) Create() (SysColumns, error) {
var doc SysColumns
result := orm.Eloquent.Table("sys_columns").Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
doc = *e
return doc, nil
}
func (e *SysColumns) Update() (update SysColumns, err error) {
if err = orm.Eloquent.Table("sys_columns").First(&update, e.ColumnId).Error; err != nil {
return
}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table("sys_columns").Model(&update).Updates(&e).Error; err != nil {
return
}
return
}
+231
View File
@@ -0,0 +1,231 @@
package tools
import (
"strings"
"go-admin/app/admin/models"
orm "go-admin/common/global"
)
type SysTables struct {
TableId int `gorm:"primary_key;auto_increment" json:"tableId"` //表编码
TBName string `gorm:"column:table_name;size:255;" json:"tableName"` //表名称
TableComment string `gorm:"size:255;" json:"tableComment"` //表备注
ClassName string `gorm:"size:255;" json:"className"` //类名
TplCategory string `gorm:"size:255;" json:"tplCategory"` //
PackageName string `gorm:"size:255;" json:"packageName"` //包名
ModuleName string `gorm:"size:255;" json:"moduleName"` //模块名
BusinessName string `gorm:"size:255;" json:"businessName"` //
FunctionName string `gorm:"size:255;" json:"functionName"` //功能名称
FunctionAuthor string `gorm:"size:255;" json:"functionAuthor"` //功能作者
PkColumn string `gorm:"size:255;" json:"pkColumn"`
PkGoField string `gorm:"size:255;" json:"pkGoField"`
PkJsonField string `gorm:"size:255;" json:"pkJsonField"`
Options string `gorm:"size:255;" json:"options"`
TreeCode string `gorm:"size:255;" json:"treeCode"`
TreeParentCode string `gorm:"size:255;" json:"treeParentCode"`
TreeName string `gorm:"size:255;" json:"treeName"`
Tree bool `gorm:"size:1;" json:"tree"`
Crud bool `gorm:"size:1;" json:"crud"`
Remark string `gorm:"size:255;" json:"remark"`
IsDataScope int `gorm:"size:1;" json:"isDataScope"`
IsActions int `gorm:"size:1;" json:"isActions"`
IsAuth int `gorm:"size:1;" json:"isAuth"`
IsLogicalDelete string `gorm:"size:1;" json:"isLogicalDelete"`
LogicalDelete bool `gorm:"size:1;" json:"logicalDelete"`
LogicalDeleteColumn string `gorm:"size:128;" json:"logicalDeleteColumn"`
CreateBy string `gorm:"size:128;" json:"createBy"`
UpdateBy string `gorm:"size:128;" json:"updateBy"`
DataScope string `gorm:"-" json:"dataScope"`
Params Params `gorm:"-" json:"params"`
Columns []SysColumns `gorm:"-" json:"columns"`
models.BaseModel
}
func (SysTables) TableName() string {
return "sys_tables"
}
type Params struct {
TreeCode string `gorm:"-" json:"treeCode"`
TreeParentCode string `gorm:"-" json:"treeParentCode"`
TreeName string `gorm:"-" json:"treeName"`
}
func (e *SysTables) GetPage(pageSize int, pageIndex int) ([]SysTables, int, error) {
var doc []SysTables
table := orm.Eloquent.Table("sys_tables")
if e.TBName != "" {
table = table.Where("table_name = ?", e.TBName)
}
if e.TableComment != "" {
table = table.Where("table_comment = ?", e.TableComment)
}
var count int64
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
return doc, int(count), nil
}
func (e *SysTables) Get() (SysTables, error) {
var doc SysTables
var err error
table := orm.Eloquent.Table("sys_tables")
if e.TBName != "" {
table = table.Where("table_name = ?", e.TBName)
}
if e.TableId != 0 {
table = table.Where("table_id = ?", e.TableId)
}
if e.TableComment != "" {
table = table.Where("table_comment = ?", e.TableComment)
}
if err := table.First(&doc).Error; err != nil {
return doc, err
}
var col SysColumns
col.TableId = doc.TableId
if doc.Columns, err = col.GetList(); err != nil {
return doc, err
}
return doc, nil
}
func (e *SysTables) GetTree() ([]SysTables, error) {
var doc []SysTables
var err error
table := orm.Eloquent.Table("sys_tables")
if e.TBName != "" {
table = table.Where("table_name = ?", e.TBName)
}
if e.TableId != 0 {
table = table.Where("table_id = ?", e.TableId)
}
if e.TableComment != "" {
table = table.Where("table_comment = ?", e.TableComment)
}
if err := table.Find(&doc).Error; err != nil {
return doc, err
}
for i := 0; i < len(doc); i++ {
var col SysColumns
//col.FkCol = append(col.FkCol, SysColumns{ColumnId: 0, ColumnName: "请选择"})
col.TableId = doc[i].TableId
if doc[i].Columns, err = col.GetList(); err != nil {
return doc, err
}
}
return doc, nil
}
func (e *SysTables) Create() (SysTables, error) {
var doc SysTables
result := orm.Eloquent.Table("sys_tables").Create(&e)
if result.Error != nil {
err := result.Error
return doc, err
}
doc = *e
for i := 0; i < len(e.Columns); i++ {
e.Columns[i].TableId = doc.TableId
e.Columns[i].Create()
}
return doc, nil
}
func (e *SysTables) Update() (update SysTables, err error) {
//if err = orm.Eloquent.Table("sys_tables").First(&update, e.TableId).Error; err != nil {
// return
//}
//参数1:是要修改的数据
//参数2:是修改的数据
if err = orm.Eloquent.Table("sys_tables").Where("table_id = ?", e.TableId).Updates(&e).Error; err != nil {
return
}
tableNames := make([]string, 0)
for i := range e.Columns {
if e.Columns[i].FkTableName != "" {
tableNames = append(tableNames, e.Columns[i].FkTableName)
}
}
tables := make([]SysTables, 0)
tableMap := make(map[string]*SysTables)
if len(tableNames) > 0 {
if err = orm.Eloquent.Table("sys_tables").Where("table_name in (?)", tableNames).Find(&tables).Error; err != nil {
return
}
for i := range tables {
tableMap[tables[i].TBName] = &tables[i]
}
}
for i := 0; i < len(e.Columns); i++ {
if e.Columns[i].FkTableName != "" {
t, ok := tableMap[e.Columns[i].FkTableName]
if ok {
e.Columns[i].FkTableNameClass = t.ClassName
e.Columns[i].FkTableNamePackage = t.ModuleName
} else {
tableNameList := strings.Split(e.Columns[i].FkTableName, "_")
e.Columns[i].FkTableNameClass = ""
e.Columns[i].FkTableNamePackage = ""
for a := 0; a < len(tableNameList); a++ {
strStart := string([]byte(tableNameList[a])[:1])
strEnd := string([]byte(tableNameList[a])[1:])
e.Columns[i].FkTableNameClass += strings.ToUpper(strStart) + strEnd
e.Columns[i].FkTableNamePackage += strings.ToLower(strStart) + strings.ToLower(strEnd)
}
}
}
_, _ = e.Columns[i].Update()
}
return
}
func (e *SysTables) Delete() (success bool, err error) {
tx := orm.Eloquent.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
if err = tx.Table("sys_tables").Delete(SysTables{}, "table_id = ?", e.TableId).Error; err != nil {
success = false
return
}
if err = tx.Table("sys_columns").Delete(SysColumns{}, "table_id = ?", e.TableId).Error; err != nil {
success = false
return
}
success = true
return
}
func (e *SysTables) BatchDelete(id []int) (Result bool, err error) {
if err = orm.Eloquent.Unscoped().Table(e.TableName()).Where(" table_id in (?)", id).Delete(&SysColumns{}).Error; err != nil {
return
}
Result = true
return
}
+52
View File
@@ -0,0 +1,52 @@
package router
import (
"os"
"go-admin/app/admin/middleware"
"go-admin/app/admin/middleware/handler"
"go-admin/common/global"
"go-admin/common/log"
common "go-admin/common/middleware"
_ "go-admin/pkg/jwtauth"
"go-admin/tools"
"go-admin/tools/config"
"github.com/gin-gonic/gin"
)
func InitRouter() {
var r *gin.Engine
h := global.Cfg.GetEngine()
if h == nil {
h = gin.New()
global.Cfg.SetEngine(h)
}
switch h.(type) {
case *gin.Engine:
r = h.(*gin.Engine)
default:
log.Fatal("not support other engine")
os.Exit(-1)
}
if config.SslConfig.Enable {
r.Use(handler.TlsHandler())
}
r.Use(middleware.WithContextDb(middleware.GetGormFromConfig(global.Cfg)))
r.Use(common.Sentinel())
middleware.InitMiddleware(r)
// the jwt middleware
var err error
authMiddleware, err := middleware.AuthInit()
tools.HasError(err, "JWT Init Error", 500)
// 注册系统路由
InitSysRouter(r, authMiddleware)
// 注册业务路由
// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码
InitExamplesRouter(r, authMiddleware)
//return r
}
+57
View File
@@ -0,0 +1,57 @@
package router
import (
"github.com/gin-gonic/gin"
_ "github.com/gin-gonic/gin"
"go-admin/pkg/jwtauth"
jwt "go-admin/pkg/jwtauth"
)
var (
routerNoCheckRole = make([]func(*gin.RouterGroup), 0)
routerCheckRole = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)
)
// 路由示例
func InitExamplesRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {
// 无需认证的路由
examplesNoCheckRoleRouter(r)
// 需要认证的路由
examplesCheckRoleRouter(r, authMiddleware)
return r
}
// 无需认证的路由示例
func examplesNoCheckRoleRouter(r *gin.Engine) {
// 可根据业务需求来设置接口版本
v1 := r.Group("/api/v1")
// 空接口防止v1定义无使用报错
v1.GET("/nilcheckrole", nil)
for _, f := range routerNoCheckRole {
f(v1)
}
// {{无需认证路由自动补充在此处请勿删除}}
registerSysFileInfoRouter(v1)
registerSysFileDirRouter(v1)
}
// 需要认证的路由示例
func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) {
// 可根据业务需求来设置接口版本
v1 := r.Group("/api/v1")
// 空接口防止v1定义无使用报错
v1.GET("/checkrole", nil)
for _, f := range routerCheckRole {
f(v1, authMiddleware)
}
// {{认证路由自动补充在此处请勿删除}}
registerSysContentRouter(v1, authMiddleware)
registerSysCategoryRouter(v1, authMiddleware)
}
+37
View File
@@ -0,0 +1,37 @@
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/system/sys_config"
"go-admin/app/admin/middleware"
"go-admin/app/admin/models/system"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
jwt "go-admin/pkg/jwtauth"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysConfigRouter)
}
// 需认证的路由代码
func registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
r := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
model := &system.SysConfig{}
r.GET("", actions.PermissionAction(), actions.IndexAction(model, new(dto.SysConfigSearch), func() interface{} {
list := make([]system.SysConfig, 0)
return &list
}))
r.GET("/:id", actions.PermissionAction(), actions.ViewAction(new(dto.SysConfigById), nil))
r.POST("", actions.CreateAction(new(dto.SysConfigControl)))
r.PUT("/:id", actions.PermissionAction(), actions.UpdateAction(new(dto.SysConfigControl)))
r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto.SysConfigById)))
}
r1 := v1.Group("/configKey").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
model := &sys_config.SysConfig{}
r1.POST("", model.GetSysConfigByKEYForService)
}
}
+26
View File
@@ -0,0 +1,26 @@
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/syscategory"
"go-admin/app/admin/middleware"
jwt "go-admin/pkg/jwtauth"
)
// 需认证的路由代码
func registerSysCategoryRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
r := v1.Group("/syscategory").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("/:id", syscategory.GetSysCategory)
r.POST("", syscategory.InsertSysCategory)
r.PUT("", syscategory.UpdateSysCategory)
r.DELETE("/:id", syscategory.DeleteSysCategory)
}
l := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
l.GET("/syscategoryList", syscategory.GetSysCategoryList)
}
}
+26
View File
@@ -0,0 +1,26 @@
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/syscontent"
"go-admin/app/admin/middleware"
jwt "go-admin/pkg/jwtauth"
)
// 需认证的路由代码
func registerSysContentRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
r := v1.Group("/syscontent").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("/:id", syscontent.GetSysContent)
r.POST("", syscontent.InsertSysContent)
r.PUT("", syscontent.UpdateSysContent)
r.DELETE("/:id", syscontent.DeleteSysContent)
}
l := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
l.GET("/syscontentList", syscontent.GetSysContentList)
}
}
+35
View File
@@ -0,0 +1,35 @@
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/sysfiledir"
"go-admin/app/admin/apis/sysfileinfo"
)
// 无需认证的路由代码
func registerSysFileInfoRouter(v1 *gin.RouterGroup) {
v1.GET("/sysfileinfoList", sysfileinfo.GetSysFileInfoList)
r := v1.Group("/sysfileinfo")
{
r.GET("/:id", sysfileinfo.GetSysFileInfo)
r.POST("", sysfileinfo.InsertSysFileInfo)
r.PUT("", sysfileinfo.UpdateSysFileInfo)
r.DELETE("/:id", sysfileinfo.DeleteSysFileInfo)
}
}
// 无需认证的路由代码
func registerSysFileDirRouter(v1 *gin.RouterGroup) {
v1.GET("/sysfiledirList", sysfiledir.GetSysFileDirList)
r := v1.Group("/sysfiledir")
{
r.GET("/:id", sysfiledir.GetSysFileDir)
r.POST("", sysfiledir.InsertSysFileDir)
r.PUT("", sysfiledir.UpdateSysFileDir)
r.DELETE("/:id", sysfiledir.DeleteSysFileDir)
}
}
+38
View File
@@ -0,0 +1,38 @@
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/sysjob"
"go-admin/app/admin/middleware"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
jwt "go-admin/pkg/jwtauth"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysJobRouter)
}
// 需认证的路由代码
func registerSysJobRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
r := v1.Group("/sysjob").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
sysJob := &models.SysJob{}
r.GET("", actions.PermissionAction(), actions.IndexAction(sysJob, new(dto.SysJobSearch), func() interface{} {
list := make([]models.SysJob, 0)
return &list
}))
r.GET("/:id", actions.PermissionAction(), actions.ViewAction(new(dto.SysJobById), func() interface{} {
return &dto.SysJobItem{}
}))
r.POST("", actions.CreateAction(new(dto.SysJobControl)))
r.PUT("", actions.PermissionAction(), actions.UpdateAction(new(dto.SysJobControl)))
r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto.SysJobById)))
}
sysJob := &sysjob.SysJob{}
v1.GET("/job/remove/:id", sysJob.RemoveJobForService)
v1.GET("/job/start/:id", sysJob.StartJobForService)
}
@@ -1,19 +1,23 @@
package router
import (
"mime"
log2 "go-admin/app/admin/apis/log"
"go-admin/app/admin/apis/monitor"
"go-admin/app/admin/apis/public"
"go-admin/app/admin/apis/system"
"go-admin/app/admin/apis/system/dict"
. "go-admin/app/admin/apis/tools"
"go-admin/app/admin/middleware"
"go-admin/app/admin/middleware/handler"
_ "go-admin/docs"
jwt "go-admin/pkg/jwtauth"
"go-admin/pkg/ws"
"github.com/gin-gonic/gin"
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
log2 "go-admin/apis/log"
"go-admin/apis/monitor"
"go-admin/apis/system"
"go-admin/apis/system/dict"
. "go-admin/apis/tools"
_ "go-admin/docs"
"go-admin/handler"
"go-admin/middleware"
"go-admin/pkg/jwtauth"
jwt "go-admin/pkg/jwtauth"
)
func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup {
@@ -21,25 +25,29 @@ func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Rou
sysBaseRouter(g)
// 静态文件
sysStaticFileRouter(g)
// swagger;注意:生产环境可以注释掉
sysSwaggerRouter(g)
// 无需认证
sysNoCheckRoleRouter(g)
// 需要认证
sysCheckRoleRouterInit(g, authMiddleware)
return g
}
func sysBaseRouter(r *gin.RouterGroup) {
go ws.WebsocketManager.Start()
go ws.WebsocketManager.SendService()
go ws.WebsocketManager.SendAllService()
r.GET("/", system.HelloWorld)
r.GET("/info", handler.Ping)
}
func sysStaticFileRouter(r *gin.RouterGroup) {
mime.AddExtensionType(".js", "application/javascript")
r.Static("/static", "./static")
r.Static("/form-generator", "./static/form-generator")
}
func sysSwaggerRouter(r *gin.RouterGroup) {
@@ -52,13 +60,16 @@ func sysNoCheckRoleRouter(r *gin.RouterGroup) {
v1.GET("/monitor/server", monitor.ServerInfo)
v1.GET("/getCaptcha", system.GenerateCaptchaHandler)
v1.GET("/gen/preview/:tableId", Preview)
v1.GET("/gen/toproject/:tableId", GenCodeV3)
v1.GET("/gen/todb/:tableId", GenMenuAndApi)
v1.GET("/gen/tabletree", GetSysTablesTree)
v1.GET("/menuTreeselect", system.GetMenuTreeelect)
v1.GET("/dict/databytype/:dictType", dict.GetDictDataByDictType)
registerDBRouter(v1)
registerSysTableRouter(v1)
registerPublicRouter(v1)
registerSysSettingRouter(v1)
}
func registerDBRouter(api *gin.RouterGroup) {
@@ -79,15 +90,17 @@ func registerSysTableRouter(v1 *gin.RouterGroup) {
tablesinfo.PUT("", UpdateSysTable)
tablesinfo.DELETE("/:tableId", DeleteSysTables)
tablesinfo.GET("/:tableId", GetSysTables)
tablesinfo.GET("", GetSysTablesInfo)
}
}
}
func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwtauth.GinJWTMiddleware) {
func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
r.POST("/login", authMiddleware.LoginHandler)
// Refresh time can be longer than token timeout
r.GET("/refresh_token", authMiddleware.RefreshHandler)
r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/ws/:id/:channel", ws.WebsocketManager.WsClient)
r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/wslogout/:id/:channel", ws.WebsocketManager.UnWsClient)
v1 := r.Group("/api/v1")
registerPageRouter(v1, authMiddleware)
@@ -96,7 +109,6 @@ func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwtauth.GinJWTMi
registerDictRouter(v1, authMiddleware)
registerSysUserRouter(v1, authMiddleware)
registerRoleRouter(v1, authMiddleware)
registerConfigRouter(v1, authMiddleware)
registerUserCenterRouter(v1, authMiddleware)
registerPostRouter(v1, authMiddleware)
registerMenuRouter(v1, authMiddleware)
@@ -105,7 +117,7 @@ func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwtauth.GinJWTMi
}
func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
v1auth := v1.Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
v1auth.GET("/getinfo", system.GetInfo)
v1auth.GET("/menurole", system.GetMenuRole)
@@ -117,18 +129,17 @@ func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar
v1auth.GET("/menuids", system.GetMenuIDS)
v1auth.GET("/operloglist", log2.GetOperLogList)
v1auth.GET("/configKey/:configKey", system.GetConfigByConfigKey)
}
}
func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
v1auth := v1.Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
v1auth.GET("/deptList", system.GetDeptList)
v1auth.GET("/deptTree", system.GetDeptTree)
v1auth.GET("/sysUserList", system.GetSysUserList)
v1auth.GET("/rolelist", system.GetRoleList)
v1auth.GET("/configList", system.GetConfigList)
//v1auth.GET("/configList", system.GetConfigList)
v1auth.GET("/postlist", system.GetPostList)
v1auth.GET("/menulist", system.GetMenuList)
v1auth.GET("/loginloglist", log2.GetLoginLogList)
@@ -182,16 +193,6 @@ func registerMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar
}
}
func registerConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
config := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
config.GET("/:configId", system.GetConfig)
config.POST("", system.InsertConfig)
config.PUT("", system.UpdateConfig)
config.DELETE("/:configId", system.DeleteConfig)
}
}
func registerRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
role := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
@@ -241,3 +242,18 @@ func registerDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar
dept.DELETE("/:id", system.DeleteDept)
}
}
func registerSysSettingRouter(v1 *gin.RouterGroup) {
setting := v1.Group("/setting")
{
setting.GET("", system.GetSetting)
setting.POST("", system.CreateSetting)
setting.GET("/serverInfo", monitor.ServerInfo)
}
}
func registerPublicRouter(v1 *gin.RouterGroup) {
p := v1.Group("/public")
{
p.POST("/uploadFile", public.UploadFile)
}
}
+93
View File
@@ -0,0 +1,93 @@
package dto
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/models/system"
"gorm.io/gorm"
"go-admin/common/dto"
"go-admin/common/log"
common "go-admin/common/models"
"go-admin/tools"
)
type SysConfigSearch struct {
dto.Pagination `search:"-"`
ConfigName string `form:"configName" search:"type:exact;column:config_name;table:sys_config" comment:""`
ConfigKey string `form:"configKey" search:"type:exact;column:config_key;table:sys_config" comment:""`
ConfigType string `form:"configType" search:"type:exact;column:config_type;table:sys_config" comment:""`
}
func (m *SysConfigSearch) GetNeedSearch() interface{} {
return *m
}
func (m *SysConfigSearch) Bind(ctx *gin.Context) error {
msgID := tools.GenerateMsgIDFromContext(ctx)
err := ctx.ShouldBind(m)
if err != nil {
log.Debugf("MsgID[%s] ShouldBind error: %s", msgID, err.Error())
}
return err
}
func (m *SysConfigSearch) Generate() dto.Index {
o := *m
return &o
}
type SysConfigControl struct {
ID uint `uri:"ID" comment:"编码"` // 编码
ConfigName string `json:"configName" comment:""`
ConfigKey string `json:"configKey" comment:""`
ConfigValue string `json:"configValue" comment:""`
ConfigType string `json:"configType" comment:""`
Remark string `json:"remark" comment:""`
}
func (s *SysConfigControl) Bind(ctx *gin.Context) error {
msgID := tools.GenerateMsgIDFromContext(ctx)
err := ctx.ShouldBindUri(s)
if err != nil {
log.Debugf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error())
return err
}
err = ctx.ShouldBind(s)
if err != nil {
log.Debugf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error())
}
return err
}
func (s *SysConfigControl) Generate() dto.Control {
cp := *s
return &cp
}
func (s *SysConfigControl) GenerateM() (common.ActiveRecord, error) {
return &system.SysConfig{
Model: gorm.Model{ID: s.ID},
ConfigName: s.ConfigName,
ConfigKey: s.ConfigKey,
ConfigValue: s.ConfigValue,
ConfigType: s.ConfigType,
Remark: s.Remark,
}, nil
}
func (s *SysConfigControl) GetId() interface{} {
return s.ID
}
type SysConfigById struct {
dto.ObjectById
}
func (s *SysConfigById) Generate() dto.Control {
cp := *s
return &cp
}
func (s *SysConfigById) GenerateM() (common.ActiveRecord, error) {
return &system.SysConfig{}, nil
}
+107
View File
@@ -0,0 +1,107 @@
package dto
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/common/dto"
"go-admin/common/log"
common "go-admin/common/models"
)
type SysJobSearch struct {
dto.Pagination `search:"-"`
JobId int `form:"jobId" search:"type:exact;column:job_id;table:sys_job"`
JobName string `form:"jobName" search:"type:icontains;column:job_name;table:sys_job"`
JobGroup string `form:"jobGroup" search:"type:exact;column:job_group;table:sys_job"`
CronExpression string `form:"cronExpression" search:"type:exact;column:cron_expression;table:sys_job"`
InvokeTarget string `form:"invokeTarget" search:"type:exact;column:invoke_target;table:sys_job"`
Status int `form:"status" search:"type:exact;column:status;table:sys_job"`
}
func (m *SysJobSearch) GetNeedSearch() interface{} {
return *m
}
func (m *SysJobSearch) Bind(ctx *gin.Context) error {
err := ctx.ShouldBind(m)
if err != nil {
log.Errorf("MsgID[%s] Bind error: %s", err)
}
return err
}
func (m *SysJobSearch) Generate() dto.Index {
o := *m
return &o
}
type SysJobControl struct {
JobId uint `json:"jobId"`
JobName string `json:"jobName" validate:"required"` // 名称
JobGroup string `json:"jobGroup"` // 任务分组
JobType int `json:"jobType"` // 任务类型
CronExpression string `json:"cronExpression"` // cron表达式
InvokeTarget string `json:"invokeTarget"` // 调用目标
Args string `json:"args"` // 目标参数
MisfirePolicy int `json:"misfirePolicy"` // 执行策略
Concurrent int `json:"concurrent"` // 是否并发
Status int `json:"status"` // 状态
EntryId int `json:"entryId"` // job启动时返回的id
}
func (s *SysJobControl) Bind(ctx *gin.Context) error {
return ctx.ShouldBind(s)
}
func (s *SysJobControl) Generate() dto.Control {
cp := *s
return &cp
}
func (s *SysJobControl) GenerateM() (common.ActiveRecord, error) {
return &models.SysJob{
JobId: s.JobId,
JobName: s.JobName,
JobGroup: s.JobGroup,
JobType: s.JobType,
CronExpression: s.CronExpression,
InvokeTarget: s.InvokeTarget,
Args: s.Args,
MisfirePolicy: s.MisfirePolicy,
Concurrent: s.Concurrent,
Status: s.Status,
EntryId: s.EntryId,
}, nil
}
func (s *SysJobControl) GetId() interface{} {
return s.JobId
}
type SysJobById struct {
dto.ObjectById
}
func (s *SysJobById) Generate() dto.Control {
cp := *s
return &cp
}
func (s *SysJobById) GenerateM() (common.ActiveRecord, error) {
return &models.SysJob{}, nil
}
type SysJobItem struct {
JobId uint `json:"jobId"`
JobName string `json:"jobName" validate:"required"` // 名称
JobGroup string `json:"jobGroup"` // 任务分组
JobType int `json:"jobType"` // 任务类型
CronExpression string `json:"cronExpression"` // cron表达式
InvokeTarget string `json:"invokeTarget"` // 调用目标
Args string `json:"args"` // 目标参数
MisfirePolicy int `json:"misfirePolicy"` // 执行策略
Concurrent int `json:"concurrent"` // 是否并发
Status int `json:"status"` // 状态
EntryId int `json:"entryId"` // job启动时返回的id
}
+6
View File
@@ -0,0 +1,6 @@
package dto
type SysTableSearch struct {
TBName string `form:"tableName" search:"type:exact;column:table_name;table:table_name"`
TableComment string `form:"tableComment" search:"type:icontains;column:table_comment;table:table_comment"`
}
+27
View File
@@ -0,0 +1,27 @@
package service
import (
"go-admin/app/admin/models/system"
"go-admin/app/admin/service/dto"
"go-admin/common/log"
"go-admin/common/service"
)
type SysConfig struct {
service.Service
}
// GetSysConfigByKEY 根据Key获取SysConfig
func (e *SysConfig) GetSysConfigByKEY(c *dto.SysConfigControl) error {
var err error
var data system.SysConfig
msgID := e.MsgID
data.ConfigKey = c.ConfigKey
err = e.Orm.Table(data.TableName()).Where("config_key = ?", data.ConfigKey).First(c).Error
if err != nil {
log.Errorf("msgID[%s] db error:%s", msgID, err)
return err
}
return nil
}
+88
View File
@@ -0,0 +1,88 @@
package service
import (
"time"
"go-admin/app/admin/models"
"go-admin/app/jobs"
"go-admin/common/dto"
"go-admin/common/log"
"go-admin/common/service"
"go-admin/tools/app/msg"
)
type SysJob struct {
service.Service
}
// RemoveJob 删除job
func (e *SysJob) RemoveJob(c *dto.GeneralDelDto) error {
var err error
var data models.SysJob
msgID := e.MsgID
data.JobId = c.Id
err = e.Orm.Table(data.TableName()).First(&data).Error
if err != nil {
log.Errorf("msgID[%s] db error:%s", msgID, err)
return err
}
cn := jobs.Remove(data.EntryId)
select {
case res := <-cn:
if res {
err = e.Orm.Table(data.TableName()).Where("entry_id = ?", data.EntryId).Update("entry_id", 0).Error
if err != nil {
log.Errorf("msgID[%s] db error:%s", msgID, err)
}
return err
}
case <-time.After(time.Second * 1):
e.Msg = msg.TimeOut
return nil
}
return nil
}
// StartJob 启动任务
func (e *SysJob) StartJob(c *dto.GeneralGetDto) error {
var data models.SysJob
var err error
msgID := e.MsgID
err = e.Orm.Table(data.TableName()).First(&data, c.Id).Error
if err != nil {
log.Errorf("msgID[%s] db error:%s", msgID, err)
return err
}
if data.JobType == 1 {
var j = &jobs.HttpJob{}
j.InvokeTarget = data.InvokeTarget
j.CronExpression = data.CronExpression
j.JobId = data.JobId
j.Name = data.JobName
data.EntryId, err = jobs.AddJob(j)
if err != nil {
log.Errorf("msgID[%s] jobs AddJob[HttpJob] error:%s", msgID, err)
}
} else {
var j = &jobs.ExecJob{}
j.InvokeTarget = data.InvokeTarget
j.CronExpression = data.CronExpression
j.JobId = data.JobId
j.Name = data.JobName
j.Args = data.Args
data.EntryId, err = jobs.AddJob(j)
if err != nil {
log.Errorf("msgID[%s] jobs AddJob[ExecJob] error:%s", msgID, err)
}
}
if err != nil {
return err
}
err = e.Orm.Table(data.TableName()).Where(c.Id).Updates(&data).Error
if err != nil {
log.Errorf("msgID[%s] db error:%s", msgID, err)
}
return err
}
+38
View File
@@ -0,0 +1,38 @@
package jobs
import (
"fmt"
"time"
)
// 需要将定义的struct 添加到字典中;
// 字典 key 可以配置到 自动任务 调用目标 中;
func InitJob() {
jobList = map[string]JobsExec{
"ExamplesOne": ExamplesOne{},
// ...
}
}
// 新添加的job 必须按照以下格式定义,并实现Exec函数
type ExamplesOne struct {
}
func (t ExamplesOne) Exec(arg interface{}) error {
str := time.Now().Format(timeFormat) + " [INFO] JobCore ExamplesOne exec success"
// TODO: 这里需要注意 Examples 传入参数是 string 所以 arg.(string);请根据对应的类型进行转化;
switch arg.(type) {
case string:
if arg.(string) != "" {
fmt.Println("string", arg.(string))
fmt.Println(str, arg.(string))
} else {
fmt.Println("arg is nil")
fmt.Println(str, "arg is nil")
}
break
}
return nil
}
+195
View File
@@ -0,0 +1,195 @@
package jobs
import (
"fmt"
"sync"
"time"
"github.com/robfig/cron/v3"
"go-admin/app/admin/models"
"go-admin/common/global"
"go-admin/pkg"
"go-admin/pkg/cronjob"
)
var timeFormat = "2006-01-02 15:04:05"
var retryCount = 3
var jobList map[string]JobsExec
var lock sync.Mutex
type JobCore struct {
InvokeTarget string
Name string
JobId uint
EntryId int
CronExpression string
Args string
}
// 任务类型 http
type HttpJob struct {
JobCore
}
type ExecJob struct {
JobCore
}
func (e *ExecJob) Run() {
startTime := time.Now()
var obj = jobList[e.InvokeTarget]
if obj == nil {
global.JobLogger.Warning(" ExecJob Run job nil", e)
return
}
err := CallExec(obj.(JobsExec), e.Args)
if err != nil {
// 如果失败暂停一段时间重试
fmt.Println(time.Now().Format(timeFormat), " [ERROR] mission failed! ", err)
}
// 结束时间
endTime := time.Now()
// 执行时间
latencyTime := endTime.Sub(startTime)
//TODO: 待完善部分
//str := time.Now().Format(timeFormat) + " [INFO] JobCore " + string(e.EntryId) + "exec success , spend :" + latencyTime.String()
//ws.SendAll(str)
global.JobLogger.Info(time.Now().Format(timeFormat), " [INFO] JobCore ", e, "exec success , spend :", latencyTime)
return
}
//http 任务接口
func (h *HttpJob) Run() {
startTime := time.Now()
var count = 0
var err error
var str string
/* 循环 */
LOOP:
if count < retryCount {
/* 跳过迭代 */
str, err = pkg.Get(h.InvokeTarget)
if err != nil {
// 如果失败暂停一段时间重试
fmt.Println(time.Now().Format(timeFormat), " [ERROR] mission failed! ", err)
fmt.Printf(time.Now().Format(timeFormat)+" [INFO] Retry after the task fails %d seconds! %s \n", (count+1)*5, str)
time.Sleep(time.Duration(count+1) * 5 * time.Second)
count = count + 1
goto LOOP
}
}
// 结束时间
endTime := time.Now()
// 执行时间
latencyTime := endTime.Sub(startTime)
//TODO: 待完善部分
global.JobLogger.Info(time.Now().Format(timeFormat), " [INFO] JobCore ", h, "exec success , spend :", latencyTime)
return
}
// 初始化
func Setup() {
fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Starting...")
global.GADMCron = cronjob.NewWithSeconds()
sysJob := models.SysJob{}
jobList := make([]models.SysJob, 0)
err := sysJob.GetList(&jobList)
if err != nil {
fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore init error", err)
}
if len(jobList) == 0 {
fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore total:0")
}
_, err = sysJob.RemoveAllEntryID()
if err != nil {
fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore remove entry_id error", err)
}
for i := 0; i < len(jobList); i++ {
if jobList[i].JobType == 1 {
j := &HttpJob{}
j.InvokeTarget = jobList[i].InvokeTarget
j.CronExpression = jobList[i].CronExpression
j.JobId = jobList[i].JobId
j.Name = jobList[i].JobName
sysJob.EntryId, err = AddJob(j)
} else if jobList[i].JobType == 2 {
j := &ExecJob{}
j.InvokeTarget = jobList[i].InvokeTarget
j.CronExpression = jobList[i].CronExpression
j.JobId = jobList[i].JobId
j.Name = jobList[i].JobName
j.Args = jobList[i].Args
sysJob.EntryId, err = AddJob(j)
}
err = sysJob.Update(jobList[i].JobId)
}
// 其中任务
global.GADMCron.Start()
fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore start success.")
// 关闭任务
defer global.GADMCron.Stop()
select {}
}
// 添加任务 AddJob(invokeTarget string, jobId int, jobName string, cronExpression string)
func AddJob(job Job) (int, error) {
if job == nil {
fmt.Println("unknown")
return 0, nil
}
return job.addJob()
}
func (h *HttpJob) addJob() (int, error) {
id, err := global.GADMCron.AddJob(h.CronExpression, h)
if err != nil {
fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore AddJob error", err)
return 0, err
}
EntryId := int(id)
return EntryId, nil
}
func (h *ExecJob) addJob() (int, error) {
id, err := global.GADMCron.AddJob(h.CronExpression, h)
if err != nil {
fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore AddJob error", err)
return 0, err
}
EntryId := int(id)
return EntryId, nil
}
// 移除任务
func Remove(entryID int) chan bool {
ch := make(chan bool)
go func() {
global.GADMCron.Remove(cron.EntryID(entryID))
fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Remove success ,info entryID :", entryID)
ch <- true
}()
return ch
}
// 任务停止
func Stop() chan bool {
ch := make(chan bool)
go func() {
global.GADMCron.Stop()
ch <- true
}()
return ch
}
+14
View File
@@ -0,0 +1,14 @@
package jobs
type Job interface {
Run()
addJob() (int, error)
}
type JobsExec interface {
Exec(arg interface{}) error
}
func CallExec(e JobsExec, arg interface{}) error {
return e.Exec(arg)
}
+69 -46
View File
@@ -3,32 +3,36 @@ package api
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"go-admin/database"
"go-admin/global/orm"
"go-admin/router"
"go-admin/tools"
config2 "go-admin/tools/config"
"go-admin/app/admin/router"
"io/ioutil"
"net/http"
"os"
"os/signal"
"time"
"github.com/gin-gonic/gin"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"go-admin/app/jobs"
"go-admin/common/database"
"go-admin/common/global"
mycasbin "go-admin/pkg/casbin"
"go-admin/pkg/logger"
"go-admin/tools"
"go-admin/tools/config"
)
var (
config string
port string
mode string
StartCmd = &cobra.Command{
Use: "server",
Short: "Start API server",
Example: "go-admin server config/settings.yml",
configYml string
port string
mode string
StartCmd = &cobra.Command{
Use: "server",
Short: "Start API server",
Example: "go-admin server -c config/settings.yml",
SilenceUsage: true,
PreRun: func(cmd *cobra.Command, args []string) {
usage()
setup()
},
RunE: func(cmd *cobra.Command, args []string) error {
@@ -37,76 +41,95 @@ var (
}
)
var AppRouters = make([]func(), 0)
func init() {
StartCmd.PersistentFlags().StringVarP(&config, "config", "c", "config/settings.yml", "Start server with provided configuration file")
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8000", "Tcp port server listening on")
StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
}
func usage() {
usageStr := `starting api server`
log.Printf("%s\n", usageStr)
//注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法
AppRouters = append(AppRouters, router.InitRouter)
}
func setup() {
//1. 读取配置
config2.ConfigSetup(config)
config.Setup(configYml)
//2. 设置日志
tools.InitLogger()
logger.Setup()
//3. 初始化数据库链接
database.Setup()
database.Setup(config.DatabaseConfig.Driver)
//4. 接口访问控制加载
mycasbin.Setup()
usageStr := `starting api server`
global.Logger.Info(usageStr)
}
func run() error {
if mode != "" {
config2.SetConfig(config, "settings.application.mode", mode)
}
if viper.GetString("settings.application.mode") == string(tools.ModeProd) {
gin.SetMode(gin.ReleaseMode)
}
engine := global.Cfg.GetEngine()
if engine == nil {
engine = gin.New()
}
r := router.InitRouter()
defer orm.Eloquent.Close()
if port != "" {
config2.SetConfig(config, "settings.application.port", port)
for _, f := range AppRouters {
f()
}
srv := &http.Server{
Addr: config2.ApplicationConfig.Host + ":" + config2.ApplicationConfig.Port,
Handler: r,
Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
Handler: global.Cfg.GetEngine(),
}
go func() {
jobs.InitJob()
jobs.Setup()
}()
go func() {
// 服务连接
if config2.ApplicationConfig.IsHttps {
if err := srv.ListenAndServeTLS(config2.SslConfig.Pem, config2.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
if config.SslConfig.Enable {
if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
global.Logger.Fatal("listen: ", err)
}
} else {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
global.Logger.Fatal("listen: ", err)
}
}
}()
content, _ := ioutil.ReadFile("./static/go-admin.txt")
fmt.Println(string(content))
fmt.Printf("%s Server Run http://127.0.0.1:%s/ \r\n", tools.GetCurrntTimeStr(), config2.ApplicationConfig.Port)
fmt.Printf("%s Swagger URL http://127.0.0.1:%s/swagger/index.html \r\n", tools.GetCurrntTimeStr(), config2.ApplicationConfig.Port)
fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrntTimeStr())
fmt.Println(tools.Red(string(content)))
tip()
fmt.Println(tools.Green("Server run at:"))
fmt.Printf("- Local: http://localhost:%s/ \r\n", config.ApplicationConfig.Port)
fmt.Printf("- Network: http://%s:%s/ \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
fmt.Println(tools.Green("Swagger run at:"))
fmt.Printf("- Local: http://localhost:%s/swagger/index.html \r\n", config.ApplicationConfig.Port)
fmt.Printf("- Network: http://%s:%s/swagger/index.html \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrentTimeStr())
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrntTimeStr())
fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr())
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
global.Logger.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
global.Logger.Println("Server exiting")
return nil
}
func tip() {
usageStr := `欢迎使用 ` + tools.Green(`go-admin `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令`
fmt.Printf("%s \n\n", usageStr)
}
+26 -12
View File
@@ -2,35 +2,49 @@ package cmd
import (
"errors"
"github.com/spf13/cobra"
"go-admin/cmd/api"
"go-admin/cmd/migrate"
log "github.com/sirupsen/logrus"
"fmt"
"os"
"github.com/spf13/cobra"
"go-admin/cmd/api"
"go-admin/cmd/config"
"go-admin/cmd/migrate"
"go-admin/cmd/version"
"go-admin/common/global"
"go-admin/tools"
)
var rootCmd = &cobra.Command{
Use: "go-admin",
Short: "-v",
SilenceUsage: true,
DisableAutoGenTag: true,
Long: `go-admin`,
Use: "go-admin",
Short: "go-admin",
SilenceUsage: true,
Long: `go-admin`,
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("requires at least one arg")
tip()
return errors.New(tools.Red("requires at least one arg"))
}
return nil
},
PersistentPreRunE: func(*cobra.Command, []string) error { return nil },
Run: func(cmd *cobra.Command, args []string) {
usageStr := `go-admin 1.0.0 欢迎使用,可以是用 -h 查看命令`
log.Printf("%s\n", usageStr)
tip()
},
}
func tip() {
usageStr := `欢迎使用 ` + tools.Green(`go-admin `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令`
usageStr1 := `也可以参考 http://doc.zhangwj.com/go-admin-site/guide/ksks.html 里边的【启动】章节`
fmt.Printf("%s\n", usageStr)
fmt.Printf("%s\n", usageStr1)
}
func init() {
rootCmd.AddCommand(api.StartCmd)
rootCmd.AddCommand(migrate.StartCmd)
rootCmd.AddCommand(version.StartCmd)
rootCmd.AddCommand(config.StartCmd)
}
//Execute : apply commands
+62
View File
@@ -0,0 +1,62 @@
package config
import (
"encoding/json"
"fmt"
"github.com/spf13/cobra"
"go-admin/tools/config"
)
var (
configYml string
mode string
StartCmd = &cobra.Command{
Use: "config",
Short: "Get Application config info",
Example: "go-admin config -c config/settings.yml",
Run: func(cmd *cobra.Command, args []string) {
run()
},
}
)
func init() {
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
}
func run() {
config.Setup(configYml)
application, errs := json.MarshalIndent(config.ApplicationConfig, "", " ") //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println("application:", string(application))
jwt, errs := json.MarshalIndent(config.JwtConfig, "", " ") //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println("jwt:", string(jwt))
database, errs := json.MarshalIndent(config.DatabaseConfig, "", " ") //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println("database:", string(database))
gen, errs := json.MarshalIndent(config.GenConfig, "", " ") //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println("gen:", string(gen))
loggerConfig, errs := json.MarshalIndent(config.LoggerConfig, "", " ") //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println("logger:", string(loggerConfig))
}
+67
View File
@@ -0,0 +1,67 @@
package migration
import (
"fmt"
"github.com/spf13/cast"
"gorm.io/gorm"
"log"
"path/filepath"
"sort"
"strconv"
"sync"
)
var Migrate = &Migration{
version: make(map[int]func(db *gorm.DB, version string) error),
}
type Migration struct {
db *gorm.DB
version map[int]func(db *gorm.DB, version string) error
mutex sync.Mutex
}
func (e *Migration) GetDb() *gorm.DB {
return e.db
}
func (e *Migration) SetDb(db *gorm.DB) {
e.db = db
}
func (e *Migration) SetVersion(k int, f func(db *gorm.DB, version string) error) {
e.mutex.Lock()
defer e.mutex.Unlock()
e.version[k] = f
}
func (e *Migration) Migrate() {
versions := make([]int, 0)
for k := range e.version {
versions = append(versions, k)
}
sort.IntsAreSorted(versions)
var err error
var count int64
for _, v := range versions {
fmt.Println(v)
err = e.db.Debug().Table("sys_migration").Where("version = ?", v).Count(&count).Error
if err != nil {
log.Fatalln(err)
}
if count > 0 {
log.Println(count)
count = 0
continue
}
err = (e.version[v])(e.db.Debug(), strconv.Itoa(v))
if err != nil {
log.Fatalln(err)
}
}
}
func GetFilename(s string) int {
s = filepath.Base(s)
return cast.ToInt(s[:13])
}
@@ -0,0 +1,51 @@
package version
import (
"go-admin/app/admin/models/system"
"runtime"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/models/tools"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1599190683659Tables)
}
func _1599190683659Tables(db *gorm.DB, version string) error {
err := db.Debug().Migrator().AutoMigrate(
new(models.CasbinRule),
new(models.SysDept),
new(system.SysConfig),
new(tools.SysTables),
new(tools.SysColumns),
new(models.Menu),
new(models.LoginLog),
new(models.SysOperLog),
new(models.RoleMenu),
new(models.SysRoleDept),
new(models.SysUser),
new(models.SysRole),
new(models.Post),
new(models.DictData),
new(models.DictType),
new(models.SysJob),
new(system.SysConfig),
new(models.SysSetting),
new(models.SysFileDir),
new(models.SysFileInfo),
new(models.SysCategory),
new(models.SysContent),
)
if err != nil {
return err
}
return db.Create(&common.Migration{
Version: version,
}).Error
}
@@ -0,0 +1,402 @@
package version
import (
"go-admin/app/admin/models/system"
"runtime"
"time"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1599190683670Test)
}
func _1599190683670Test(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
list1 := []models.RoleMenu{
{RoleId: 1, MenuId: 2, RoleName: "admin"},
{RoleId: 1, MenuId: 3, RoleName: "admin"},
{RoleId: 1, MenuId: 43, RoleName: "admin"},
{RoleId: 1, MenuId: 44, RoleName: "admin"},
{RoleId: 1, MenuId: 45, RoleName: "admin"},
{RoleId: 1, MenuId: 46, RoleName: "admin"},
{RoleId: 1, MenuId: 51, RoleName: "admin"},
{RoleId: 1, MenuId: 52, RoleName: "admin"},
{RoleId: 1, MenuId: 56, RoleName: "admin"},
{RoleId: 1, MenuId: 57, RoleName: "admin"},
{RoleId: 1, MenuId: 58, RoleName: "admin"},
{RoleId: 1, MenuId: 59, RoleName: "admin"},
{RoleId: 1, MenuId: 60, RoleName: "admin"},
{RoleId: 1, MenuId: 61, RoleName: "admin"},
{RoleId: 1, MenuId: 62, RoleName: "admin"},
{RoleId: 1, MenuId: 63, RoleName: "admin"},
{RoleId: 1, MenuId: 64, RoleName: "admin"},
{RoleId: 1, MenuId: 66, RoleName: "admin"},
{RoleId: 1, MenuId: 67, RoleName: "admin"},
{RoleId: 1, MenuId: 68, RoleName: "admin"},
{RoleId: 1, MenuId: 69, RoleName: "admin"},
{RoleId: 1, MenuId: 70, RoleName: "admin"},
{RoleId: 1, MenuId: 71, RoleName: "admin"},
{RoleId: 1, MenuId: 72, RoleName: "admin"},
{RoleId: 1, MenuId: 73, RoleName: "admin"},
{RoleId: 1, MenuId: 74, RoleName: "admin"},
{RoleId: 1, MenuId: 75, RoleName: "admin"},
{RoleId: 1, MenuId: 76, RoleName: "admin"},
{RoleId: 1, MenuId: 77, RoleName: "admin"},
{RoleId: 1, MenuId: 78, RoleName: "admin"},
{RoleId: 1, MenuId: 79, RoleName: "admin"},
{RoleId: 1, MenuId: 80, RoleName: "admin"},
{RoleId: 1, MenuId: 81, RoleName: "admin"},
{RoleId: 1, MenuId: 82, RoleName: "admin"},
{RoleId: 1, MenuId: 83, RoleName: "admin"},
{RoleId: 1, MenuId: 84, RoleName: "admin"},
{RoleId: 1, MenuId: 85, RoleName: "admin"},
{RoleId: 1, MenuId: 86, RoleName: "admin"},
{RoleId: 1, MenuId: 87, RoleName: "admin"},
{RoleId: 1, MenuId: 89, RoleName: "admin"},
{RoleId: 1, MenuId: 90, RoleName: "admin"},
{RoleId: 1, MenuId: 91, RoleName: "admin"},
{RoleId: 1, MenuId: 92, RoleName: "admin"},
{RoleId: 1, MenuId: 93, RoleName: "admin"},
{RoleId: 1, MenuId: 94, RoleName: "admin"},
{RoleId: 1, MenuId: 95, RoleName: "admin"},
{RoleId: 1, MenuId: 96, RoleName: "admin"},
{RoleId: 1, MenuId: 97, RoleName: "admin"},
{RoleId: 1, MenuId: 103, RoleName: "admin"},
{RoleId: 1, MenuId: 104, RoleName: "admin"},
{RoleId: 1, MenuId: 105, RoleName: "admin"},
{RoleId: 1, MenuId: 106, RoleName: "admin"},
{RoleId: 1, MenuId: 107, RoleName: "admin"},
{RoleId: 1, MenuId: 108, RoleName: "admin"},
{RoleId: 1, MenuId: 109, RoleName: "admin"},
{RoleId: 1, MenuId: 110, RoleName: "admin"},
{RoleId: 1, MenuId: 111, RoleName: "admin"},
{RoleId: 1, MenuId: 112, RoleName: "admin"},
{RoleId: 1, MenuId: 113, RoleName: "admin"},
{RoleId: 1, MenuId: 114, RoleName: "admin"},
{RoleId: 1, MenuId: 115, RoleName: "admin"},
{RoleId: 1, MenuId: 116, RoleName: "admin"},
{RoleId: 1, MenuId: 117, RoleName: "admin"},
{RoleId: 1, MenuId: 118, RoleName: "admin"},
{RoleId: 1, MenuId: 119, RoleName: "admin"},
{RoleId: 1, MenuId: 120, RoleName: "admin"},
{RoleId: 1, MenuId: 121, RoleName: "admin"},
{RoleId: 1, MenuId: 122, RoleName: "admin"},
{RoleId: 1, MenuId: 123, RoleName: "admin"},
{RoleId: 1, MenuId: 138, RoleName: "admin"},
{RoleId: 1, MenuId: 142, RoleName: "admin"},
{RoleId: 1, MenuId: 201, RoleName: "admin"},
{RoleId: 1, MenuId: 202, RoleName: "admin"},
{RoleId: 1, MenuId: 203, RoleName: "admin"},
{RoleId: 1, MenuId: 204, RoleName: "admin"},
{RoleId: 1, MenuId: 205, RoleName: "admin"},
{RoleId: 1, MenuId: 206, RoleName: "admin"},
{RoleId: 1, MenuId: 211, RoleName: "admin"},
{RoleId: 1, MenuId: 212, RoleName: "admin"},
{RoleId: 1, MenuId: 213, RoleName: "admin"},
{RoleId: 1, MenuId: 214, RoleName: "admin"},
{RoleId: 1, MenuId: 215, RoleName: "admin"},
{RoleId: 1, MenuId: 216, RoleName: "admin"},
{RoleId: 1, MenuId: 217, RoleName: "admin"},
{RoleId: 1, MenuId: 220, RoleName: "admin"},
{RoleId: 1, MenuId: 221, RoleName: "admin"},
{RoleId: 1, MenuId: 222, RoleName: "admin"},
{RoleId: 1, MenuId: 223, RoleName: "admin"},
{RoleId: 1, MenuId: 224, RoleName: "admin"},
{RoleId: 1, MenuId: 225, RoleName: "admin"},
{RoleId: 1, MenuId: 226, RoleName: "admin"},
{RoleId: 1, MenuId: 227, RoleName: "admin"},
{RoleId: 1, MenuId: 228, RoleName: "admin"},
{RoleId: 1, MenuId: 229, RoleName: "admin"},
{RoleId: 1, MenuId: 230, RoleName: "admin"},
{RoleId: 1, MenuId: 231, RoleName: "admin"},
{RoleId: 1, MenuId: 232, RoleName: "admin"},
{RoleId: 1, MenuId: 233, RoleName: "admin"},
{RoleId: 1, MenuId: 234, RoleName: "admin"},
{RoleId: 1, MenuId: 235, RoleName: "admin"},
{RoleId: 1, MenuId: 236, RoleName: "admin"},
{RoleId: 1, MenuId: 237, RoleName: "admin"},
{RoleId: 1, MenuId: 238, RoleName: "admin"},
{RoleId: 1, MenuId: 239, RoleName: "admin"},
{RoleId: 1, MenuId: 240, RoleName: "admin"},
{RoleId: 1, MenuId: 241, RoleName: "admin"},
{RoleId: 1, MenuId: 242, RoleName: "admin"},
{RoleId: 1, MenuId: 243, RoleName: "admin"},
{RoleId: 1, MenuId: 244, RoleName: "admin"},
{RoleId: 1, MenuId: 245, RoleName: "admin"},
{RoleId: 1, MenuId: 246, RoleName: "admin"},
{RoleId: 1, MenuId: 247, RoleName: "admin"},
{RoleId: 1, MenuId: 248, RoleName: "admin"},
{RoleId: 1, MenuId: 249, RoleName: "admin"},
{RoleId: 1, MenuId: 250, RoleName: "admin"},
{RoleId: 1, MenuId: 251, RoleName: "admin"},
{RoleId: 1, MenuId: 252, RoleName: "admin"},
{RoleId: 1, MenuId: 253, RoleName: "admin"},
{RoleId: 1, MenuId: 254, RoleName: "admin"},
{RoleId: 1, MenuId: 255, RoleName: "admin"},
{RoleId: 1, MenuId: 256, RoleName: "admin"},
{RoleId: 1, MenuId: 257, RoleName: "admin"},
{RoleId: 1, MenuId: 258, RoleName: "admin"},
{RoleId: 1, MenuId: 259, RoleName: "admin"},
{RoleId: 1, MenuId: 260, RoleName: "admin"},
{RoleId: 1, MenuId: 261, RoleName: "admin"},
{RoleId: 1, MenuId: 262, RoleName: "admin"},
{RoleId: 1, MenuId: 263, RoleName: "admin"},
{RoleId: 1, MenuId: 264, RoleName: "admin"},
{RoleId: 1, MenuId: 267, RoleName: "admin"},
{RoleId: 1, MenuId: 269, RoleName: "admin"},
{RoleId: 1, MenuId: 459, RoleName: "admin"},
{RoleId: 1, MenuId: 460, RoleName: "admin"},
{RoleId: 1, MenuId: 461, RoleName: "admin"},
{RoleId: 1, MenuId: 462, RoleName: "admin"},
{RoleId: 1, MenuId: 463, RoleName: "admin"},
{RoleId: 1, MenuId: 464, RoleName: "admin"},
{RoleId: 1, MenuId: 465, RoleName: "admin"},
{RoleId: 1, MenuId: 466, RoleName: "admin"},
{RoleId: 1, MenuId: 467, RoleName: "admin"},
{RoleId: 1, MenuId: 468, RoleName: "admin"},
{RoleId: 1, MenuId: 469, RoleName: "admin"},
{RoleId: 1, MenuId: 470, RoleName: "admin"},
{RoleId: 1, MenuId: 471, RoleName: "admin"},
{RoleId: 1, MenuId: 473, RoleName: "admin"},
{RoleId: 1, MenuId: 474, RoleName: "admin"},
{RoleId: 1, MenuId: 475, RoleName: "admin"},
{RoleId: 1, MenuId: 476, RoleName: "admin"},
{RoleId: 1, MenuId: 477, RoleName: "admin"},
{RoleId: 1, MenuId: 478, RoleName: "admin"},
{RoleId: 1, MenuId: 479, RoleName: "admin"},
{RoleId: 1, MenuId: 480, RoleName: "admin"},
{RoleId: 1, MenuId: 481, RoleName: "admin"},
{RoleId: 1, MenuId: 482, RoleName: "admin"},
{RoleId: 1, MenuId: 483, RoleName: "admin"},
}
list2 := []models.CasbinRule{
{PType: "p", V0: "admin", V1: "/api/v1/menulist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/menu", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/databytype/", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/menu", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/menu/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUserList", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUser/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUser/", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUser", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUser", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/sysUser/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/user/profile", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/rolelist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/role/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/role", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/role", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/role/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/configList", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/config/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/config", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/config", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/config/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/menurole", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/roleMenuTreeselect/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/menuTreeselect", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/rolemenu", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/rolemenu", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/rolemenu/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/deptList", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dept/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dept", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/dept", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/dept/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/datalist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/data/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/databytype/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/data", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/data/", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/data/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/typelist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/type/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/type", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/type", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/type/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/postlist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/post/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/post", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/post", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/post/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/menu/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/menuids", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/loginloglist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/loginlog/:id", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/operloglist", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/getinfo", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/roledatascope", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/roleDeptTreeselect/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/deptTree", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/configKey/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/logout", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/user/avatar", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/user/pwd", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/dict/typeoptionselect", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysjob/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "DELETE"},
{PType: "p", V0: "admin", V1: "/api/v1/syssettingList", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/syssetting/:id", V2: "GET"},
{PType: "p", V0: "admin", V1: "/api/v1/syssetting", V2: "POST"},
{PType: "p", V0: "admin", V1: "/api/v1/syssetting", V2: "PUT"},
{PType: "p", V0: "admin", V1: "/api/v1/syssetting/:id", V2: "DELETE"},
}
list3 := []models.SysDept{
{DeptId: 1, ParentId: 0, DeptPath: "/0/1", DeptName: "爱拓科技", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DeptId: 7, ParentId: 1, DeptPath: "/0/1/7", DeptName: "研发部", Sort: 1, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DeptId: 8, ParentId: 1, DeptPath: "/0/1/8", DeptName: "运维部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DeptId: 9, ParentId: 1, DeptPath: "/0/1/9", DeptName: "客服部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DeptId: 10, ParentId: 1, DeptPath: "/0/1/10", DeptName: "人力资源", Sort: 3, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "1", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
}
list4 := []system.SysConfig{
{Model: gorm.Model{ID: 1, CreatedAt: time.Now(), UpdatedAt: time.Now(), DeletedAt: gorm.DeletedAt{}}, ControlBy: common.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "主框架页-默认皮肤样式名称", ConfigKey: "sys_index_skinName", ConfigValue: "skin-blue", ConfigType: "Y", Remark: "蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow"},
{Model: gorm.Model{ID: 2, CreatedAt: time.Now(), UpdatedAt: time.Now(), DeletedAt: gorm.DeletedAt{}}, ControlBy: common.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "用户管理-账号初始密码", ConfigKey: "sys.user.initPassword", ConfigValue: "123456", ConfigType: "Y", Remark: "初始化密码 123456"},
{Model: gorm.Model{ID: 3, CreatedAt: time.Now(), UpdatedAt: time.Now(), DeletedAt: gorm.DeletedAt{}}, ControlBy: common.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "主框架页-侧边栏主题", ConfigKey: "sys_index_sideTheme", ConfigValue: "theme-dark", ConfigType: "Y", Remark: "深色主题theme-dark,浅色主题theme-light"},
}
list5 := []models.Post{
{PostId: 1, PostName: "首席执行官", PostCode: "CEO", Sort: 0, Status: "0", Remark: "首席执行官", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{PostId: 2, PostName: "首席技术执行官", PostCode: "CTO", Sort: 2, Status: "0", Remark: "首席技术执行官", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{PostId: 3, PostName: "首席运营官", PostCode: "COO", Sort: 3, Status: "0", Remark: "测试工程师", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
}
list6 := []models.SysRole{
{1, "系统管理员", "0", "admin", 1, "", "1", "", "", true, "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, "", []int{}, []int{}},
}
list7 := []models.DictType{
{DictId: 1, DictName: "系统开关", DictType: "sys_normal_disable", Status: "0", CreateBy: "1", UpdateBy: "1", Remark: "系统开关列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 2, DictName: "用户性别", DictType: "sys_user_sex", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "用户性别列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 3, DictName: "菜单状态", DictType: "sys_show_hide", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "菜单状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 4, DictName: "系统是否", DictType: "sys_yes_no", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "系统是否列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 5, DictName: "任务状态", DictType: "sys_job_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "任务状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 6, DictName: "任务分组", DictType: "sys_job_group", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "任务分组列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 7, DictName: "通知类型", DictType: "sys_notice_type", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "通知类型列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 8, DictName: "系统状态", DictType: "sys_common_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "登录状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 9, DictName: "操作类型", DictType: "sys_oper_type", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "操作类型列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictId: 10, DictName: "通知状态", DictType: "sys_notice_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "通知状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
}
list8 := []models.SysUser{
{models.SysUserId{1}, models.LoginM{models.UserName{"admin"}, models.PassWord{"$2a$10$cKFFTCzGOvaIHHJY2K45Zuwt8TD6oPzYi4s5MzYIBAWCLL6ZhouP2"}}, models.SysUserB{"zhangwj", "13818888888", 1, "", "", "0", "1@qq.com", 1, 1, "1", "1", "", "0", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, "", ""}},
}
list9 := []models.DictData{
{DictCode: 1, DictSort: 0, DictLabel: "正常", DictValue: "0", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统正常", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 2, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统停用", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 3, DictSort: 0, DictLabel: "男", DictValue: "0", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别男", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 4, DictSort: 0, DictLabel: "女", DictValue: "1", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别女", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 5, DictSort: 0, DictLabel: "未知", DictValue: "2", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别未知", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 6, DictSort: 0, DictLabel: "显示", DictValue: "0", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "显示菜单", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 7, DictSort: 0, DictLabel: "隐藏", DictValue: "1", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "隐藏菜单", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 8, DictSort: 0, DictLabel: "是", DictValue: "Y", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统默认是", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 9, DictSort: 0, DictLabel: "否", DictValue: "N", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统默认否", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 10, DictSort: 0, DictLabel: "正常", DictValue: "2", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "正常状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 11, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "停用状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 12, DictSort: 0, DictLabel: "默认", DictValue: "DEFAULT", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "默认分组", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 13, DictSort: 0, DictLabel: "系统", DictValue: "SYSTEM", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统分组", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 14, DictSort: 0, DictLabel: "通知", DictValue: "1", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "通知", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 15, DictSort: 0, DictLabel: "公告", DictValue: "2", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "公告", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 16, DictSort: 0, DictLabel: "正常", DictValue: "0", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "正常状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 17, DictSort: 0, DictLabel: "关闭", DictValue: "1", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "关闭状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 18, DictSort: 0, DictLabel: "新增", DictValue: "1", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "新增操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 19, DictSort: 0, DictLabel: "修改", DictValue: "2", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "修改操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 20, DictSort: 0, DictLabel: "删除", DictValue: "3", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "删除操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 21, DictSort: 0, DictLabel: "授权", DictValue: "4", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "授权操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 22, DictSort: 0, DictLabel: "导出", DictValue: "5", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "导出操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 23, DictSort: 0, DictLabel: "导入", DictValue: "6", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "导入操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 24, DictSort: 0, DictLabel: "强退", DictValue: "7", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "强退操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 25, DictSort: 0, DictLabel: "生成代码", DictValue: "8", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "生成操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 26, DictSort: 0, DictLabel: "清空数据", DictValue: "9", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "清空操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 27, DictSort: 0, DictLabel: "成功", DictValue: "0", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "成功状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 28, DictSort: 0, DictLabel: "失败", DictValue: "1", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "失败状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 29, DictSort: 0, DictLabel: "登录", DictValue: "10", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "登录操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 30, DictSort: 0, DictLabel: "退出", DictValue: "11", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
{DictCode: 31, DictSort: 0, DictLabel: "获取验证码", DictValue: "12", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "获取验证码", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
}
list10 := []models.SysSetting{
{1, "go-admin管理系统", "https://gitee.com/mydearzwj/image/raw/master/img/go-admin.png", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}},
}
list11 := []models.SysJob{
{1, "接口测试", "DEFAULT", 1, "0/5 * * * * ", "http://localhost:8000", "", 1, 1, 1, 0, "", "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ""},
{2, "函数测试", "DEFAULT", 2, "0/5 * * * * ", "ExamplesOne", "参数", 1, 1, 1, 0, "", "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ""},
}
err := tx.Create(list1).Error
if err != nil {
return err
}
err = tx.Create(list2).Error
if err != nil {
return err
}
err = tx.Create(list3).Error
if err != nil {
return err
}
err = tx.Create(list4).Error
if err != nil {
return err
}
err = tx.Create(list5).Error
if err != nil {
return err
}
err = tx.Create(list6).Error
if err != nil {
return err
}
err = tx.Create(list7).Error
if err != nil {
return err
}
err = tx.Create(list8).Error
if err != nil {
return err
}
err = tx.Create(list9).Error
if err != nil {
return err
}
err = tx.Create(list10).Error
if err != nil {
return err
}
err = tx.Create(list11).Error
if err != nil {
return err
}
if err := models.InitDb(tx); err != nil {
}
return tx.Create(&common.Migration{
Version: version,
}).Error
})
}
@@ -0,0 +1,59 @@
package version
import (
"runtime"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1599190683680Test)
}
func _1599190683680Test(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
var err error
list := []models.Menu{
{MenuId: 496, MenuName: "Sources", Title: "资源管理", Icon: "network", Path: "/sources", Paths: "/0/496", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 3, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"},
{MenuId: 497, MenuName: "File", Title: "文件管理", Icon: "documentation", Path: "file-manage", Paths: "/0/496/497", MenuType: "C", Action: "", Permission: "", ParentId: 496, NoCache: true, Breadcrumb: "", Component: "/fileManage/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"},
{MenuId: 498, MenuName: "", Title: "内容管理", Icon: "pass", Path: "/content", Paths: "/0/498", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 4, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"},
{MenuId: 499, MenuName: "SysCategory", Title: "分类", Icon: "pass", Path: "syscategory", Paths: "/0/498/499", MenuType: "C", Action: "无", Permission: "syscategory:syscategory:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscategory/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 500, MenuName: "", Title: "分页获取分类", Icon: "pass", Path: "", Paths: "/0/498/499/500", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:query", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 501, MenuName: "", Title: "创建分类", Icon: "pass", Path: "", Paths: "/0/498/499/501", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:add", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 502, MenuName: "", Title: "修改分类", Icon: "pass", Path: "", Paths: "/0/498/499/502", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:edit", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 503, MenuName: "", Title: "删除分类", Icon: "pass", Path: "", Paths: "/0/498/499/503", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:remove", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 504, MenuName: "Category", Title: "分类", Icon: "bug", Path: "category", Paths: "/0/63/504", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 505, MenuName: "", Title: "分页获取分类", Icon: "bug", Path: "/api/v1/syscategoryList", Paths: "/0/63/504/505", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 506, MenuName: "", Title: "根据id获取分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/506", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 507, MenuName: "", Title: "创建分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/507", MenuType: "A", Action: "POST", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 508, MenuName: "", Title: "修改分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/508", MenuType: "A", Action: "PUT", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 509, MenuName: "", Title: "删除分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/509", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 511, MenuName: "SysContent", Title: "内容管理", Icon: "pass", Path: "syscontent", Paths: "/0/498/511", MenuType: "C", Action: "无", Permission: "syscontent:syscontent:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscontent/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 512, MenuName: "", Title: "分页获取内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/512", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:query", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 513, MenuName: "", Title: "创建内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/513", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:add", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 514, MenuName: "", Title: "修改内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/514", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:edit", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 515, MenuName: "", Title: "删除内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/515", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:remove", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 516, MenuName: "Content", Title: "内容管理", Icon: "bug", Path: "content", Paths: "/0/63/516", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 517, MenuName: "", Title: "分页获取内容管理", Icon: "bug", Path: "/api/v1/syscontentList", Paths: "/0/63/516/517", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 518, MenuName: "", Title: "根据id获取内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/518", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 519, MenuName: "", Title: "创建内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/519", MenuType: "A", Action: "POST", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 520, MenuName: "", Title: "修改内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/520", MenuType: "A", Action: "PUT", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
{MenuId: 521, MenuName: "", Title: "删除内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/521", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"},
}
err = tx.Create(list).Error
if err != nil {
return err
}
return tx.Create(&common.Migration{
Version: version,
}).Error
})
}
@@ -0,0 +1,36 @@
package version
import (
"runtime"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1600089797118Migrate)
}
func _1600089797118Migrate(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
f := &models.SysFileDir{
Label: "根目录",
PId: 0,
Sort: 0,
Path: "",
CreateBy: "1",
UpdateBy: "1",
}
err := tx.Create(f).Error
if err != nil {
return err
}
return tx.Create(&common.Migration{
Version: version,
}).Error
})
}
@@ -0,0 +1,42 @@
package version
import (
"go-admin/app/admin/models"
"go-admin/app/admin/models/system"
"gorm.io/gorm"
"runtime"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1602644950000Test)
}
func _1602644950000Test(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
err := db.Migrator().RenameColumn(&system.SysConfig{}, "config_id", "id")
if err != nil {
return err
}
list2 := []models.CasbinRule{
{PType: "p", V0: "admin", V1: "/api/v1/config", V2: "GET"},
}
err = tx.Create(list2).Error
if err != nil {
return err
}
menu := models.Menu{MenuId: 86, Path: "/api/v1/config"}
err = tx.Model(&menu).Where("menu_id = ?", 86).Update("Path", "/api/v1/config").Error
if err != nil {
return err
}
return db.Create(&common.Migration{
Version: version,
}).Error
})
}
+57 -30
View File
@@ -1,24 +1,30 @@
package migrate
import (
"bytes"
"fmt"
log "github.com/sirupsen/logrus"
"go-admin/database"
"go-admin/global/orm"
"go-admin/models"
"go-admin/models/gorm"
"go-admin/tools"
config2 "go-admin/tools/config"
tools2 "go-admin/tools"
"strconv"
"text/template"
"time"
"github.com/spf13/cobra"
"go-admin/cmd/migrate/migration"
_ "go-admin/cmd/migrate/migration/version"
"go-admin/common/database"
"go-admin/common/global"
"go-admin/common/models"
"go-admin/pkg/logger"
"go-admin/tools/config"
)
var (
config string
mode string
StartCmd = &cobra.Command{
Use: "init",
Short: "initialize the database",
configYml string
generate bool
StartCmd = &cobra.Command{
Use: "migrate",
Short: "Initialize the database",
Example: "go-admin migrate -c config/settings.yml",
Run: func(cmd *cobra.Command, args []string) {
run()
},
@@ -26,34 +32,55 @@ var (
)
func init() {
StartCmd.PersistentFlags().StringVarP(&config, "config", "c", "config/settings.yml", "Start server with provided configuration file")
StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
StartCmd.PersistentFlags().BoolVarP(&generate, "generate", "g", false, "generate migration file")
}
func run() {
usage := `start init`
fmt.Println(usage)
//1. 读取配置
config2.ConfigSetup(config)
config.Setup(configYml)
//2. 设置日志
tools.InitLogger()
//3. 初始化数据库链接
database.Setup()
//4. 数据库迁移
_ = migrateModel()
log.Println("数据库结构初始化成功!")
//5. 数据初始化完成
if err := models.InitDb(); err != nil {
log.Fatal("数据库基础数据初始化失败!")
logger.Setup()
if !generate {
_ = initDB()
} else {
_ = genFile()
}
usage = `数据库基础数据初始化成功`
fmt.Println(usage)
}
func migrateModel() error {
if config2.DatabaseConfig.Dbtype == "mysql" {
orm.Eloquent = orm.Eloquent.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4")
if config.DatabaseConfig.Driver == "mysql" {
global.Eloquent.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4")
}
return gorm.AutoMigrate(orm.Eloquent)
err := global.Eloquent.Debug().AutoMigrate(&models.Migration{})
if err != nil {
return err
}
migration.Migrate.SetDb(global.Eloquent.Debug())
migration.Migrate.Migrate()
return err
}
func initDB() error {
//3. 初始化数据库链接
database.Setup(config.DatabaseConfig.Driver)
//4. 数据库迁移
fmt.Println("数据库迁移开始")
_ = migrateModel()
fmt.Println(`数据库基础数据初始化成功`)
return nil
}
func genFile() error {
t1, err := template.ParseFiles("template/migrate.template")
if err != nil {
return err
}
m := map[string]string{}
m["GenerateTime"] = strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
var b1 bytes.Buffer
err = t1.Execute(&b1, m)
tools2.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go")
return nil
}
+31
View File
@@ -0,0 +1,31 @@
package version
import (
"fmt"
"github.com/spf13/cobra"
"go-admin/common/global"
)
var (
configYml string
port string
mode string
StartCmd = &cobra.Command{
Use: "version",
Short: "Get version info",
Example: "go-admin version",
PreRun: func(cmd *cobra.Command, args []string) {
},
RunE: func(cmd *cobra.Command, args []string) error {
return run()
},
}
)
func run() error {
fmt.Println(global.Version)
return nil
}
+48
View File
@@ -0,0 +1,48 @@
package actions
import (
"net/http"
"github.com/gin-gonic/gin"
"go-admin/common/dto"
"go-admin/common/log"
"go-admin/common/models"
"go-admin/tools"
"go-admin/tools/app"
)
// CreateAction 通用新增动作
func CreateAction(control dto.Control) gin.HandlerFunc {
return func(c *gin.Context) {
db, err := tools.GetOrm(c)
if err != nil {
log.Error(err)
return
}
msgID := tools.GenerateMsgIDFromContext(c)
//新增操作
req := control.Generate()
err = req.Bind(c)
if err != nil {
app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败")
return
}
var object models.ActiveRecord
object, err = req.GenerateM()
if err != nil {
app.Error(c, http.StatusInternalServerError, err, "模型生成失败")
return
}
object.SetCreateBy(tools.GetUserIdUint(c))
err = db.WithContext(c).Create(object).Error
if err != nil {
log.Errorf("MsgID[%s] Create error: %s", msgID, err)
app.Error(c, http.StatusInternalServerError, err, "创建失败")
return
}
app.OK(c, object.GetId(), "创建成功")
c.Next()
}
}
+60
View File
@@ -0,0 +1,60 @@
package actions
import (
"net/http"
"github.com/gin-gonic/gin"
"go-admin/common/dto"
"go-admin/common/log"
"go-admin/common/models"
"go-admin/tools"
"go-admin/tools/app"
)
// DeleteAction 通用删除动作
func DeleteAction(control dto.Control) gin.HandlerFunc {
return func(c *gin.Context) {
db, err := tools.GetOrm(c)
if err != nil {
log.Error(err)
return
}
msgID := tools.GenerateMsgIDFromContext(c)
//删除操作
req := control.Generate()
err = req.Bind(c)
if err != nil {
log.Errorf("MsgID[%s] Bind error: %s", msgID, err)
app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败")
return
}
var object models.ActiveRecord
object, err = req.GenerateM()
if err != nil {
app.Error(c, http.StatusInternalServerError, err, "模型生成失败")
return
}
object.SetUpdateBy(tools.GetUserIdUint(c))
//数据权限检查
p := GetPermissionFromContext(c)
db = db.WithContext(c).Scopes(
Permission(object.TableName(), p),
).Where(req.GetId()).Delete(object)
if db.Error != nil {
log.Errorf("MsgID[%s] Delete error: %s", msgID, err)
app.Error(c, http.StatusInternalServerError, err, "删除失败")
return
}
if db.RowsAffected == 0 {
app.Error(c, http.StatusForbidden, nil, "无权删除该数据")
return
}
app.OK(c, object.GetId(), "删除成功")
c.Next()
}
}
+58
View File
@@ -0,0 +1,58 @@
package actions
import (
"errors"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"go-admin/common/dto"
"go-admin/common/log"
"go-admin/common/models"
"go-admin/tools"
"go-admin/tools/app"
)
// IndexAction 通用查询动作
func IndexAction(m models.ActiveRecord, d dto.Index, f func() interface{}) gin.HandlerFunc {
return func(c *gin.Context) {
db, err := tools.GetOrm(c)
if err != nil {
log.Error(err)
return
}
msgID := tools.GenerateMsgIDFromContext(c)
list := f()
object := m.Generate()
req := d.Generate()
var count int64
//查询列表
err = req.Bind(c)
if err != nil {
app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败")
return
}
//数据权限检查
p := GetPermissionFromContext(c)
err = db.WithContext(c).Model(object).
Scopes(
dto.MakeCondition(req.GetNeedSearch()),
dto.Paginate(req.GetPageSize(), req.GetPageIndex()),
Permission(object.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(&count).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
log.Errorf("MsgID[%s] Index error: %s", msgID, err)
app.Error(c, http.StatusInternalServerError, err, "查询失败")
return
}
app.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
c.Next()
}
}
+97
View File
@@ -0,0 +1,97 @@
package actions
import (
"errors"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"go-admin/common/log"
"go-admin/tools"
"go-admin/tools/app"
"go-admin/tools/config"
)
type DataPermission struct {
DataScope string
UserId int
DeptId int
RoleId int
}
func PermissionAction() gin.HandlerFunc {
return func(c *gin.Context) {
db, err := tools.GetOrm(c)
if err != nil {
log.Error(err)
return
}
msgID := tools.GenerateMsgIDFromContext(c)
var p = new(DataPermission)
if userId := tools.GetUserIdStr(c); userId != "" {
p, err = newDataPermission(db, userId)
if err != nil {
log.Errorf("MsgID[%s] PermissionAction error: %s", msgID, err)
app.Error(c, http.StatusInternalServerError, err, "权限范围鉴定错误")
c.Abort()
return
}
}
c.Set(PermissionKey, p)
c.Next()
}
}
func newDataPermission(tx *gorm.DB, userId interface{}) (*DataPermission, error) {
var err error
p := &DataPermission{}
err = tx.Table("sys_user").
Select("sys_user.user_id", "sys_role.role_id", "sys_user.dept_id", "sys_role.data_scope").
Joins("left join sys_role on sys_role.role_id = sys_user.role_id").
Where("sys_user.user_id = ?", userId).
Scan(p).Error
if err != nil {
err = errors.New("获取用户数据出错 msg:" + err.Error())
return nil, err
}
return p, nil
}
func Permission(tableName string, p *DataPermission) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
if !config.ApplicationConfig.EnableDP {
return db
}
switch p.DataScope {
case "2":
return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", p.RoleId)
case "3":
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", p.DeptId)
case "4":
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(p.DeptId)+"%")
case "5":
return db.Where(tableName+".create_by = ?", p.UserId)
default:
return db
}
}
}
func getPermissionFromContext(c *gin.Context) *DataPermission {
p := new(DataPermission)
if pm, ok := c.Get(PermissionKey); ok {
switch pm.(type) {
case *DataPermission:
p = pm.(*DataPermission)
}
}
return p
}
// PermissionForNoAction 提供非action写法数据范围约束
func GetPermissionFromContext(c *gin.Context) *DataPermission {
return getPermissionFromContext(c)
}

Some files were not shown because too many files have changed in this diff Show More