Compare commits

...

169 Commits

Author SHA1 Message Date
曾文豪
bb0e5098af publish 2.0.28
All checks were successful
/ local-deploy (push) Successful in 30s
2025-06-27 13:30:26 +08:00
曾文豪
6d91cc7c13 perf(http): 为 OkHttpClient 添加写超时设置 2025-06-27 13:29:56 +08:00
曾文豪
94f93f8a80 refactor(chart): 优化图表模板和记录功能 2025-06-03 09:28:46 +08:00
曾文豪
9363d08308 refactor(login): 移除登录签名验证相关代码 2025-05-27 16:34:06 +08:00
曾文豪
3797c0edd2 feat(TsTokenConfig): 开启登录签名验证 2025-05-27 11:59:45 +08:00
曾文豪
1cf97feabf refactor(chart): 优化图表模板接口返回数据 2025-05-22 16:52:13 +08:00
曾文豪
bce848af7e Merge remote-tracking branch 'origin/master' 2025-05-22 13:41:18 +08:00
曾文豪
a6b0062f8d feat(chart): 新增图表功能 2025-05-22 13:41:12 +08:00
885303e555 删除 springboot-ademo/.DS_Store 2025-05-16 00:00:54 +08:00
0cf30770f1 删除 springboot-util/.DS_Store 2025-05-15 23:59:58 +08:00
6a66f41925 删除 .DS_Store 2025-05-15 23:54:01 +08:00
曾文豪
2d8208e4dc publish 2.0.27
All checks were successful
/ local-deploy (push) Successful in 8m4s
2025-04-24 11:39:20 +08:00
曾文豪
c4ba637de7 build(springboot-util & springboot-web): 升级依赖版本 2025-04-24 11:38:56 +08:00
曾文豪
7b0b9e0925 feat(core-log): 添加操作日志时指定创建时间 2025-04-24 10:14:29 +08:00
曾文豪
463ddf1b1e publish 2.0.26
All checks were successful
/ local-deploy (push) Successful in 18s
2025-04-22 13:41:17 +08:00
曾文豪
6fdc69fc2d publish 2.0.25
All checks were successful
/ local-deploy (push) Successful in 19s
2025-04-22 13:33:29 +08:00
曾文豪
fde73e57b9 feat(cache): 添加重复操作检查功能 2025-04-22 13:32:58 +08:00
曾文豪
8a517b09fd fix(web): 修复 CoreConfigService 中的空值问题 2025-04-09 15:05:20 +08:00
曾文豪
217d044940 publish 2.0.24
All checks were successful
/ local-deploy (push) Successful in 19s
2025-04-07 15:45:21 +08:00
曾文豪
9ecf58d75e feat(role): 添加公开服务功能 2025-04-07 15:44:45 +08:00
曾文豪
5c0d47a011 publish 2.0.23
All checks were successful
/ local-deploy (push) Successful in 17s
2025-04-05 14:57:09 +08:00
曾文豪
08066f1367 Merge remote-tracking branch 'origin/master' 2025-04-05 14:55:06 +08:00
曾文豪
9e7ed69d37 feat(web): 修改配置备注为配置键 2025-04-05 14:55:00 +08:00
曾文豪
2793b2a634 publish 2.0.22
All checks were successful
/ local-deploy (push) Successful in 21s
2025-03-31 00:29:39 +08:00
曾文豪
9885e640e9 build: 更新代码仓库地址 2025-03-26 23:25:45 +08:00
曾文豪
9b285db5bd publish 2.0.21
All checks were successful
/ local-deploy (push) Successful in 18s
2025-03-24 17:10:33 +08:00
曾文豪
abbfac2f08 publish 2.0.20
All checks were successful
/ local-deploy (push) Successful in 17s
2025-03-21 17:53:13 +08:00
曾文豪
fba88da506 feat(login): 添加自定义 TokenBean 并更新相关逻辑 2025-03-21 17:51:40 +08:00
曾文豪
cb6e1c85b2 publish 2.0.19
All checks were successful
/ local-deploy (push) Successful in 18s
2025-03-20 16:20:40 +08:00
曾文豪
2649070850 build: 更新 ip2region 数据库链接 2025-03-20 16:19:51 +08:00
曾文豪
48a9d46d20 feat(login): 调整默认登录失败次数为0次,不进行校验 2025-03-07 14:16:19 +08:00
曾文豪
f8d7e49290 publish 2.0.18
All checks were successful
/ local-deploy (push) Successful in 19s
2024-12-13 20:20:29 +08:00
曾文豪
2cf88cefa7 publish 2.0.17
All checks were successful
/ local-deploy (push) Successful in 20s
2024-12-08 12:00:48 +08:00
曾文豪
9a56994342 publish 2.0.16
All checks were successful
/ local-deploy (push) Successful in 20s
2024-12-08 11:53:36 +08:00
曾文豪
a987689bd6 perf:优化登录次数校验 2024-12-08 11:53:11 +08:00
曾文豪
690dffa779 publish 2.0.15
All checks were successful
/ local-deploy (push) Successful in 18s
2024-12-08 10:23:38 +08:00
曾文豪
3ccbd6cd8e feat:configKey增加缓存 2024-12-08 10:22:44 +08:00
曾文豪
89e0c5d1d5 publish 2.0.14
All checks were successful
/ local-deploy (push) Successful in 21s
2024-11-21 15:22:36 +08:00
曾文豪
b15dbc6d4c perf:调整表结构 2024-11-21 15:21:58 +08:00
曾文豪
2f6b5b0b05 perf:更改一个方法的名称 2024-10-28 09:24:38 +08:00
曾文豪
832d615273 publish 2.0.13
All checks were successful
/ local-deploy (push) Successful in 19s
2024-10-10 16:20:35 +08:00
曾文豪
383a82e530 feat:增加useragent 2024-10-10 16:20:14 +08:00
曾文豪
6531709c69 feat:增加一个表单提交方法 2024-10-10 16:15:06 +08:00
曾文豪
6aaf91a755 publish 2.0.12
All checks were successful
/ local-deploy (push) Successful in 32s
2024-10-10 15:52:53 +08:00
曾文豪
f1ac7d6886 publish 2.0.12 2024-10-10 15:51:40 +08:00
曾文豪
2f07f9eb66 publish 2.0.11 2024-09-30 11:46:43 +08:00
曾文豪
919cd47623 publish 2.0.10 2024-09-23 15:50:36 +08:00
曾文豪
eb1c20b033 feat:授权增加一个备注字段 2024-09-19 14:13:13 +08:00
曾文豪
c1559e96be publish 2.0.9 2024-09-18 23:09:53 +08:00
曾文豪
9ef7d2d4a2 publish 2.0.8 2024-09-18 22:59:28 +08:00
曾文豪
b90e92f4cb perf: token兼容旧版本,旧版本使用的是10位数的秒作为数据 2024-09-18 22:59:10 +08:00
曾文豪
cb816d0ff0 publish 2.0.7 2024-09-18 17:27:45 +08:00
曾文豪
0470ca0b9a perf:空指针调整 2024-09-18 17:25:19 +08:00
曾文豪
d38077b0f8 perf:代码调整 2024-09-18 17:13:40 +08:00
曾文豪
2621c6dedc perf:可以不实现TsAuthorityHandler类 2024-09-18 16:47:29 +08:00
曾文豪
456a95778c publish 2.0.6 2024-09-18 16:30:49 +08:00
曾文豪
fd0976a30c Merge remote-tracking branch 'origin/master'
# Conflicts:
#	springboot-ademo/src/main/java/com/tiesheng/demo/controller/TestController.java
2024-09-18 14:53:10 +08:00
曾文豪
e519781207 fix:职位授权增加非空校验 2024-09-18 14:52:48 +08:00
曾文豪
e602f4c658 publish 2.0.5 2024-09-14 22:57:37 +08:00
曾文豪
a816acaddb fix:修复网络请求异常时,api日志记录不完整的bug 2024-09-14 22:57:03 +08:00
曾文豪
278429157a perf:钉钉单次同步调整为200 2024-09-14 22:38:07 +08:00
曾文豪
143b100819 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	springboot-platform/src/main/java/com/tiesheng/platform/config/ding/PlatformDingConfig.java
2024-09-14 22:36:38 +08:00
曾文豪
d0cd9aed0b perf:钉钉单次同步调整为200 2024-09-14 22:35:56 +08:00
曾文豪
3080d8a936 publish 2.0.4 2024-09-14 11:21:17 +08:00
曾文豪
3f951dfe47 fix:图像验证码的大小不能超过500x200 2024-09-12 14:20:17 +08:00
曾文豪
9c66dafe6b fix:权限组缺少deps属性 2024-09-12 14:17:18 +08:00
曾文豪
d6ed2b8037 publish 2.0.3 2024-09-10 11:08:06 +08:00
曾文豪
02c2ccc0ff perf:优化登录代码 2024-08-29 14:56:05 +08:00
曾文豪
f27d8d1658 publish 2.0.2 2024-08-28 20:40:43 +08:00
曾文豪
ba9d0da33f remove:移除了poi模块 2024-08-28 20:39:52 +08:00
曾文豪
4690fa9f88 perf:调整登录日志,同时限制登录失败次数(10分钟内最多5次) 2024-08-28 20:35:38 +08:00
曾文豪
a9f218de89 perf:移除encrypt模块,直接集成到web模块中 2024-08-28 19:41:45 +08:00
曾文豪
55324199cd feat:枚举表增加sort排序字段 2024-08-28 19:34:03 +08:00
曾文豪
0b32559630 feat:新增接口 /comm/role/group 获取角色、职位列表 2024-08-28 19:29:45 +08:00
曾文豪
01cc4f16ad perf:调用日志可以筛选 url 2024-08-28 19:22:26 +08:00
曾文豪
2b70c8121d publish 2.0.1 2024-08-27 13:41:58 +08:00
曾文豪
fd30c5cf36 perf:key不用实现TsAuthorityHandler类 2024-08-27 13:41:00 +08:00
曾文豪
0310bd4a15 perf:更新用户职位的时候,清除缓存 2024-08-27 13:38:57 +08:00
曾文豪
80ec6d2e3d perf:操作日志实时插入 2024-08-27 13:32:15 +08:00
曾文豪
d96f17b847 perf:调用日志只保存json,xml,text格式的返回值 2024-08-27 11:08:36 +08:00
曾文豪
7648eef981 perf:hutool.version放到parent中 2024-08-26 14:28:12 +08:00
曾文豪
79087f33e4 perf:过程日志改造 2024-08-26 13:47:31 +08:00
曾文豪
d0289d38b3 publish 2.0.0.rc46 2024-08-26 13:31:03 +08:00
曾文豪
90029faa53 publish 2.0.0.rc44 2024-08-26 13:23:51 +08:00
曾文豪
ecb5aa1b29 perf:过程日志改造 2024-08-26 13:20:45 +08:00
曾文豪
1db8ef9d85 publish 2.0.0.rc42 2024-08-23 15:04:40 +08:00
曾文豪
4bcae2f8d1 perf:移除hutool-json,直接使用fastjson 2024-08-23 15:04:20 +08:00
曾文豪
9bab4cdb25 feat:jwt中的hutool-json改为fastjson 2024-08-23 14:10:47 +08:00
曾文豪
856a9f01dd feat:把hutool的jwt直接放入util中 2024-08-23 11:38:29 +08:00
曾文豪
e57cd5e1c8 publish 2.0.0.rc40 2024-08-23 11:15:48 +08:00
曾文豪
542e23ac1b publish 2.0.0.rc38 2024-08-23 11:12:16 +08:00
曾文豪
6949f50c7c publish 2.0.0.rc37 2024-08-22 17:13:29 +08:00
曾文豪
7b43ae3ce1 publish 2.0.0.rc36 2024-08-22 17:09:14 +08:00
曾文豪
8ca283ca85 perf:登录的时候清除授权信息,相当于刷新一下权限 2024-08-22 09:46:04 +08:00
曾文豪
3728291e73 publish 2.0.0.rc35 2024-08-19 19:15:56 +08:00
曾文豪
6997dea968 publish 2.0.0.rc34 2024-08-16 11:50:48 +08:00
曾文豪
7f601c8e60 publish 2.0.0.rc33 2024-08-16 11:46:30 +08:00
曾文豪
7adc2a7c4b fix:修复无法删除权限的bug 2024-08-15 15:00:26 +08:00
曾文豪
f4f082cc86 publish 2.0.0.rc32 2024-08-13 16:52:08 +08:00
曾文豪
d21d84bc87 publish 2.0.0.rc30 2024-08-13 15:59:50 +08:00
曾文豪
60f996137f publish 2.0.0.rc28 2024-08-13 15:19:03 +08:00
曾文豪
11c8d234ff publish 2.0.0.rc26 2024-08-13 15:07:10 +08:00
曾文豪
125c681669 feat:新增deps和授权类型,用于解决依赖问题 2024-08-13 15:06:31 +08:00
曾文豪
b9347013f0 perf:权限增加一个source字段,用于标记权限来源 2024-08-13 14:49:22 +08:00
曾文豪
3415f0836f fix:修复platform获取方式异常的bug 2024-08-13 14:42:11 +08:00
曾文豪
22672c8a9e publish 2.0.0.rc25 2024-08-12 14:57:08 +08:00
曾文豪
a405aa7057 publish 2.0.0.rc24 2024-08-12 14:56:57 +08:00
曾文豪
e39dd646f5 publish 2.0.0.rc23 2024-08-12 14:38:13 +08:00
曾文豪
2ca224f7a5 fix:允许取消所有的授权 2024-08-11 20:19:57 +08:00
曾文豪
d4e97babf4 publish 2.0.0.rc22 2024-08-09 18:24:47 +08:00
曾文豪
a1c75d010b publish 2.0.0.rc21 2024-08-09 17:20:56 +08:00
曾文豪
9b6b3af33e publish 2.0.0.rc20 2024-08-08 16:20:34 +08:00
曾文豪
91833a44bb feat:增加RoleIgnore 2024-08-08 16:20:05 +08:00
曾文豪
8dc8709499 perf:代码结构调整 2024-08-08 16:16:21 +08:00
曾文豪
b34d9d6242 publish 2.0.0.rc19 2024-08-08 11:27:50 +08:00
曾文豪
2c9519a35e publish 2.0.0.rc18 2024-08-08 11:11:40 +08:00
曾文豪
f5dfce08ed publish 2.0.0.rc17 2024-08-08 09:24:00 +08:00
曾文豪
5d4e97b206 feat:增加权限校验 2024-08-08 09:23:30 +08:00
曾文豪
82d3f471f9 perf:TokenBean移除无用的属性 2024-08-07 23:43:57 +08:00
曾文豪
316909dd61 perf:调整授权缓存 2024-08-07 23:13:55 +08:00
曾文豪
5e308be3ba publish 2.0.0.rc16 2024-08-07 22:16:12 +08:00
曾文豪
ba80cebc45 feat:提交角色授权 2024-08-07 22:15:40 +08:00
曾文豪
0f5cdb49c0 feat:增加权限校验 2024-08-07 19:02:54 +08:00
曾文豪
1ee4b4af30 perf:请求时将通过getCurrentUserName()方法返回的对象检验用户是否非法 2024-08-07 14:09:28 +08:00
曾文豪
bb38428708 publish 2.0.0.rc15 2024-08-05 19:11:17 +08:00
曾文豪
a22467d4f1 publish 2.0.0.rc14 2024-08-05 14:59:55 +08:00
曾文豪
ad90c83cf7 perf:调整消息日志相关代码 2024-08-05 14:46:54 +08:00
曾文豪
cdae6a9868 publish 2.0.0.rc13 2024-08-05 14:19:06 +08:00
曾文豪
be08001f3f publish 2.0.0.rc13 2024-08-05 14:18:50 +08:00
曾文豪
333d283e24 perf:移除hutool的http模块,使用okhttp3 2024-07-30 13:39:45 +08:00
曾文豪
450d1fb869 publish 2.0.0.rc12 2024-07-29 14:28:21 +08:00
曾文豪
1412782327 publish 2.0.0.rc11 2024-07-29 10:31:03 +08:00
曾文豪
6127cd50a9 publish 2.0.0.rc10 2024-07-29 09:53:44 +08:00
曾文豪
19f4d0395e publish 2.0.0.rc9 2024-07-29 09:42:53 +08:00
曾文豪
d52edbb23c perf:钉钉对接调整 2024-07-26 16:12:29 +08:00
曾文豪
6c6d713c01 publish 2.0.0.rc8 2024-07-25 17:35:51 +08:00
曾文豪
8ea34c3ee0 perf:移除TimedCacheService、TimedCacheHelper,新增TsCacheService,同时实现了内存缓存、Redis缓存 2024-07-25 17:35:01 +08:00
曾文豪
d357fa7c85 publish 2.0.0.rc7 2024-07-12 11:17:04 +08:00
曾文豪
6332d1486b publish 2.0.0.rc6 2024-07-12 11:16:46 +08:00
曾文豪
e709050ba3 publish 2.0.0.rc6 2024-07-11 16:03:07 +08:00
曾文豪
59926aa2f4 publish 2.0.0.rc5 2024-07-11 15:37:03 +08:00
曾文豪
5da83bb477 publish 2.0.0.rc4 2024-07-11 15:21:59 +08:00
曾文豪
fb1f7c4e37 perf:移除matching-strategy属性 2024-07-04 16:22:46 +08:00
曾文豪
f831f4faf0 publish 2.0.0.rc3 2024-07-03 14:01:53 +08:00
曾文豪
d7016b418e perf:操作日志执行批量插入 2024-07-03 13:57:10 +08:00
曾文豪
fd92109e2e fix:角色列表和角色授权bug 2024-07-03 13:31:23 +08:00
曾文豪
c9679eeeac publish 2.0.0.rc2 2024-06-28 10:57:08 +08:00
曾文豪
08a3c52f34 publish 2.0.0.rc1 2024-06-26 10:22:33 +08:00
曾文豪
5a25006189 fix:修复授权过期的bug 2024-06-26 10:19:30 +08:00
曾文豪
093d39a108 feat:web模块包名调整 2024-06-26 10:13:42 +08:00
曾文豪
c0ded4356f feat:移除功能点 2024-06-26 10:11:19 +08:00
曾文豪
8f7d543c8b feat:移除job类的接口、方法 2024-06-26 10:08:29 +08:00
曾文豪
67bb6041c6 feat:sql导入 2024-06-26 10:00:47 +08:00
曾文豪
78cb8dafeb perf:调整获取自己的功能点 2024-06-26 09:03:36 +08:00
曾文豪
d77eb50a5b feat:提交角色授权 2024-06-25 23:23:50 +08:00
曾文豪
aee4fa86f6 feat;增加角色模块 2024-06-25 18:51:29 +08:00
曾文豪
a10b57f6fc feat;增加角色模块 2024-06-25 18:46:13 +08:00
曾文豪
d2229e0028 feat;增加角色模块 2024-06-25 18:32:08 +08:00
曾文豪
80cd48b97c feat;增加角色模块 2024-06-24 19:15:47 +08:00
曾文豪
0e6bee4714 publish 1.1.5 2024-06-19 13:54:11 +08:00
曾文豪
ae67cc53ec Merge branch 'new_characterUtils' into 'master'
优化移除特殊字符方法

See merge request tiesheng/tiesheng!5
2024-06-19 05:53:24 +00:00
‘毛文春’
419cb06ff6 feat:新增字符串处理工具类 2024-06-19 13:53:01 +08:00
曾文豪
384ac928e3 publish 1.1.4 2024-06-19 13:46:50 +08:00
曾文豪
130cd45de2 Merge branch 'new_CharacterUtil' into 'master'
新增字符串处理工具类

See merge request tiesheng/tiesheng!4
2024-06-19 05:45:11 +00:00
‘毛文春’
6840faa9d8 feat:新增字符串处理工具类 2024-06-19 13:44:53 +08:00
曾文豪
b6caecf140 publish 1.1.3 2024-06-11 16:11:14 +08:00
曾文豪
fdcb1614cc test:测试一下接口 2024-04-22 14:22:43 +08:00
曾文豪
88bc553213 publish 1.1.2 2024-04-17 13:56:38 +08:00
曾文豪
5942c4cea4 publish 1.1.1 2024-04-17 13:46:51 +08:00
310 changed files with 9929 additions and 3137 deletions

View File

@@ -0,0 +1,25 @@
## 工作流触发时机
on:
push:
tags:
- '*'
jobs:
## 任务名称
local-deploy:
## 任务执行的服务器
runs-on: tiesheng-local
## 任务步骤
steps:
## 检出代码(固定配置)
- name: Check out repository code
uses: https://git.tieshengkeji.com/actions/checkout@v4
## maven打包
- name: Maven deploy
run: |
mvn deploy

View File

@@ -1,94 +1,21 @@
## 1.1.0
## 2.0.12
- featglobalConfig增加ext属性。
- feat增加网络请求超时、重定向的配置。
- perf更新数据库对比插件。
- feat(web)增加DaoBase的常量。
- perf(web):操作日志优化。
- 调整OkHttp日志
## 1.0.12
## 2.0.0.rc46
- perf(encrypt):开启关闭加解密移动到**yaml**中配置,移除**EnableEncryptConfig**注解。
- feat(login):登录接口增加验签步骤,可通过**validLoginSign**属性开启或关闭(默认)。
- perf(login):可重写**onSignError**方法自定义验签错误的跳转。
- fix(login)修复微信、钉钉授权跳转地址错误的bug
现在导入导出都接入底层流程,无需新增接口,只需要实现接口即可。
## 1.0.7
- 过程日志不再和操作日志同时存在
- 过程日志新增params参数
- 通过实现*TsImportHandler*接口编写导入逻辑
- 通过实现*TsExportHandler*接口编写导出逻辑
- feat(web): 增加uploadFileCustomize方法允许自定义文件存放情况
- feat(database): 增加db/data目录存放初始化数据的sql
- perf(login): 增加默认值防止token解析异常
## 2.0.0.rc4
## 1.0.6
- perfTsTokenConfig不在提供静态方法
- perf移除TsTokenAspect由TokenWebMvcConfigurer替代并实现TokenBean参数注入
- feat(web):新增 **OperationIgnore** 注解,可以指定接口忽略操作日志的收集。
- feat(web)**OperationLog** 增加 desensitize 属性,用来脱敏指定的字段。
## 1.0.2
- feat(database):增加数据库定时备份;
- feat(database)增加过期备份的删除操作默认过期时间为7天
- perf(message):调整阿里云短信类,方便扩展其他方法。
- perf(message)消息发送接口该body类型为 **JSONObject**
- perf(message):调整消息发送接口和方法(不兼容旧版本)
## 1.0.1
- perf(web)fastjson增加配置 **DisableCircularReferenceDetect**,禁用相同的对象写成引用的形式。
## 1.0.0
- perfhutool依赖升级5.8.11 -> 5.8.16
- perffastjson依赖升级1.2.78 -> 1.2.83
- perfmybatis-plus依赖升级3.5.1 -> 3.5.3
- perf**TieshengWebConfigurer** 增加 **configSystemCheck** 方法,可根据情况校验系统配置参数。
从该版本开始,仓库地址改为:
``` pom
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
</repository>
</repositories>
```
## 0.9.3
> 1增加版本对比器防止某些情况下版本对比失效
>
## 0.8.3
### 调整
> 1优化返回数据加密
> 2上传文件接口调整统一为**application/json**格式;
## 0.8.0
### 调整
> 1移除**PasswordUtil**类,新增**EncryptConfig**配置;
> 2默认启用网络请求的加解密前端请配合接口使用。
## 0.7.4
### 新增
> 现在操作日志默认收集不包括GET请求使用方法名称和接口作为参数存储。如果存在OperationLog注解则使用注解的内容。
## 0.7.3
### 增加
> 1TsTokenConfig增加新的属性**ignorePaths**用于通过路径忽略token
> 2PasswordUtils增加密码复杂度校验方法
> 3PasswordUtils.verifyPassword增加登录次数限制10分钟内不能错误6次
>
### 调整
> 1TsTokenConfig中的**ignores**属性调整为**testMap**

94
CHANGELOG_V1.md Normal file
View File

@@ -0,0 +1,94 @@
## 1.1.0
- featglobalConfig增加ext属性。
- feat增加网络请求超时、重定向的配置。
- perf更新数据库对比插件。
- feat(web)增加DaoBase的常量。
- perf(web):操作日志优化。
## 1.0.12
- perf(encrypt):开启关闭加解密移动到**yaml**中配置,移除**EnableEncryptConfig**注解。
- feat(login):登录接口增加验签步骤,可通过**validLoginSign**属性开启或关闭(默认)。
- perf(login):可重写**onSignError**方法自定义验签错误的跳转。
- fix(login)修复微信、钉钉授权跳转地址错误的bug
## 1.0.7
- feat(web): 增加uploadFileCustomize方法允许自定义文件存放情况
- feat(database): 增加db/data目录存放初始化数据的sql
- perf(login): 增加默认值防止token解析异常
## 1.0.6
- feat(web):新增 **OperationIgnore** 注解,可以指定接口忽略操作日志的收集。
- feat(web)**OperationLog** 增加 desensitize 属性,用来脱敏指定的字段。
## 1.0.2
- feat(database):增加数据库定时备份;
- feat(database)增加过期备份的删除操作默认过期时间为7天
- perf(message):调整阿里云短信类,方便扩展其他方法。
- perf(message)消息发送接口该body类型为 **JSONObject**
- perf(message):调整消息发送接口和方法(不兼容旧版本)
## 1.0.1
- perf(web)fastjson增加配置 **DisableCircularReferenceDetect**,禁用相同的对象写成引用的形式。
## 1.0.0
- perfhutool依赖升级5.8.11 -> 5.8.16
- perffastjson依赖升级1.2.78 -> 1.2.83
- perfmybatis-plus依赖升级3.5.1 -> 3.5.3
- perf**TieshengWebConfigurer** 增加 **configSystemCheck** 方法,可根据情况校验系统配置参数。
从该版本开始,仓库地址改为:
``` pom
<repositories>
<repository>
<id>kepai-repo</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</repositories>
```
## 0.9.3
> 1增加版本对比器防止某些情况下版本对比失效
>
## 0.8.3
### 调整
> 1优化返回数据加密
> 2上传文件接口调整统一为**application/json**格式;
## 0.8.0
### 调整
> 1移除**PasswordUtil**类,新增**EncryptConfig**配置;
> 2默认启用网络请求的加解密前端请配合接口使用。
## 0.7.4
### 新增
> 现在操作日志默认收集不包括GET请求使用方法名称和接口作为参数存储。如果存在OperationLog注解则使用注解的内容。
## 0.7.3
### 增加
> 1TsTokenConfig增加新的属性**ignorePaths**用于通过路径忽略token
> 2PasswordUtils增加密码复杂度校验方法
> 3PasswordUtils.verifyPassword增加登录次数限制10分钟内不能错误6次
>
### 调整
> 1TsTokenConfig中的**ignores**属性调整为**testMap**

43
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
<packaging>pom</packaging>
<name>springboot-parent</name>
<description>杭州铁晟科技有限公司基础依赖</description>
@@ -23,17 +23,19 @@
<module>springboot-login</module>
<module>springboot-web</module>
<module>springboot-util</module>
<module>springboot-poi</module>
<module>springboot-platform</module>
<module>springboot-message</module>
<module>springboot-encrypt</module>
<module>springboot-annotation</module>
<module>springboot-role</module>
<module>springboot-chart</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hutool.version>5.8.31</hutool.version>
</properties>
<developers>
@@ -57,55 +59,49 @@
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-database</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-login</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-web</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-platform</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-message</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-encrypt</artifactId>
<version>1.1.0</version>
<artifactId>springboot-role</artifactId>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-annotation</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-poi</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</dependency>
<dependency>
@@ -125,11 +121,18 @@
<pluginRepositories>
<pluginRepository>
<id>kepai-repo-plugin</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
<id>tiesheng-repo-plugin</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</pluginRepository>
</pluginRepositories>
<distributionManagement>
<repository>
<id>gitea</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</distributionManagement>
<build>
<pluginManagement>
<plugins>

31
qodana.yaml Normal file
View File

@@ -0,0 +1,31 @@
#-------------------------------------------------------------------------------#
# Qodana analysis is configured by qodana.yaml file #
# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
#-------------------------------------------------------------------------------#
version: "1.0"
#Specify inspection profile for code analysis
profile:
name: qodana.starter
#Enable inspections
#include:
# - name: <SomeEnabledInspectionId>
#Disable inspections
#exclude:
# - name: <SomeDisabledInspectionId>
# paths:
# - <path/where/not/run/inspection>
projectJDK: 17 #(Applied in CI/CD pipeline)
#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
#bootstrap: sh ./prepare-qodana.sh
#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
#plugins:
# - id: <plugin.id> #(plugin id can be found at https://plugins.jetbrains.com)
#Specify Qodana linter for analysis (Applied in CI/CD pipeline)
linter: jetbrains/qodana-jvm:latest

View File

@@ -6,11 +6,11 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</parent>
<artifactId>springboot-ademo</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -26,17 +26,28 @@
<artifactId>springboot-web</artifactId>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-role</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
<id>tiesheng-repo</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</repositories>

View File

@@ -1,7 +1,7 @@
package com.tiesheng.demo;
import com.tiesheng.core.EnableTieshengWeb;
import com.tiesheng.web.EnableTieshengWeb;
import com.tiesheng.demo.config.DemoWebConfigurer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -13,7 +13,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@SpringBootApplication
@EnableTieshengWeb(webConfigurer = DemoWebConfigurer.class)
//@EnableEncryptConfig
public class DemoApplication {
public static void main(String[] args) {

View File

@@ -1,11 +1,12 @@
package com.tiesheng.demo.config;
import cn.hutool.core.util.StrUtil;
import com.tiesheng.core.pojos.RequestUserInfo;
import com.tiesheng.core.pojos.dao.CorePlatformUnique;
import com.tiesheng.core.service.TieshengWebConfigurer;
import com.tiesheng.login.config.token.bean.TokenBean;
import com.tiesheng.login.pojos.RequestUserInfo;
import com.tiesheng.login.pojos.dao.CorePlatformUnique;
import com.tiesheng.login.service.TsLoginConfigurer;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.pojos.TokenBean;
import com.tiesheng.web.service.TieshengWebConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -13,24 +14,26 @@ import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
@Component
public class DemoWebConfigurer implements TieshengWebConfigurer {
@Autowired
GlobalConfig globalConfig;
public class DemoWebConfigurer implements TieshengWebConfigurer, TsLoginConfigurer {
@Override
public RequestUserInfo getCurrentUserName(TokenBean tokenBean) {
RequestUserInfo info = new RequestUserInfo();
info.setId("1");
info.setName("test");
info.setId(tokenBean.getId());
info.setName(tokenBean.getExtra());
return info;
}
@Override
public TokenBean login(CorePlatformUnique platformUnique) {
TokenBean tokenBean = null;
if (!StrUtil.isEmpty(platformUnique.getUserId())) {
tokenBean = new TokenBean(platformUnique.getUserId(), "", globalConfig.getService());
tokenBean = new TokenBean(platformUnique.getUserId(), "super");
} else if (Objects.equals(platformUnique.getUniqueId(), "1110290049")) {
tokenBean = new TokenBean("1", "super");
}
if (tokenBean != null) {
tokenBean.setExtra("1110290049");
}
return tokenBean;
@@ -39,13 +42,11 @@ public class DemoWebConfigurer implements TieshengWebConfigurer {
@Override
public void redirect(TokenBean bean, String to, String extra, HttpServletResponse response) {
// 默认跳转到mobile
to = StrUtil.emptyToDefault(to, "mobile");
bean.setEnvironmentType(to);
if (Objects.equals(bean.getEnvironmentType(), "mobile")) {
globalConfig.redirect("mobile", "/?token=" + bean.toToken(), response);
}
}
@Override
public TsLoginConfigurer configureLogin() {
return this;
}
}

View File

@@ -1,15 +0,0 @@
package com.tiesheng.demo.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class DemoWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mobile/**").addResourceLocations("classpath:/mobile/0.0.13/");
}
}

View File

@@ -1,9 +1,6 @@
package com.tiesheng.demo.config;
import com.tiesheng.core.service.CoreConfigService;
import com.tiesheng.core.service.CoreJobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@@ -14,19 +11,8 @@ import javax.annotation.PostConstruct;
@Component
public class TestJobConfig {
@Autowired
CoreJobService coreJobService;
@Autowired
CoreConfigService coreConfigService;
@PostConstruct
public void init() {
coreConfigService.refreshFunc("230328001", "demo", "辅导员统计", "辅导员责任班级,学生展示");
// 辅导员职位
coreJobService.refresh("class_fdy", "辅导员", "辅导员", 1);
}
}

View File

@@ -1,37 +1,43 @@
package com.tiesheng.demo.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.log.LogFactory;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.tiesheng.annotation.operation.OperationLog;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.core.service.CoreLogService;
import com.tiesheng.core.service.CoreMessageService;
import com.tiesheng.core.util.ProcessImportConsumer;
import com.tiesheng.database.config.DbBackupConfig;
import com.tiesheng.demo.pojos.CustTokenBean;
import com.tiesheng.demo.pojos.JsonTest;
import com.tiesheng.demo.pojos.PoiBean;
import com.tiesheng.demo.pojos.TestFile;
import com.tiesheng.login.config.token.TsTokenConfig;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.message.pojos.UserChannel;
import com.tiesheng.platform.config.ding.PlatformDingConfig;
import com.tiesheng.platform.config.ding.bean.DingUserInfo;
import com.tiesheng.util.config.EncryptConfig;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.config.Ip2regionConfig;
import com.tiesheng.util.config.TsTokenConfig;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.FileUploadPath;
import com.tiesheng.util.service.TsCacheService;
import com.tiesheng.util.service.http.OkHttpUtil;
import com.tiesheng.web.service.CoreLogService;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* @author hao
@@ -49,60 +55,88 @@ public class TestController {
@Autowired
EncryptConfig encryptConfig;
@Autowired
CoreMessageService coreMessageService;
@Autowired
CoreLogService coreLogService;
@Autowired
DbBackupConfig dbBackupConfig;
@Autowired
TsCacheService tsCacheService;
@Autowired
PlatformDingConfig platformDingConfig;
@RequestMapping("/index")
public ApiResp<String> index() {
dbBackupConfig.dbBackup();
return ApiResp.respOK("hello world");
public void index(HttpServletResponse response) {
globalConfig.redirectWithVer("mobile", "/test", response);
}
@RequestMapping("/redirect")
@TokenIgnore
public void redirect(HttpServletResponse response) {
@RoleAuthority("redirect")
public ApiResp<JsonTest> redirect(HttpServletResponse response) {
ArrayList<String> strings = CollUtil.newArrayList("11111", "22222");
coreLogService.addProcess("fdfd", strings, new ProcessImportConsumer<String>() {
@Override
public int accept(List<String> list) {
LogFactory.get().info("list: " + list.size());
return 0;
}
String s1 = encryptConfig.passwdCreate("qU3?wE3{bX", "");
LogFactory.get().info(s1);
@Override
public String getFailFile() {
LogFactory.get().info("getFailFile: " + strings.size());
return null;
}
});
JsonTest jsonTest = new JsonTest();
jsonTest.setNow(DateUtil.date());
jsonTest.setNow1(DateUtil.date());
LogFactory.get().info("strings: " + strings.size());
String jsonString = JSON.toJSONString(jsonTest);
LogFactory.get().info(jsonString);
String s = OkHttpUtil.get("http://toolbox.tieshengkeji.com/test/login/23232/3232");
LogFactory.get().info(s);
// ArrayList<String> strings = CollUtil.newArrayList("11111", "22222");
// coreLogService.addProcess("fdfd", strings, new ProcessImportConsumer<String>() {
// @Override
// public int accept(List<String> list) {
// LogFactory.get().info("list: " + list.size());
// return 0;
// }
//
// @Override
// public String getFailFile() {
// LogFactory.get().info("getFailFile: " + strings.size());
// return null;
// }
// });
//
// LogFactory.get().info("strings: " + strings.size());
// tsTokenConfig.validToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzYwMDY4NzUsImlkIjoiMSIsImVudmlyb25tZW50VHlwZSI6Im1vYmlsZSIsInNlcnZpY2UiOiJjb250ZXN0LXJlc2VydmUiLCJleHRyYSI6IiJ9.nsfxEFpCNHC7eNCS5DJXdu1VDdnHrTjSfgrozND70Lc", true);
globalConfig.redirect("mobile", "/test", response);
// globalConfig.redirect("mobile", "/test", response);
return ApiResp.respOK(jsonTest);
}
@GetMapping("/send")
@TokenIgnore
public ApiResp<MessageReqResp> sendMessage() {
public ApiResp<String> sendMessage(CustTokenBean tokenBean) {
MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"),
JSONUtil.createObj().putOpt("code", "123456").putOpt("template_code", "SMS_154950909"));
tokenBean.test();
return ApiResp.respOK(reqResp);
// MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"),
// JSONUtil.createObj().putOpt("action", "sms-visitor-invite"));
return ApiResp.respOK(null);
}
@RequestMapping("/export")
@TokenIgnore
public ApiResp<String> export() {
// tsCacheService.put("fdfhdfd", "fdfdfdfd");
// String s = tsCacheService.get("fdfhdfd");
// LogFactory.get().info("export: " + s);
platformDingConfig.syncDeptUser("", null, new Consumer<DingUserInfo>() {
@Override
public void accept(DingUserInfo dingUserInfo) {
}
});
// List<TestFile> list = new ArrayList<>();
// list.add(new TestFile("11111"));
// list.add(new TestFile("22222"));
@@ -123,7 +157,7 @@ public class TestController {
}
@RequestMapping("searchIP")
@PostMapping("searchIP")
@TokenIgnore
public ApiResp<String> searchIp() {
String search = ip2regionConfig.search("127.0.0.1");
@@ -131,17 +165,6 @@ public class TestController {
}
@RequestMapping("desensitize")
@TokenIgnore
public ApiResp<List<TestFile>> desensitize() {
TestFile file = new TestFile("11111");
file.setTest("111111");
TestFile file1 = new TestFile("22222");
file1.setTest("22222");
return ApiResp.respOK(CollUtil.newArrayList(file, file1));
}
@RequestMapping("passwd")
@TokenIgnore
public ApiResp<String> passwd() {
@@ -178,18 +201,33 @@ public class TestController {
return ApiResp.respOK("");
}
@RequestMapping("poiTool")
@GetMapping("getwxacode")
@TokenIgnore
public ApiResp<String> poiTool() {
TimeInterval timeInterval = new TimeInterval();
FileUploadPath file = FileUploadPath.file("/upload/test.xlsx");
ExcelUtil.getReader(new File(file.getAbsolutePath())).read();
System.out.println("timeInterval: " + timeInterval.interval());
return ApiResp.respOK("");
public ApiResp<String> getwxacode() {
String id = "test_1111111";
FileUploadPath path = FileUploadPath.random("png");
JSONObject paramJson = new JSONObject();
paramJson.put("page", "pages/login/index");
paramJson.put("scene", "no=" + id);
paramJson.put("env_version", "develop");
paramJson.put("width", 430);
paramJson.put("is_hyaline", false);
paramJson.put("auto_color", false);
FileUploadPath file = FileUploadPath.file(id + ".png");
try {
Request request = OkHttpUtil.ofPost("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" +
"83_7xqG36kdgwuf8zzWLY3jtz7bg4ucziN-0oxbE0X9zBzwbjZ4S4Ss2RM9uHeSIcRp2K-wEp6MLzWhqo2AXj0Jpzd6IiJdUsRxqdHPvEWqAdOgt83vzZwdDf7tZBkGNGeAFASZS",
paramJson);
Response execute1 = OkHttpUtil.ofHttpClient().build().newCall(request).execute();
if (execute1.body() != null) {
FileUtil.writeFromStream(execute1.body().byteStream(), file.getAbsolutePath());
execute1.close();
}
} catch (Exception e) {
throw new ApiException("每分钟最多生成5000个二维码请稍后再试");
}
return ApiResp.respOK(path.getHttpPath());
}
}

View File

@@ -0,0 +1,12 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.util.pojos.TokenBean;
public class CustTokenBean extends TokenBean {
public void test() {
System.out.println("test: " + getId());
}
}

View File

@@ -0,0 +1,60 @@
package com.tiesheng.demo.pojos;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;
public class JsonTest {
private Date now;
@JSONField(format = "yyyy-MM-dd")
private Date now1;
private String no;
private String name;
private JsonTest child;
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
public Date getNow() {
return now;
}
public void setNow(Date now) {
this.now = now;
}
public Date getNow1() {
return now1;
}
public void setNow1(Date now1) {
this.now1 = now1;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JsonTest getChild() {
return child;
}
public void setChild(JsonTest child) {
this.child = child;
}
}

View File

@@ -1,21 +0,0 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.poi.pojos.PoiWriteBase;
public class TestFile extends TestParent implements PoiWriteBase {
private String name;
public TestFile(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@@ -1,33 +0,0 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.annotation.desensitize.Desensitize;
import com.tiesheng.poi.pojos.PoiWriteBase;
public class TestParent implements PoiWriteBase {
private String id;
@Desensitize()
private String test;
///////////////////////////////////////////////////////////////////////////
// setter、getter
///////////////////////////////////////////////////////////////////////////
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}

View File

@@ -0,0 +1,32 @@
package com.tiesheng.demo.service;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.message.config.aliyun.AliyunSmsHandler;
import com.tiesheng.message.config.aliyun.AliyunTempParam;
import org.springframework.stereotype.Service;
import java.util.Objects;
@Service
public class DemoSmsHandler implements AliyunSmsHandler {
@Override
public AliyunTempParam handler(JSONObject obj) {
String action = obj.getString("action");
AliyunTempParam param = new AliyunTempParam();
param.setSignName("智慧校园");
if (Objects.equals(action, "sms-visitor-invite")) {
param.setTemplateCode("SMS_276125463");
JSONObject object = new JSONObject();
object.put("date", DateUtil.today());
param.setTemplateParam(object);
}
return param;
}
}

View File

@@ -0,0 +1,39 @@
package com.tiesheng.demo.service;
import cn.hutool.core.collection.CollUtil;
import com.tiesheng.util.pojos.TokenBean;
import com.tiesheng.web.pojos.imex.ImportDealDTO;
import com.tiesheng.web.service.imex.TsImportHandler;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserImportHandler implements TsImportHandler<String> {
@Override
public List<String> ready(ImportDealDTO dto, TokenBean token) {
return CollUtil.newArrayList("11111");
}
@Override
public String getTemplateUrl() {
return "/template/xsxxzx_teacher_leader.xlsx";
}
@Override
public String getAction() {
return "user_import";
}
@Override
public int batchHandler(List<String> list) {
return 0;
}
@Override
public String getResultFile() {
return "";
}
}

View File

@@ -7,8 +7,17 @@ spring:
url: jdbc:mysql://47.96.30.85:3306/com_tiesheng_web?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&queryTimeout=5400&allowMultiQueries=true&serverTimezone=GMT%2B8
username: com_tiesheng_web
password: 4Xo$XheGFc
redis:
url: redis://kyF0zUL3011111@47.96.30.85:6234
database: 1
platform:
ding:
global:
corpId: dingebe664cb3baf3a52a39a90f97fcb1e09
agentId: 2474444028
appKey: dingyvf1niiajfaajyo5
appSecret: y6SGZ4fvPbdbj4RVbDWLeMBkGgplaOdnTA_9wN5TDdOV_Y47alYc1LDlIHjsBJE1
wxmp:
global:
app-id: wxa0343fe519824651
@@ -18,11 +27,14 @@ tiesheng:
token:
test-map:
"1111":
id: "1111"
id: "1"
role-id: "1822829641023524865"
global:
version: 2
host: http://localhost:8100
service: yrx
aliyun:
access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf
access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG
sign-name: 阿里云短信测试
encrypt:
body: false

View File

@@ -9,18 +9,13 @@ spring:
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
web:
resources:
static-locations: classpath:/static/,file:static/
mvc:
pathmatch:
matching-strategy: ant_path_matcher
## 日志
logging:
file:
name: runtime/logs/tiesheng.log
tiesheng:
token:
ignore-paths:
- /test/index

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,42 @@
package com.tiesheng.demo;
import cn.hutool.core.date.DateUtil;
import cn.hutool.log.LogFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;
import com.tiesheng.demo.pojos.JsonTest;
import com.tiesheng.login.pojos.RequestUserInfo;
public class MainTest {
public static void main(String[] args) {
MainTest test = new MainTest();
test.testJsonSelf();
}
private void testJsonSelf() {
RequestUserInfo info = new RequestUserInfo();
info.setId("1");
info.setName("name");
info.setData(info);
String jsonStr = JSON.toJSONString(info);
LogFactory.get().info(jsonStr);
}
private void testJsonPath() {
JsonTest jsonTest = new JsonTest();
jsonTest.setNo("1111");
jsonTest.setName("1111");
jsonTest.setNow(DateUtil.date());
jsonTest.setChild(jsonTest);
JSONPath jsonPath = JSONPath.compile("child.no");
String eval = jsonPath.eval(jsonTest, String.class);
LogFactory.get().info(eval);
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</parent>
<artifactId>springboot-annotation</artifactId>

View File

@@ -1,16 +0,0 @@
package com.tiesheng.annotation.desensitize;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author hao
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitize {
int prefix() default 1;
int suffix() default 1;
}

View File

@@ -0,0 +1,41 @@
package com.tiesheng.annotation.role;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleAuthority {
/**
* 编号
*
* @return
*/
String value();
/**
* 平台类型
*
* @return
*/
String platform() default "";
/**
* 分组
*
* @return
*/
String[] group() default {};
/**
* 依赖其他权限
*
* @return
*/
String[] deps() default {};
}

View File

@@ -0,0 +1,9 @@
package com.tiesheng.annotation.role;
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleIgnore {
}

View File

@@ -6,10 +6,10 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.1.0</version>
<version>2.0.28</version>
</parent>
<artifactId>springboot-poi</artifactId>
<artifactId>springboot-chart</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -18,17 +18,21 @@
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,111 @@
package com.tiesheng.role.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.annotation.operation.OperationIgnore;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.role.pojos.dto.ChartTemplateCheck;
import com.tiesheng.role.pojos.vo.TsTableVO;
import com.tiesheng.role.service.ChartService;
import com.tiesheng.role.util.AliExcelUtil;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.FileUploadPath;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/chart/record")
@RoleAuthority(value = "template", group = "chart")
public class ChartRecordController {
@Resource
ChartService chartService;
@Resource
GlobalConfig globalConfig;
/**
* 获取列表
*
* @return
*/
@PostMapping("/check")
@OperationIgnore
public ApiResp<TsTableVO> check(@RequestBody @Valid ChartTemplateCheck dto) {
if (dto.getTemplate() == null) {
dto.setTemplate(chartService.getById(dto.getTemplateId()));
}
if (dto.getTemplate() == null) {
throw new ApiException("请选择或创建一个模版");
}
try {
List<JSONObject> chartRecordVOS = chartService.getBaseMapper()
.recordCheck(dto.getTemplate().getTableName(), dto.getCountType(),
dto.getTableXField(), dto.getWhere(),
dto.getTemplate().getSField(),
dto.getTableGroupBy());
chartRecordVOS.forEach(it -> {
it.put("xField", StrUtil.emptyToDefault(it.getString("xField"), "未分类"));
});
return ApiResp.respOK(TsTableVO.of(dto.getTemplate(), chartRecordVOS));
} catch (Exception e) {
throw new ApiException("表或字段配置有误,请检查");
}
}
/**
* 导出数据
*
* @return
*/
@PostMapping("/export")
@OperationIgnore
public ApiResp<String> export(@RequestBody @Valid ChartTemplateCheck dto) {
TsTableVO tsTableVO = check(dto).getData();
if (tsTableVO.getDataSource().isEmpty()) {
return ApiResp.respOK("");
}
List<List<String>> headers = new ArrayList<>();
for (TsTableVO.TableColumn column : tsTableVO.getColumns()) {
headers.add(CollUtil.newArrayList(column.getTitle()));
}
List<List<String>> contents = new ArrayList<>();
for (JSONObject obj : tsTableVO.getDataSource()) {
List<String> data = new ArrayList<>();
for (TsTableVO.TableColumn column : tsTableVO.getColumns()) {
data.add(obj.getString(column.getDataIndex()));
}
contents.add(data);
}
FileUploadPath xls = FileUploadPath.random("xls");
EasyExcel.write(xls.getAbsolutePath())
.sheet("数据统计")
.registerWriteHandler(new AliExcelUtil.ChatColumnWidthStyleStrategy())
.registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 24, null))
.registerWriteHandler(AliExcelUtil.getCustomStyle())
.head(headers)
.doWrite(contents);
return ApiResp.respOK(globalConfig.buildPath(xls.getHttpPath()));
}
}

View File

@@ -0,0 +1,162 @@
package com.tiesheng.role.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.role.pojos.dao.CoreChartTable;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import com.tiesheng.role.pojos.dto.ChartTableEditDTO;
import com.tiesheng.role.pojos.dto.ChartTemplateEditDTO;
import com.tiesheng.role.service.ChartService;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.IdDTO;
import com.tiesheng.util.pojos.PageDTO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/chart/template")
@RoleAuthority(value = "template", group = "chart")
public class ChartTemplateController {
@Resource
ChartService chartService;
/**
* 获取模版列表
*
* @return
*/
@GetMapping("/page")
public ApiResp<List<CoreChartTemplate>> page(PageDTO dto) {
QueryWrapper<CoreChartTemplate> queryWrapper = new QueryWrapper<CoreChartTemplate>()
.eq("is_deleted", 0)
.like(StrUtil.isNotEmpty(dto.getKeyword()), "table_name", dto.getKeyword())
.orderByAsc("sort");
dto.likeColumns(queryWrapper, "name", "table_name", "table_title");
Page<CoreChartTemplate> page = dto.pageObj();
chartService.page(page, queryWrapper);
return ApiResp.respOK(page.getRecords(), page.getTotal());
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/edit")
public ApiResp<String> edit(@RequestBody @Valid ChartTemplateEditDTO dto) {
dto.setSField(StrUtil.emptyToDefault(dto.getSField(), ""));
CoreChartTemplate template = BeanUtil.copyProperties(dto, CoreChartTemplate.class);
template.setExts(JSON.toJSONString(dto.getExts()));
chartService.saveOrUpdate(template);
return ApiResp.respOK("");
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/del")
public ApiResp<String> del(@RequestBody @Valid IdDTO dto) {
chartService.update(null, new UpdateWrapper<CoreChartTemplate>()
.set("is_deleted", 1)
.eq("id", dto.getId())
.eq("is_deleted", 0)
);
return ApiResp.respOK("");
}
///////////////////////////// 表信息
/**
* 获取模版列表
*
* @return
*/
@GetMapping("/table/list")
public ApiResp<List<CoreChartTable>> tableList(PageDTO dto) {
List<CoreChartTable> list = chartService.getCoreChartTableMapper()
.selectList(new QueryWrapper<CoreChartTable>()
.eq("is_deleted", 0)
.like(StrUtil.isNotEmpty(dto.getKeyword()), "table_name", dto.getKeyword())
);
return ApiResp.respOK(list, list.size());
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/table/edit")
public ApiResp<String> tableEdit(@RequestBody @Valid ChartTableEditDTO dto) {
CoreChartTable exist = chartService.getCoreChartTableMapper().selectOne(
new QueryWrapper<CoreChartTable>()
.eq("table_name", dto.getTableName())
.ne(StrUtil.isNotEmpty(dto.getId()), "id", dto.getId())
.last("limit 1")
);
if (exist != null) {
throw new ApiException("不可添加重复的表名");
}
CoreChartTable template = BeanUtil.copyProperties(dto, CoreChartTable.class);
template.setIsDeleted(0);
template.setColumns(JSON.toJSONString(dto.getColumns()));
if (StrUtil.isNotEmpty(dto.getId())) {
chartService.getCoreChartTableMapper().updateById(template);
} else {
chartService.getCoreChartTableMapper().insert(template);
}
return ApiResp.respOK("");
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/table/del")
public ApiResp<String> tableDel(@RequestBody @Valid IdDTO dto) {
chartService.getCoreChartTableMapper().update(null, new UpdateWrapper<CoreChartTable>()
.set("is_deleted", 1)
.eq("id", dto.getId())
.eq("is_deleted", 0)
);
return ApiResp.respOK("");
}
/**
* 获取table详情
*
* @return
*/
@GetMapping("/table/info")
@TokenIgnore
public ApiResp<CoreChartTable> getTableInfo(String tableName) {
return ApiResp.respOK(chartService.getCoreChartTableMapper().selectOne(new QueryWrapper<CoreChartTable>()
.eq("is_deleted", 0)
.eq("table_name", tableName)
.last("limit 1")
));
}
}

View File

@@ -0,0 +1,7 @@
package com.tiesheng.role.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tiesheng.role.pojos.dao.CoreChartTable;
public interface CoreChartTableMapper extends BaseMapper<CoreChartTable> {
}

View File

@@ -0,0 +1,27 @@
package com.tiesheng.role.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CoreChartTemplateMapper extends BaseMapper<CoreChartTemplate> {
/**
* 根据字段查询数据
*
* @param table
* @param xField
* @param where
* @param sField
* @return
*/
List<JSONObject> recordCheck(@Param("table") String table,
@Param("type") String type,
@Param("xField") String xField,
@Param("where") String where,
@Param("sField") String sField,
@Param("groupBy") String groupBy
);
}

View File

@@ -0,0 +1,39 @@
package com.tiesheng.role.pojos.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tiesheng.util.pojos.DaoBase;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 图表-表信息
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "core_chart_table")
public class CoreChartTable extends DaoBase {
/**
* 表名
*/
@TableField(value = "`table_name`")
private String tableName;
/**
* 名称
*/
@TableField(value = "table_title")
private String tableTitle;
/**
* 所有字段
*/
@TableField(value = "`columns`")
private String columns;
/**
* 其他说明
*/
@TableField(value = "remark")
private String remark;
}

View File

@@ -0,0 +1,81 @@
package com.tiesheng.role.pojos.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tiesheng.util.pojos.DaoBase;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 图表-表信息
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "core_chart_template")
public class CoreChartTemplate extends DaoBase {
/**
* 模版名称
*/
@TableField(value = "`name`")
private String name;
/**
* 表名
*/
@TableField(value = "`table_name`")
private String tableName;
/**
* 名称
*/
@TableField(value = "table_title")
private String tableTitle;
/**
* 统计方式
*/
@TableField(value = "`type`")
private String type;
/**
* X轴字段
*/
@TableField(value = "x_field")
private String xField;
@TableField(value = "x_field_name")
private String xFieldName;
/**
* X轴格式化只有X轴字段为date时有效
*/
@TableField(value = "x_format")
private String xFormat;
/**
* S轴字段
*/
@TableField(value = "s_field")
private String sField;
@TableField(value = "s_field_name")
private String sFieldName;
/**
* 附件条件
*/
@TableField(value = "exts")
private String exts;
/**
* 其他说明
*/
@TableField(value = "remark")
private String remark;
/**
* 排序
*/
@TableField(value = "sort")
private Integer sort;
}

View File

@@ -0,0 +1,33 @@
package com.tiesheng.role.pojos.dto;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.util.List;
@Data
public class ChartTableEditDTO {
private String id;
@NotEmpty(message = "请输入【表名】")
private String tableName;
@NotEmpty(message = "请输入【名称】")
private String tableTitle;
@Size(min = 1, message = "请配置【表字段】")
private List<TableColumn> columns;
private String remark;
@Data
public static class TableColumn {
private String key;
private String type;
private String remark;
private String enums;
}
}

View File

@@ -0,0 +1,108 @@
package com.tiesheng.role.pojos.dto;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Data
public class ChartTemplateCheck {
private String templateId;
private CoreChartTemplate template;
private String xFormat;
private List<ChartTemplateEditDTO.TemplateExt> exts;
@JSONField(serialize = false)
public String getTableXField() {
String tmpXFormat = StrUtil.emptyToDefault(getXFormat(), getTemplate().getXFormat());
if (StrUtil.isNotEmpty(tmpXFormat)) {
return StrUtil.format("DATE_FORMAT({},'{}')", getTemplate().getXField(), tmpXFormat);
}
return getTemplate().getXField();
}
@JSONField(serialize = false)
public String getTableGroupBy() {
if (StrUtil.isNotEmpty(getTemplate().getSField())) {
return StrUtil.format("{},{}", getTableXField(), getTemplate().getSField());
}
return getTableXField();
}
public String getCountType() {
if (Objects.equals(getTemplate().getType(), "count_1")) {
return "count(1)";
}
return "sum(" + getTemplate().getType() + ")";
}
@JSONField(serialize = false)
public String getWhere() {
if (CollUtil.isEmpty(getExts())) {
setExts(JSON.parseArray(getTemplate().getExts(), ChartTemplateEditDTO.TemplateExt.class));
}
if (CollUtil.isEmpty(getExts())) {
return "";
}
List<String> list = new ArrayList<>();
for (ChartTemplateEditDTO.TemplateExt templateExt : getExts()) {
if (templateExt.isErrorExt()) {
continue;
}
if (Objects.equals(templateExt.getAction(), "eq")) {
list.add(StrUtil.format("{} = '{}'", templateExt.getKey(), templateExt.getValue()));
} else if (Objects.equals(templateExt.getAction(), "ne")) {
list.add(StrUtil.format("{} != '{}'", templateExt.getKey(), templateExt.getValue()));
} else if (Objects.equals(templateExt.getAction(), "btw")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
if (split.size() == 1) {
list.add(StrUtil.format("{} > '{}'", templateExt.getKey(), split.get(0)));
} else {
list.add(StrUtil.format("{} between '{}' and '{}'", templateExt.getKey(), split.get(0), split.get(1)));
}
} else if (Objects.equals(templateExt.getAction(), "nbtw")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
if (split.size() == 1) {
list.add(StrUtil.format("{} < '{}'", templateExt.getKey(), split.get(0)));
} else {
list.add(StrUtil.format("{} not between '{}' and '{}'", templateExt.getKey(), split.get(0), split.get(1)));
}
} else if (Objects.equals(templateExt.getAction(), "in")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
list.add(StrUtil.format("{} in ({})", templateExt.getKey(), split.stream().map(it -> "'" + it + "'")
.collect(Collectors.joining(","))));
} else if (Objects.equals(templateExt.getAction(), "nin")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
list.add(StrUtil.format("{} not in ({})", templateExt.getKey(), split.stream().map(it -> "'" + it + "'")
.collect(Collectors.joining(","))));
}
}
return StrUtil.join(" and ", list);
}
}

View File

@@ -0,0 +1,54 @@
package com.tiesheng.role.pojos.dto;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class ChartTemplateEditDTO {
private String id;
@NotEmpty(message = "请输入【模版名称】")
private String name;
@NotEmpty(message = "请选择【表名】")
private String tableName;
private String tableTitle;
@NotEmpty(message = "请选择【X轴字段】")
private String xField;
private String xFieldName;
private String xFormat;
private String sField;
private String sFieldName;
private String type;
private List<TemplateExt> exts;
private String remark;
private Integer sort;
@Data
public static class TemplateExt {
private String key;
private String action;
private String value;
/**
* 该数据是否有效
*
* @return
*/
@JSONField(serialize = false)
public boolean isErrorExt() {
return StrUtil.isEmpty(getKey()) || StrUtil.isEmpty(getAction()) || StrUtil.isEmpty(getValue());
}
}
}

View File

@@ -0,0 +1,66 @@
package com.tiesheng.role.pojos.vo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import lombok.Data;
import java.util.List;
@Data
public class TsTableVO {
private List<TableColumn> columns;
private List<JSONObject> dataSource;
@Data
public static class TableColumn {
private String title;
private String dataIndex;
private String width;
public TableColumn(String title, String dataIndex) {
this.title = title;
this.dataIndex = dataIndex;
}
}
public TsTableVO addHeader(String title, String dataIndex) {
if (getColumns() == null) {
setColumns(CollUtil.newArrayList());
}
getColumns().add(new TableColumn(title, dataIndex));
return this;
}
public TsTableVO addData(JSONObject obj) {
if (getDataSource() == null) {
setDataSource(CollUtil.newArrayList());
}
getDataSource().add(obj);
return this;
}
public static TsTableVO of(CoreChartTemplate template, List<JSONObject> originData) {
TsTableVO tsTableVO = new TsTableVO();
tsTableVO.addHeader(template.getXFieldName(), "xField");
List<String> split = StrUtil.split(template.getSField(), ",");
List<String> sFieldNameList = StrUtil.split(template.getSFieldName(), ",");
if (!split.isEmpty() && split.size() == sFieldNameList.size()) {
int idx = 0;
for (String dataIndex : split) {
tsTableVO.addHeader(CollUtil.get(sFieldNameList, idx), StrUtil.toCamelCase(dataIndex));
idx++;
}
}
tsTableVO.addHeader("统计", "yField");
tsTableVO.setDataSource(originData);
return tsTableVO;
}
}

View File

@@ -0,0 +1,20 @@
package com.tiesheng.role.service;
import com.tiesheng.role.mapper.CoreChartTableMapper;
import com.tiesheng.role.mapper.CoreChartTemplateMapper;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import com.tiesheng.util.service.TsServiceBase;
import lombok.Getter;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ChartService extends TsServiceBase<CoreChartTemplateMapper, CoreChartTemplate> {
@Getter
@Resource
CoreChartTableMapper coreChartTableMapper;
}

View File

@@ -0,0 +1,59 @@
package com.tiesheng.role.util;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.AbstractHeadColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
/**
* @author Administrator
*/
public class AliExcelUtil {
/**
* 导出数据
*
* @return
*/
public static HorizontalCellStyleStrategy getCustomStyle() {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setBold(true);
headWriteFont.setFontHeightInPoints((short) 12);
headWriteCellStyle.setWriteFont(headWriteFont);
headWriteCellStyle.setFillBackgroundColor(IndexedColors.ROYAL_BLUE.getIndex());
headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short) 11);
contentWriteCellStyle.setWriteFont(contentWriteFont);
contentWriteCellStyle.setWrapped(true);
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
}
public static class ChatColumnWidthStyleStrategy extends AbstractHeadColumnWidthStyleStrategy {
@Override
protected Integer columnWidth(Head head, Integer integer) {
if (head.getColumnIndex() == 0) {
return 20;
}
return (head.getHeadNameList().get(0).length()) * 2 + 10;
}
}
}

View File

@@ -0,0 +1,43 @@
create table core_chart_table
(
id varchar(50) not null
primary key,
create_time datetime not null,
update_time datetime not null,
is_deleted int default 0 not null,
table_name varchar(100) not null comment '表名',
table_title varchar(500) not null comment '名称',
columns text not null comment '所有字段',
remark text null comment '其他说明'
)
ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '图表-表信息'
row_format = DYNAMIC;
create table core_chart_template
(
id varchar(50) not null
primary key,
create_time datetime not null,
update_time datetime not null,
is_deleted int default 0 not null,
name varchar(100) not null comment '模版名称',
table_name varchar(100) not null comment '表名',
table_title varchar(100) not null comment '名称',
type varchar(50) default 'count_1' null comment '统计方式',
x_field varchar(100) not null comment 'X轴字段',
x_field_name varchar(500) not null comment 'X轴字段',
x_format varchar(100) null comment 'X轴格式化只有X轴字段为date时有效',
s_field varchar(100) null comment 'S轴字段',
s_field_name varchar(500) null comment 'S轴字段',
exts text null comment '附件条件',
remark text null comment '其他说明',
sort int default 0 null comment '排序'
)
ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '图表-表信息'
row_format = DYNAMIC;

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tiesheng.zaxy.alarm.mapper.CoreChartTableMapper">
<resultMap id="BaseResultMap" type="com.tiesheng.zaxy.alarm.pojos.dao.CoreChartTable">
<!--@mbg.generated-->
<!--@Table core_chart_table-->
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
<result column="table_name" jdbcType="VARCHAR" property="tableName" />
<result column="table_title" jdbcType="VARCHAR" property="tableTitle" />
<result column="columns" jdbcType="LONGVARCHAR" property="columns" />
<result column="remark" jdbcType="LONGVARCHAR" property="remark" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, create_time, update_time, is_deleted, `table_name`, table_title, `columns`, remark
</sql>
</mapper>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tiesheng.zaxy.alarm.mapper.CoreChartTemplateMapper">
<resultMap id="BaseResultMap" type="com.tiesheng.zaxy.alarm.pojos.dao.CoreChartTemplate">
<!--@mbg.generated-->
<!--@Table core_chart_template-->
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="table_name" jdbcType="VARCHAR" property="tableName" />
<result column="table_title" jdbcType="VARCHAR" property="tableTitle" />
<result column="type" jdbcType="VARCHAR" property="type" />
<result column="x_field" jdbcType="VARCHAR" property="xField" />
<result column="x_field_name" jdbcType="VARCHAR" property="xFieldName" />
<result column="x_format" jdbcType="VARCHAR" property="xFormat" />
<result column="s_field" jdbcType="VARCHAR" property="sField" />
<result column="s_field_name" jdbcType="VARCHAR" property="sFieldName" />
<result column="exts" jdbcType="LONGVARCHAR" property="exts" />
<result column="remark" jdbcType="LONGVARCHAR" property="remark" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, create_time, update_time, is_deleted, `name`, `table_name`, table_title, `type`,
x_field, x_field_name, x_format, s_field, s_field_name, exts, remark, sort
</sql>
<select id="recordCheck" resultType="com.alibaba.fastjson.JSONObject">
select ${xField} x_field,
<if test="sField != null and sField != ''">
${sField},
</if>
${type} y_field
from ${table}
where 1 = 1
<if test="where != null and where != ''">
and ${where}
</if>
<if test="groupBy != null and groupBy != ''">
group by ${groupBy}
</if>
order by ${groupBy} asc
</select>
</mapper>

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