diff --git a/README.md b/README.md index eeee4cdb..4bb76d5d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ JEECG BOOT 低代码开发平台(前后端分离版本) =============== -当前最新版本: 3.1.0(发布日期:2022-03-01) +当前最新版本: 3.2.0-beta(发布日期:2022-04-18) [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) @@ -132,13 +132,13 @@ Vue3版前端(Beta版) #### 后端 -- 基础框架:Spring Boot 2.3.5.RELEASE +- 基础框架:Spring Boot 2.6.6 -- 微服务框架: Spring Cloud Alibaba 2.2.3.RELEASE +- 微服务框架: Spring Cloud Alibaba 2021.1 -- 持久层框架:MybatisPlus 3.4.3.1 +- 持久层框架:MybatisPlus 3.5.1 -- 报表工具: JimuReport 1.4.32 +- 报表工具: JimuReport 1.5.0-beta - 安全框架:Apache Shiro 1.8.0,Jwt 3.11.0 @@ -192,7 +192,7 @@ Vue3版前端(Beta版) 4、分布式 http feign √ -5、熔断和降级 Sentinel √ +5、熔断降级限流 Sentinel √ 6、分布式文件 Minio、阿里OSS √ diff --git a/jeecg-boot/README.md b/jeecg-boot/README.md index fbf773c8..efe0b9cb 100644 --- a/jeecg-boot/README.md +++ b/jeecg-boot/README.md @@ -1,15 +1,15 @@ Jeecg-Boot 低代码开发平台 =============== -当前最新版本: 3.1.0(发布日期:20220301) +当前最新版本: 3.2.0(发布日期:20220425) ## 后端技术架构 -- 基础框架:Spring Boot 2.3.5.RELEASE +- 基础框架:Spring Boot 2.6.6 -- 持久层框架:Mybatis-plus 3.4.3.1 +- 持久层框架:Mybatis-plus 3.5.1 -- 安全框架:Apache Shiro 1.7.0,Jwt 3.11.0 +- 安全框架:Apache Shiro 1.8.0,Jwt 3.11.0 - 数据库连接池:阿里巴巴Druid 1.1.22 diff --git a/jeecg-boot/db/jeecgboot-mysql-5.7.sql b/jeecg-boot/db/jeecgboot-mysql-5.7.sql index e141bae2..4dab1b48 100644 --- a/jeecg-boot/db/jeecgboot-mysql-5.7.sql +++ b/jeecg-boot/db/jeecgboot-mysql-5.7.sql @@ -1,5 +1,5 @@ CREATE database if NOT EXISTS `jeecg-boot` default character set utf8mb4 collate utf8mb4_general_ci; -use `jeecg-boot`; +USE `jeecg-boot`; /* Navicat Premium Data Transfer @@ -14,7 +14,7 @@ use `jeecg-boot`; Target Server Version : 50727 File Encoding : 65001 - Date: 24/02/2022 16:48:02 + Date: 25/01/2021 12:54:08 */ SET NAMES utf8mb4; @@ -725,7 +725,7 @@ INSERT INTO `jimu_dict_item` VALUES ('71b924faa93805c5c1579f12e001c809', 'd6e115 INSERT INTO `jimu_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54'); INSERT INTO `jimu_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL); INSERT INTO `jimu_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL); -INSERT INTO `jimu_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:25:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, 1, 1, 'admin', '2019-03-18 23:25:40', 'jeecg', '2022-03-24 21:42:24'); INSERT INTO `jimu_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL); INSERT INTO `jimu_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', '', 1, 1, 'admin', '2019-05-10 17:54:51', NULL, NULL); INSERT INTO `jimu_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05'); @@ -832,7 +832,7 @@ INSERT INTO `jimu_report` VALUES ('9dbadaee8720767efe3164a7d018c870', '45566', ' INSERT INTO `jimu_report` VALUES ('a250846887abe01217aab173d3006489', '56663', '不动产打印', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a250846887abe01217aab173d3006489\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":true,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"1\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"2\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"3\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"4\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"5\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"6\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"7\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"8\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"9\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"}},\"isDrag\":true,\"height\":45},\"1\":{\"cells\":{},\"height\":23},\"2\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":0},\"1\":{\"text\":\" ${budong.yname}\",\"style\":21,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\" ${budong.chanquan}\",\"style\":0,\"merge\":[0,2]},\"5\":{\"text\":\"${budong.beizhu}\",\"merge\":[5,3]}},\"isDrag\":true,\"height\":39},\"4\":{\"cells\":{\"1\":{\"text\":\" ${budong.zhuzhi}\",\"style\":39,\"merge\":[0,2]}},\"isDrag\":true,\"height\":33},\"5\":{\"cells\":{\"1\":{\"text\":\" ${budong.danyuan}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":53},\"6\":{\"cells\":{\"1\":{\"text\":\" ${budong.type}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"7\":{\"cells\":{\"1\":{\"text\":\" ${budong.xtype}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":38},\"8\":{\"cells\":{\"1\":{\"text\":\" ${budong.suoyou}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":31},\"9\":{\"cells\":{\"1\":{\"text\":\" ${budong.mianji}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":45},\"10\":{\"cells\":{\"1\":{\"text\":\" ${budong.riqi}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":26},\"11\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0,\"merge\":[0,2]}},\"height\":35},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0},\"2\":{\"text\":\"${budong.chanquan}\",\"style\":0,\"merge\":[4,1]}},\"isDrag\":true},\"13\":{\"cells\":{}},\"14\":{\"cells\":{}},\"15\":{\"cells\":{}},\"16\":{\"cells\":{},\"height\":5},\"17\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":0}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"2\":{\"style\":0,\"text\":\"\"}}},\"len\":100,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{budong.zhuzhi}\"},\"-1\":{\"text\":\"#{budong.suoyou}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1024,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"italic\":true}},{\"font\":{\"italic\":true,\"bold\":true}},{\"font\":{\"italic\":true,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":true}},{\"align\":\"left\"},{\"align\":\"center\"},{\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true},{\"font\":{\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"top\"},{\"valign\":\"top\"},{\"textwrap\":true,\"font\":{\"bold\":true}},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\"},{\"font\":{\"italic\":true,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"italic\":true}},{\"valign\":\"middle\",\"font\":{\"italic\":false}},{\"font\":{\"italic\":false,\"bold\":false},\"valign\":\"middle\"},{\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"right\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"center\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"left\"},{\"align\":\"right\",\"valign\":\"bottom\"},{\"align\":\"right\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"center\",\"valign\":\"middle\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":107},\"1\":{\"width\":54},\"2\":{\"width\":135},\"3\":{\"width\":180},\"6\":{\"width\":123},\"8\":{\"width\":25},\"len\":50},\"merges\":[\"B1:B2\",\"B12:D12\",\"B9:D9\",\"B7:D7\",\"B6:D6\",\"B5:D5\",\"B3:D3\",\"B11:D11\",\"B8:D8\",\"B10:D10\",\"C13:D17\",\"C1:C2\",\"B4:D4\",\"F4:I9\",\"D1:D2\"],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"950\",\"height\":\"683\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/38_1610456500965_1617247643815.jpg\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"BJ9o6oelCr85EpT2\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]}]}', '', 'https://static.jeecg.com/designreport/images/24_1597233568822.png', 'jeecg', '2020-07-09 10:48:22', 'admin', '2021-04-01 03:27:28', 0, NULL, NULL, 1, 1413, NULL, NULL); INSERT INTO `jimu_report` VALUES ('a9f068972508920cd4aab831814f0c04', '23445', '逮捕证', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a9f068972508920cd4aab831814f0c04\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"2\":{\"text\":\"\",\"merge\":[0,9],\"style\":324},\"12\":{}},\"isDrag\":true,\"height\":55},\"1\":{\"cells\":{\"1\":{\"style\":410,\"merge\":[0,13],\"text\":\"兰州市经济侦查大队\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":128},\"2\":{\"cells\":{\"1\":{\"style\":411,\"merge\":[0,13],\"text\":\"逮捕令\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":41},\"3\":{\"cells\":{\"1\":{\"style\":412,\"merge\":[0,12],\"text\":\"第123459663号\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":60},\"4\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\" 根据《中华人民共和国刑事诉讼法》第七十八条之规定,\",\"style\":341,\"merge\":[0,11]},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":43},\"5\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"经\",\"merge\":[0,1]},\"4\":{\"text\":\"${pdaibu.pname}\",\"style\":342,\"merge\":[0,9]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":47},\"6\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":344,\"text\":\" \",\"merge\":[0,2]},\"5\":{\"merge\":[0,3],\"text\":\"批准,兹由我局对涉嫌\",\"style\":338},\"9\":{\"text\":\"${pdaibu.shiqing}\",\"style\":347,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":49},\"7\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"的\"},\"3\":{\"text\":\"${pdaibu.fname}\",\"style\":345,\"merge\":[0,1]},\"5\":{\"text\":\"(性别\",\"style\":343},\"6\":{\"text\":\"${pdaibu.fsex}\",\"style\":347,\"merge\":[0,1]},\"8\":{\"style\":346,\"text\":\"出生日期\"},\"9\":{\"text\":\"${pdaibu.cdata}\",\"style\":345,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"8\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\"${pdaibu.zhuzhi}\",\"style\":345,\"merge\":[0,7]},\"10\":{\"style\":341,\"text\":\"执行逮捕,送兰州\",\"merge\":[0,3]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"9\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"merge\":[0,6],\"text\":\"市经济侦查大队羁押。\"},\"9\":{\"style\":341,\"text\":\" \"},\"10\":{\"style\":341,\"merge\":[5,1],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":57},\"10\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"4\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"5\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"6\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":61},\"11\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"6\":{\"style\":376,\"merge\":[0,2],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":83},\"12\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"merge\":[0,6],\"style\":338,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":14},\"13\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":351,\"merge\":[0,5],\"text\":\" \"},\"8\":{\"style\":380,\"text\":\"公安局印\"},\"9\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"10\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"11\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":89},\"14\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":21},\"15\":{\"cells\":{\"1\":{\"style\":415,\"text\":\" \"},\"2\":{\"style\":416,\"text\":\" \"},\"3\":{\"style\":417,\"text\":\" \"},\"4\":{\"style\":417,\"text\":\" \"},\"5\":{\"style\":417,\"text\":\" \"},\"6\":{\"text\":\"${pdaibu.gdata}\",\"style\":421,\"merge\":[0,6]},\"13\":{\"style\":417,\"text\":\" \"},\"14\":{\"style\":419,\"text\":\" \"}},\"isDrag\":true,\"height\":168},\"len\":88,\"-1\":{\"cells\":{\"1\":{\"text\":\"#{daibu.fdata}\"},\"-1\":{\"text\":\"#{pdaibu.shiqing}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":709,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"valign\":\"top\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14}},{\"font\":{\"size\":14},\"align\":\"center\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12},\"align\":\"center\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":24}},{\"font\":{\"size\":24}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":22}},{\"font\":{\"size\":22}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true}},{\"font\":{\"size\":18,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"align\":\"right\"},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":18},\"1\":{\"width\":21},\"2\":{\"width\":27},\"3\":{\"width\":6},\"4\":{\"width\":87},\"5\":{\"width\":51},\"6\":{\"width\":51},\"7\":{\"width\":1},\"8\":{\"width\":86},\"9\":{\"width\":163},\"10\":{\"width\":1},\"11\":{\"width\":60},\"12\":{\"width\":45},\"13\":{\"width\":49},\"14\":{\"width\":23},\"15\":{\"width\":20},\"len\":50},\"merges\":[\"D8:E8\",\"C6:D6\",\"C10:I10\",\"G8:H8\",\"C9:J9\",\"C1:L1\",\"K10:L15\",\"C13:I13\",\"C14:H14\",\"F7:I7\",\"G12:I12\",\"G16:M16\",\"B4:N4\",\"C5:N5\",\"E6:N6\",\"J7:N7\",\"C7:E7\",\"K9:N9\",\"B2:O2\",\"B3:O3\",\"J8:N8\"],\"imgList\":[{\"row\":13,\"col\":9,\"width\":\"168\",\"height\":\"158\",\"src\":\"https://static.jeecg.com/designreport/images/QQ截图20210105214919_1610075317075.png\",\"layer_id\":\"XefZfpEcdS3wI6Ae\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[13,9],[13,10],[13,11]]}]}', '', 'https://static.jeecg.com/designreport/images/逮捕令_1607070625878.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-04-05 18:47:36', 0, NULL, NULL, 1, 2506, NULL, NULL); INSERT INTO `jimu_report` VALUES ('dd482bfd6ca470a0f49d9bb4e61ec694', '202101081046034402', '实习证明副本4402', NULL, NULL, 'printinfo', '{\"area\":false,\"printElWidth\":570,\"excel_config_id\":\"1347373863746539520\",\"printElHeight\":1047,\"rows\":{\"6\":{\"cells\":{\"2\":{\"merge\":[0,1],\"text\":\"实习证明\",\"style\":2},\"3\":{\"style\":2}},\"height\":50},\"8\":{\"cells\":{\"1\":{\"text\":\"#{tt.name}\",\"style\":3},\"2\":{\"merge\":[0,2],\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"merge\":[4,3],\"text\":\"#{tt.pingjia}\",\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"13\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"14\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"15\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"16\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"17\":{\"cells\":{\"1\":{\"text\":\"特此证明!\"}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"证明人:\",\"style\":3},\"4\":{\"text\":\"#{tt.lingdao}\"}}},\"23\":{\"cells\":{\"4\":{\"text\":\"#{tt.shijian}\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":487,\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/report_1595906079684_1610075686629.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true}],\"validations\":[],\"cols\":{\"0\":{\"width\":82},\"1\":{\"width\":86},\"4\":{\"width\":119},\"len\":26},\"merges\":[\"C7:D7\",\"C9:E9\",\"B13:E17\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-18 13:21:18', 'admin', '2021-02-02 19:01:05', 1, NULL, NULL, 0, 94, NULL, NULL); -INSERT INTO `jimu_report` VALUES ('f5f275b5e28b45256ef24587ec792f0c', '202101081641215447', '实例:来源收入统计副本5447', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"624\",\"height\":\"281\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":2,\"sci\":11,\"eri\":2,\"eci\":11,\"width\":100,\"height\":25},\"excel_config_id\":\"f5f275b5e28b45256ef24587ec792f0c\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":701,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":15},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-18 13:21:14', 'admin', '2021-06-01 19:21:25', 0, NULL, NULL, 0, 59, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('f5f275b5e28b45256ef24587ec792f0c', '202101081641215447', '实例:来源收入统计副本5447', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"624\",\"height\":\"281\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":2,\"sci\":11,\"eri\":2,\"eci\":11,\"width\":100,\"height\":25},\"excel_config_id\":\"f5f275b5e28b45256ef24587ec792f0c\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":701,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":15},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-18 13:21:14', 'admin', '2021-06-01 19:21:25', 0, NULL, NULL, 0, 61, NULL, NULL); INSERT INTO `jimu_report` VALUES ('f6ee801e8bdc28ba9d63f95dc65ccd79', '4556633', '采购单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"f6ee801e8bdc28ba9d63f95dc65ccd79\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"采购单\",\"style\":21,\"merge\":[0,6]}},\"height\":89},\"1\":{\"cells\":{\"1\":{\"text\":\"产品名称\",\"style\":23},\"2\":{\"text\":\"产品数量\",\"style\":23},\"3\":{\"text\":\"单价\",\"style\":23},\"4\":{\"text\":\"库存量\",\"style\":23},\"5\":{\"text\":\"库存总值\",\"style\":23},\"6\":{\"text\":\"订购量\",\"style\":23},\"7\":{\"text\":\"二次订购量\",\"style\":23}},\"height\":45},\"2\":{\"cells\":{\"1\":{\"style\":24,\"text\":\"#{caigou.cname}\"},\"2\":{\"style\":24,\"text\":\"#{caigou.cnum}\"},\"3\":{\"style\":24,\"text\":\"#{caigou.cprice}\"},\"4\":{\"style\":24,\"text\":\"#{caigou.ctotal}\"},\"5\":{\"style\":24,\"text\":\"#{caigou.tp}\"},\"6\":{\"style\":24,\"text\":\"#{caigou.dtotal}\"},\"7\":{\"style\":24,\"text\":\"#{caigou.ztotal}\"}},\"height\":26},\"5\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"6\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":682,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":43},\"1\":{\"width\":114},\"2\":{\"width\":109},\"3\":{\"width\":78},\"4\":{\"width\":77},\"5\":{\"width\":84},\"6\":{\"width\":82},\"7\":{\"width\":95},\"len\":50},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/caigou_1607310279439.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-04-01 03:09:41', 0, NULL, NULL, 1, 1248, NULL, NULL); INSERT INTO `jimu_report` VALUES ('ff9bd143582a6dfed897ba8b6f93b175', '56696', '销售公司出库单', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jeecg.com/designreport/images/医疗器械_1607070355110.png', 'jeecg', '2020-06-16 11:54:02', 'admin', '2021-02-02 19:34:39', 0, NULL, NULL, 0, 764, NULL, NULL); @@ -1642,6 +1642,7 @@ CREATE TABLE `jimu_report_share` ( `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间', `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)', `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)', + `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为密码锁(0 否,1是)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic; @@ -2897,7 +2898,7 @@ CREATE TABLE `qrtz_scheduler_state` ( -- ---------------------------- -- Records of qrtz_scheduler_state -- ---------------------------- -INSERT INTO `qrtz_scheduler_state` VALUES ('MyScheduler', 'DESKTOP-32NS8B11645690619536', 1645692480078, 10000); +INSERT INTO `qrtz_scheduler_state` VALUES ('MyScheduler', 'DESKTOP-32NS8B11648129279482', 1648130693795, 10000); -- ---------------------------- -- Table structure for qrtz_simple_triggers @@ -6247,6 +6248,65 @@ INSERT INTO `sys_log` VALUES ('1496762386811310081', 2, 'online列表加载,表 INSERT INTO `sys_log` VALUES ('1496762386828087298', 2, 'online表单加载,表名:ces_field_kongj,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.b()', NULL, '', NULL, 85, NULL, '2022-02-24 16:22:16', NULL, NULL); INSERT INTO `sys_log` VALUES ('1496762393459281921', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.b()', NULL, '', NULL, 18, NULL, '2022-02-24 16:22:18', NULL, NULL); INSERT INTO `sys_log` VALUES ('1496762415261274114', 2, 'online修改数据,表名:ces_field_kongj,修改成功!', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\"18f064d1ef424c93ba7a16148851664f\",{\"birthday\":\"2022-02-25\",\"ccc\":\"2022-02-24 16:18:17\",\"sel_mut\":\"1\",\"remakr\":\"111\",\"user_sel\":\"admin\",\"fuwenb\":\"

2222

\",\"sex\":\"2\",\"sel_search\":\"jeecg\",\"pic\":\"\",\"dnum\":\"\",\"radio\":\"1\",\"update_time\":\"2022-02-24 16:22:22\",\"dep_sel\":\"4f1765520d6346f9bd9c79e2479e5b12\",\"checkbox\":\"1,2\",\"name\":\"admin\",\"files\":\"\",\"id\":\"1496761361291399170\",\"update_by\":\"admin\"}]', NULL, 37, NULL, '2022-02-24 16:22:23', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501370984680419329', 1, '用户名: jeecg,退出成功!', NULL, 'jeecg', 'jeecg', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 09:35:12', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501371037373460481', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 09:35:24', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501570213225009154', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 22:46:51', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501570352526233601', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=devleader, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2d7444e2', NULL, 29, NULL, '2022-03-09 22:47:25', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571014081220609', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=总经理, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@71d3247f', NULL, 19, NULL, '2022-03-09 22:50:02', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571043487485954', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6ffe273f', NULL, 16, NULL, '2022-03-09 22:50:09', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571072264605698', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@a649afa', NULL, 19, NULL, '2022-03-09 22:50:16', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571088127463426', 2, '编辑用户,id: e9ca23d68d884d4ebb19d07889727dae', 2, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 22:50:20', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571370706112514', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 22:51:27', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571405774688257', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 22:51:36', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571474540302338', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4f812b5b', NULL, 10, NULL, '2022-03-09 22:51:52', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501571494782013441', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 99999 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@54077ceb', NULL, 20, NULL, '2022-03-09 22:51:57', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501572638799400962', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@431d8a4c', NULL, 9, NULL, '2022-03-09 22:56:30', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574236191690753', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:02:50', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574294920335362', 1, '用户名: jeecg,登录成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:03:04', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574375845236738', 1, '用户名: jeecg,退出成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:03:24', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574393444536321', 1, '用户名: jeecg,登录成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:03:28', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574423408644098', 1, '用户名: jeecg,退出成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:03:35', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501574967929966593', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:05:45', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501575194464325634', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:06:39', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501575218535436290', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:06:45', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501578329215832066', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-09 23:19:06', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501755209528733698', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-10 11:01:58', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501768754517565442', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-10 11:55:47', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501768805864235009', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-10 11:55:59', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501805216105590786', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-10 14:20:40', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501805283747131393', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-10 14:20:56', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1501805411295916033', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, ' sysPosition: SysPosition(id=null, code=总经理, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null) pageNo: 1 pageSize: 10 req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7dbfce88', NULL, 33, NULL, '2022-03-10 14:21:27', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502227087347249153', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-11 18:17:02', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502227179156369410', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-11 18:17:24', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502227219065171969', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-11 18:17:34', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502990888372281345', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 20:52:07', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502991646337540097', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 20:55:07', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502991665123827713', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 20:55:12', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502997787805229057', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:19:32', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1502997804410478594', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:19:36', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503004755882156033', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:47:13', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503004777361186818', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:47:18', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503006776244838401', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:55:15', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503006801129644034', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:55:21', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503006839260061697', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:55:30', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503007112258920450', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:56:35', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503007129593978881', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:56:39', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503007309684809729', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:57:22', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503007327112142849', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-13 21:57:26', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503373125661331457', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-14 22:10:59', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503373175388999681', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-14 22:11:11', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503373177888804865', 1, '用户名: 管理员,退出成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-14 22:11:12', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1503373523788861441', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-14 22:12:34', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038323258675202', 1, '用户名: JEECG用户,退出成功!', NULL, 'jeecg', 'JEECG用户', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-16 18:14:15', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038367563108354', 1, '用户名: admin,登录成功!', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-16 18:14:25', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038420813991937', 2, 'online表单加载,表名:ces_field_kongj,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.b()', NULL, '', NULL, 191, NULL, '2022-03-16 18:14:38', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038420813991938', 2, 'online列表加载,表名:ces_field_kongj,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 210, NULL, '2022-03-16 18:14:38', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038432134418433', 2, 'online表单加载,表名:ces_field_kongj,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.b()', NULL, '', NULL, 33, NULL, '2022-03-16 18:14:41', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1504038432272830466', 2, 'online列表加载,表名:ces_field_kongj,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 61, NULL, '2022-03-16 18:14:41', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1506553487505293314', 1, '用户名: jeecg,退出成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-23 16:48:36', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1506553540009590785', 1, '用户名: jeecg,登录成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-23 16:48:49', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1506989645007794177', 1, '用户名: jeecg,退出成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-24 21:41:45', NULL, NULL); +INSERT INTO `sys_log` VALUES ('1506989685285695490', 1, '用户名: jeecg,登录成功!', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2022-03-24 21:41:54', NULL, NULL); -- ---------------------------- -- Table structure for sys_permission @@ -6427,6 +6487,260 @@ INSERT INTO `sys_permission` VALUES ('fba41089766888023411a978d13c0aa4', 'e41b69 INSERT INTO `sys_permission` VALUES ('fc810a2267dd183e4ef7c71cc60f4670', '700b7f95165c46cc7a78bf227aa8fed3', '请求追踪', '/monitor/HttpTrace', 'modules/monitor/HttpTrace', NULL, NULL, 1, NULL, NULL, 4.00, 0, NULL, 1, 1, NULL, 0, NULL, NULL, 'admin', '2019-04-02 09:46:19', 'admin', '2019-04-02 11:37:27', 0, 0, NULL, NULL); INSERT INTO `sys_permission` VALUES ('fedfbf4420536cacc0218557d263dfea', '6e73eb3c26099c191bf03852ee1310a1', '新消息通知', '/account/settings/notification', 'account/settings/Notification', NULL, NULL, 1, 'NotificationSettings', NULL, NULL, NULL, '', 1, 1, NULL, NULL, NULL, NULL, NULL, '2018-12-26 19:02:05', NULL, NULL, 0, 0, NULL, NULL); +-- ---------------------------- +-- Table structure for sys_permission3 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission3`; +CREATE TABLE `sys_permission3` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id', + `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单标题', + `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径', + `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件', + `is_route` tinyint(1) NULL DEFAULT 1 COMMENT '是否路由菜单: 0:不是 1:是(默认值1)', + `component_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件名字', + `redirect` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '一级菜单跳转地址', + `menu_type` int(11) NULL DEFAULT NULL COMMENT '菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)', + `perms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', + `perms_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '权限策略1显示2禁用', + `sort_no` int(10) NULL DEFAULT NULL COMMENT '菜单排序', + `always_show` tinyint(1) NULL DEFAULT NULL COMMENT '聚合子路由: 1是0否', + `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `is_leaf` tinyint(1) NULL DEFAULT NULL COMMENT '是否叶子节点: 1是0否', + `keep_alive` tinyint(1) NULL DEFAULT NULL COMMENT '是否缓存该页面: 1:是 0:不是', + `hidden` int(2) NULL DEFAULT 0 COMMENT '是否隐藏路由: 0否,1是', + `hide_tab` int(2) NULL DEFAULT NULL COMMENT '是否隐藏tab: 0否,1是', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `del_flag` int(11) NULL DEFAULT 0 COMMENT '删除状态 0正常 1已删除', + `rule_flag` int(3) NULL DEFAULT 0 COMMENT '是否添加数据权限1是0否', + `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮权限状态(0无效1有效)', + `internal_or_external` tinyint(1) NULL DEFAULT NULL COMMENT '外链菜单打开方式 0/内部打开 1/外部打开', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_menu_type`(`menu_type`) USING BTREE, + INDEX `index_menu_hidden`(`hidden`) USING BTREE, + INDEX `index_menu_status`(`status`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_permission3 +-- ---------------------------- +INSERT INTO `sys_permission3` VALUES ('1170592628746878978', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '菜单管理', '/system/menu', 'system/menu/index', 1, NULL, NULL, 1, NULL, '1', 3, 0, 'ant-design:menu-fold-outlined', 1, 0, 0, NULL, NULL, 'admin', '2019-09-08 15:00:05', 'admin', '2021-09-17 15:40:01', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1211885237487923202', '1207203817658105858', 'btn:add', '', '', 1, NULL, NULL, 2, 'btn:add', '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2019-12-31 13:42:11', 'admin', '2020-01-07 20:07:53', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1214376304951664642', '3f915b2769fc80648e92d04e84ca059d', '用户编辑', '', '', 1, NULL, NULL, 2, 'user:edit', '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2020-01-07 10:40:47', 'admin', '2020-01-07 10:41:04', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1214462306546319362', '3f915b2769fc80648e92d04e84ca059d', '新增用户', '', '', 1, NULL, NULL, 2, 'user:add', '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2020-01-07 16:22:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1280350452934307841', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '租户管理', '/system/tenant', 'system/tenant/index', 1, NULL, NULL, 1, NULL, '1', 99, 0, 'ant-design:appstore-twotone', 1, 0, 0, NULL, NULL, 'admin', '2020-07-07 11:58:30', 'admin', '2021-09-17 15:40:41', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108176273760258', '', 'Dashboard', '/dashboard', 'layouts/default/index', 1, NULL, '/dashboard/analysis', 0, NULL, '1', 1, 0, 'ion:grid-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-10-22 20:39:20', 0, 1, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108176814825473', '1438108176273760258', '工作台', '/dashboard/workbench', 'dashboard/workbench/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, 'ant-design:appstore-twotone', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-17 15:42:42', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108176932265985', '1438108178010202113', '权限管理', '/permission', 'layouts/default/index', 1, NULL, '/permission/front/page', 0, NULL, '1', 2, 0, 'ion:key-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177074872321', '1438108176932265985', '基于前端权限', '/permission/front', NULL, 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177188118529', '1438108176932265985', '基于后台权限', '/permission/back', NULL, 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177351696386', '1438108177074872321', '页面权限', '/permission/front/page', 'demo/permission/front/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-16 14:37:49', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177565605889', '1438108177074872321', '按钮权限', '/permission/front/btn', 'demo/permission/front/Btn', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:57:23', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177720795137', '1438108177188118529', '页面权限', '/permission/back/page', 'demo/permission/back/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:56:40', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108177880178689', '1438108177188118529', '按钮权限', '/permission/back/btn', 'demo/permission/back/Btn', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:57:00', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178010202113', '1438108196993622018', '功能示例', '/feat', 'layouts/default/index', 1, NULL, '/feat/icon', 0, NULL, '1', 20, 0, 'ion:git-compare-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178127642626', '1438108197958315557', '图标', '/comp/basic/icon', 'demo/feat/icon/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178257666049', '1438108178010202113', 'websocket测试', '/feat/ws', 'demo/feat/ws/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178421243905', '1438108178010202113', '登录过期', '/feat/session-timeout', 'demo/feat/session-timeout/index', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178643542017', '1438108197958311677', '打印', '/comp/third/print', 'demo/feat/print/index', 1, NULL, NULL, 1, NULL, '1', 3, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178781954049', '1438108197958315557', 'Tab操作', '/comp/basic/tabs', 'demo/feat/tabs/index', 1, NULL, NULL, 1, NULL, '1', 4, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178781954050', '1438108197958315557', 'TabDetail', '/comp/basic/tabs/detail/:id', 'demo/feat/tabs/TabDetail', 1, NULL, '/comp/basic/tabs/detail', 1, NULL, '1', 4, 0, NULL, 1, 0, 1, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108178911977473', '1438108187455774722', '面包屑导航', '/feat/breadcrumb', 'layouts/default/index', 1, NULL, '/feat/breadcrumb/flat', 1, NULL, '1', 5, 0, 'ant-design:right-square-filled', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-17 15:48:07', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108179226550273', '1438108197958311677', '右键菜单', '/comp/third/context-menu', 'demo/feat/context-menu/index', 1, NULL, NULL, 1, NULL, '1', 6, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108179381739521', '1438108197958311677', '文件下载', '/comp/third/download', 'demo/feat/download/index', 1, NULL, NULL, 1, NULL, '1', 7, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108179599843330', '1438108197958311677', 'ClickOutSide组件', '/comp/third/click-out-side', 'demo/feat/click-out-side/index', 1, NULL, NULL, 1, NULL, '1', 8, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108179910221825', '1438108197958311677', '图片预览', '/comp/third/img-preview', 'demo/feat/img-preview/index', 1, NULL, NULL, 1, NULL, '1', 9, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108180077993985', '1438108197958311677', '剪切板', '/comp/third/copy', 'demo/feat/copy/index', 1, NULL, NULL, 1, NULL, '1', 10, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108180258349057', '1438108197958315557', '消息提示', '/comp/basic/msg', 'demo/feat/msg/index', 1, NULL, NULL, 1, NULL, '1', 11, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108180434509826', '1438108197958311677', '水印', '/comp/third/watermark', 'demo/feat/watermark/index', 1, NULL, NULL, 1, NULL, '1', 12, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108180631642113', '1438108197958311677', '水波纹', '/comp/third/ripple', 'demo/feat/ripple/index', 1, NULL, NULL, 1, NULL, '1', 13, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108180770054145', '1438108178010202113', '全屏', '/feat/full-screen', 'demo/feat/full-screen/index', 1, NULL, NULL, 1, NULL, '1', 14, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108182116425729', '1438108197958311677', '日历(New)', '/comp/third/fullCalendar', 'demo/fullcalendar/index', 1, NULL, NULL, 1, NULL, '1', 16, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183085309954', '1438108178010202113', '错误日志', '/feat/error-log', 'sys/error-log/index', 1, NULL, NULL, 1, NULL, '1', 17, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183219527682', '1438108196993622018', 'Excel', '/feat/excel', 'layouts/default/index', 1, NULL, '/feat/excel/customExport', 1, NULL, '1', 18, 0, 'ant-design:file-excel-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:54:57', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183395688450', '1438108187455774722', 'Tab带参', '/feat/testTab/:id', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '1', 19, 0, 'ant-design:insert-row-above-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:48:57', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183492157442', '1438108187455774722', 'Menu带参', '/feat/testParam/:id', 'layouts/default/index', 1, NULL, NULL, 1, NULL, '1', 20, 0, 'ant-design:menu-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:49:12', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183630569474', '1438108178911977473', '平级模式', '/feat/breadcrumb/flat', 'demo/feat/breadcrumb/FlatList', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:12:01', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183630569477', '1438108178911977473', '平级详情', '/feat/breadcrumb/flatDetail', 'demo/feat/breadcrumb/FlatListDetail', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 1, 1, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-18 11:07:07', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183777370114', '1438108183630569474', '平级详情', '/feat/breadcrumb/flatDetail', 'demo/feat/breadcrumb/FlatListDetail', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 1, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:13:41', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108183907393538', '1438108178911977473', '层级模式', '/feat/breadcrumb/children', 'demo/feat/breadcrumb/ChildrenList', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:11:57', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108184049999873', '1438108183907393538', '层级详情', '/feat/breadcrumb/children/childrenDetail', 'demo/feat/breadcrumb/ChildrenListDetail', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:11:49', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108185660612609', '1438108183219527682', '选择导出格式', '/feat/excel/customExport', 'demo/excel/CustomExport', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:15:59', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108185815801858', '1438108183219527682', 'JSON数据导出', '/feat/excel/jsonExport', 'demo/excel/JsonExport', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:15', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108185958408193', '1438108183219527682', 'Array数据导出', '/feat/excel/arrayExport', 'demo/excel/ArrayExport', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:32', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108186289758209', '1438108183219527682', '导入', '/feat/excel/importExcel', 'demo/excel/ImportExcel', 1, NULL, NULL, 1, NULL, '1', 3, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:43', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108186717577217', '1438108183492157442', 'Menu带参1', '/feat/testParam/:id/sub1', 'demo/feat/menu-params/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:17:23', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108187103453186', '1438108183492157442', 'Menu带参2', '/feat/testParam/:id/sub2', 'demo/feat/menu-params/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:17:36', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108187455774722', '', '页面&导航', '/page-demo', 'layouts/default/index', 1, NULL, '/page-demo/form/basic', 0, NULL, '1', 12, 0, 'ion:aperture-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-11-18 10:48:15', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108187678072833', '1438108187455774722', '表单页', '/page-demo/form', 'layouts/default/index', 1, NULL, '/page-demo/form/basic', 1, NULL, '1', 0, 0, 'ant-design:form-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:45:30', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108187871010818', '1438108187455774722', '详情页', '/page-demo/desc', 'layouts/default/index', 1, NULL, '/page-demo/desc/basic', 1, NULL, '1', 1, 0, 'ant-design:border-right-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:46:10', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108188034588674', '1438108187455774722', '结果页', '/page-demo/result', 'layouts/default/index', 1, NULL, '/page-demo/result/success', 1, NULL, '1', 2, 0, 'ant-design:account-book-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:47:04', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108188378521602', '1438108187455774722', '个人页', '/page-demo/account', 'layouts/default/index', 1, NULL, '/page-demo/account/setting', 1, NULL, '1', 3, 0, 'ant-design:user-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:47:23', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108188542099458', '1438108187455774722', '异常页', '/page-demo/exception', 'layouts/default/index', 1, NULL, '/page-demo/exception/404', 1, NULL, '1', 4, 0, 'ant-design:bug-twotone', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:47:41', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108188714065922', '1438108187455774722', '列表页', '/page-demo/list', 'layouts/default/index', 1, NULL, '/page-demo/list/card', 1, NULL, '1', 5, 0, 'ant-design:table-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:48:19', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108189062193153', '1438108187678072833', '基础表单', '/page-demo/form/basic', 'demo/page/form/basic/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108189427097601', '1438108187678072833', '分步表单', '/page-demo/form/step', 'demo/page/form/step/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108189754253313', '1438108187678072833', '高级表单', '/page-demo/form/high', 'demo/page/form/high/index', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108190110769154', '1438108187871010818', '基础详情页', '/page-demo/desc/basic', 'demo/page/desc/basic/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108190404370433', '1438108187871010818', '高级详情页', '/page-demo/desc/high', 'demo/page/desc/high/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108190777663490', '1438108188034588674', '成功页', '/page-demo/result/success', 'demo/page/result/success/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108191356477442', '1438108188034588674', '失败页', '/page-demo/result/fail', 'demo/page/result/fail/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108192623157249', '1438108188378521602', '个人中心', '/page-demo/account/center', 'demo/page/account/center/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108193701093378', '1438108188378521602', '个人设置', '/page-demo/account/setting', 'demo/page/account/setting/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108194992939010', '1438108188542099458', '403', '/page-demo/exception/403', 'sys/exception/NotAccessException', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:02:47', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108195307511809', '1438108188542099458', '404', '/page-demo/exception/404', 'sys/exception/Exception', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108195487866881', '1438108188542099458', '500', '/page-demo/exception/500', 'sys/exception/ServerErrorException', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:04:34', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108195638861825', '1438108188542099458', '网络错误', '/page-demo/exception/net-work-error', 'sys/exception/NetworkErrorException', 1, NULL, NULL, 1, NULL, '1', 3, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:05:05', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108195924074497', '1438108188542099458', '无数据', '/page-demo/exception/not-data', 'sys/exception/NotDataErrorException', 1, NULL, NULL, 1, NULL, '1', 4, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:05:40', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108196263813121', '1438108188714065922', '标准列表', '/page-demo/list/basic', 'demo/page/list/basic/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108196528054273', '1438108188714065922', '卡片列表', '/page-demo/list/card', 'demo/page/list/card/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108196855209985', '1438108188714065922', '搜索列表', '/page-demo/list/search', 'demo/page/list/search/index', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108196993622018', '', '组件&功能', '/comp', 'layouts/default/index', 1, NULL, '/comp/basic', 0, NULL, '1', 11, 0, 'ion:layers-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-11-18 10:48:06', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197270446081', '1438108197958311537', '自定义组件示例', '/comp/jeecg/basic', 'demo/jeecg/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197790539778', '1438108197958315557', 'Button组件', '/comp/basic/button', 'demo/comp/button/index', 1, NULL, NULL, 1, NULL, '1', 8, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 09:31:48', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197958311537', '1438108196993622018', 'Jeecg组件示例', '/comp/jeecg', 'layouts/default/index', 1, NULL, '/comp/jeecg/basic', 1, NULL, '1', 1, 0, 'ant-design:sketch-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:49:57', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197958311637', '1438108196993622018', '弹框抽屉', '/comp/modal', 'layouts/default/index', 1, NULL, '/comp/modal/basic', 1, NULL, '1', 6, 0, 'ant-design:laptop-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:10', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197958311677', '1438108196993622018', '第三方组件', '/comp/third', 'layouts/default/index', 1, NULL, '/comp/third/basic', 1, NULL, '1', 7, 0, 'ant-design:slack-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:31', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197958311937', '1438108196993622018', 'Form示例', '/comp/form', 'layouts/default/index', 1, NULL, '/comp/form/basic', 1, NULL, '1', 2, 0, 'ant-design:pic-left-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:39', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108197958315557', '1438108196993622018', '基础组件', '/comp/basic', 'layouts/default/index', 1, NULL, '/comp/basic', 1, NULL, '1', 1, 0, 'ant-design:insert-row-left-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:27', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108198113501186', '1438108196993622018', 'Table示例', '/comp/table', 'layouts/default/index', 1, NULL, '/comp/table/basic', 1, NULL, '1', 3, 0, 'ant-design:table-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:51', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108198339993602', '1438108197958311677', '动画组件', '/comp/third/transition', 'demo/comp/transition/index', 1, NULL, NULL, 1, NULL, '1', 9, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108198679732226', '1438108197958311537', '一对多示例', '/comp/jeecg/oneToMore', 'demo/vextable/index', 1, NULL, NULL, 1, NULL, '1', 6, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108198855892993', '1438108197958311677', '图片裁剪', '/comp/third/basic', 'demo/comp/cropper/index', 1, NULL, NULL, 1, NULL, '1', 7, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108199120134145', '1438108197958311677', '相对时间', '/comp/third/timestamp', 'demo/comp/time/index', 1, NULL, NULL, 1, NULL, '1', 8, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108199304683521', '1438108197958311677', '数字动画', '/comp/third/countTo', 'demo/comp/count-to/index', 1, NULL, NULL, 1, NULL, '1', 9, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108199413735425', '1438108196993622018', 'Tree示例', '/comp/tree', 'layouts/default/index', 1, NULL, '/comp/tree/basic', 1, NULL, '1', 4, 0, 'ant-design:partition-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:54:17', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108199539564546', '1438108196993622018', '编辑器', '/comp/editor', 'layouts/default/index', 1, NULL, '/comp/editor/markdown', 1, NULL, '1', 5, 0, 'ant-design:credit-card-twotone', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:52:47', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108199631839234', '1438108196993622018', '滚动组件', '/comp/scroll', 'layouts/default/index', 1, NULL, '/comp/scroll/basic', 1, NULL, '1', 11, 0, 'ant-design:column-height-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:43', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108200076435458', '1438108197958311637', '弹窗扩展', '/comp/modal/basic', 'demo/comp/modal/index', 1, NULL, NULL, 1, NULL, '1', 12, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108200391008257', '1438108197958311637', '抽屉扩展', '/comp/modal/drawer', 'demo/comp/drawer/index', 1, NULL, NULL, 1, NULL, '1', 13, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108200672026626', '1438108197958315557', '详情组件', '/comp/desc', 'demo/comp/desc/index', 1, NULL, NULL, 1, NULL, '1', 14, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108200802050050', '1438108196993622018', '懒加载组件', '/comp/lazy', 'layouts/default/index', 1, NULL, '/comp/lazy/basic', 1, NULL, '1', 15, 0, 'ant-design:small-dash-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:59', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108200919490562', '1438108196993622018', '验证组件', '/comp/verify', 'layouts/default/index', 1, NULL, '/comp/verify/drag', 1, NULL, '1', 16, 0, 'ant-design:field-binary-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', 'admin', '2021-09-17 15:54:36', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108201150177281', '1438108197958311677', '二维码组件', '/comp/third/qrcode', 'demo/comp/qrcode/index', 1, NULL, NULL, 1, NULL, '1', 17, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108201502498817', '1438108197958311677', '密码强度组件', '/comp/third/strength-meter', 'demo/comp/strength-meter/index', 1, NULL, NULL, 1, NULL, '1', 18, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108201712214018', '1438108197958311677', '上传组件', '/comp/third/upload', 'demo/comp/upload/index', 1, NULL, NULL, 1, NULL, '1', 19, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108202060341249', '1438108197958311677', 'Loading', '/comp/third/loading', 'demo/comp/loading/index', 1, NULL, NULL, 1, NULL, '1', 20, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108202366525441', '1438108197958311937', '基础表单', '/comp/form/basic', 'demo/form/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108203649982466', '1438108197958311937', 'useForm', '/comp/form/useForm', 'demo/form/UseForm', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108203817754625', '1438108197958311937', 'RefForm', '/comp/form/refForm', 'demo/form/RefForm', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108204023275521', '1438108197958311937', '可收缩表单', '/comp/form/advancedForm', 'demo/form/AdvancedForm', 1, NULL, NULL, 1, NULL, '1', 3, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108204232990721', '1438108197958311937', '表单验证', '/comp/form/ruleForm', 'demo/form/RuleForm', 1, NULL, NULL, 1, NULL, '1', 4, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108204400762881', '1438108197958311937', '动态表单', '/comp/form/dynamicForm', 'demo/form/DynamicForm', 1, NULL, NULL, 1, NULL, '1', 5, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108204576923649', '1438108197958311937', '自定义组件', '/comp/form/customerForm', 'demo/form/CustomerForm', 1, NULL, NULL, 1, NULL, '1', 6, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108204732112898', '1438108197958311937', '表单增删示例', '/comp/form/appendForm', 'demo/form/AppendForm', 1, NULL, NULL, 1, NULL, '1', 7, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205004742657', '1438108198113501186', '基础表格', '/comp/table/basic', 'demo/table/Basic', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205180903426', '1438108198113501186', '树形表格', '/comp/table/treeTable', 'demo/table/TreeTable', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205357064193', '1438108198113501186', '远程加载示例', '/comp/table/fetchTable', 'demo/table/FetchTable', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205587750914', '1438108198113501186', '固定列', '/comp/table/fixedColumn', 'demo/table/FixedColumn', 1, NULL, NULL, 1, NULL, '1', 3, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205742940161', '1438108198113501186', '自定义列', '/comp/table/customerCell', 'demo/table/CustomerCell', 1, NULL, NULL, 1, NULL, '1', 4, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108205919100930', '1438108198113501186', '开启搜索区域', '/comp/table/formTable', 'demo/table/FormTable', 1, NULL, NULL, 1, NULL, '1', 5, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108206086873089', '1438108198113501186', 'UseTable', '/comp/table/useTable', 'demo/table/UseTable', 1, NULL, NULL, 1, NULL, '1', 6, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108206258839553', '1438108198113501186', 'RefTable', '/comp/table/refTable', 'demo/table/RefTable', 1, NULL, NULL, 1, NULL, '1', 7, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108206489526274', '1438108198113501186', '多级表头', '/comp/table/multipleHeader', 'demo/table/MultipleHeader', 1, NULL, NULL, 1, NULL, '1', 8, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108206661492738', '1438108198113501186', '合并单元格', '/comp/table/mergeHeader', 'demo/table/MergeHeader', 1, NULL, NULL, 1, NULL, '1', 9, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108206959288321', '1438108198113501186', '嵌套子表格', '/comp/table/nestedTable', 'demo/table/NestedTable', 1, NULL, NULL, 1, NULL, '1', 10, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108207160614913', '1438108198113501186', '可展开表格', '/comp/table/expandTable', 'demo/table/ExpandTable', 1, NULL, NULL, 1, NULL, '1', 11, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108207374524418', '1438108198113501186', '定高/头部自定义', '/comp/table/fixedHeight', 'demo/table/FixedHeight', 1, NULL, NULL, 1, NULL, '1', 12, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108207563268097', '1438108198113501186', '表尾行合计', '/comp/table/footerTable', 'demo/table/FooterTable', 1, NULL, NULL, 1, NULL, '1', 13, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108207793954818', '1438108198113501186', '可编辑单元格', '/comp/table/editCellTable', 'demo/table/EditCellTable', 1, NULL, NULL, 1, NULL, '1', 14, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108208024641538', '1438108198113501186', '可编辑行', '/comp/table/editRowTable', 'demo/table/EditRowTable', 1, NULL, NULL, 1, NULL, '1', 15, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108208297271297', '1438108198113501186', '权限列', '/comp/table/authColumn', 'demo/table/AuthColumn', 1, NULL, NULL, 1, NULL, '1', 16, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108208817364993', '1438108199413735425', '基础树', '/comp/tree/basic', 'demo/tree/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108208980942850', '1438108199413735425', '可搜索/工具栏', '/comp/tree/editTree', 'demo/tree/EditTree', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108209228406785', '1438108199413735425', '函数操作示例', '/comp/tree/actionTree', 'demo/tree/ActionTree', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108210117599234', '1438108199539564546', 'Json编辑器', '/comp/editor/json', 'demo/editor/json/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108210260205570', '1438108199539564546', 'markdown编辑器', '/comp/editor/markdown', NULL, 1, NULL, '/comp/editor/markdown/index', 1, NULL, '1', 1, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108211325558785', '1438108210260205570', '基础使用', '/comp/editor/markdown/index', 'demo/editor/markdown/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', 'admin', '2021-09-16 14:40:59', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108211661103106', '1438108210260205570', '嵌入form', '/comp/editor/markdown/editor', 'demo/editor/markdown/Editor', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', 'admin', '2021-09-16 14:41:04', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108211778543618', '1438108199539564546', '富文本', '/comp/editor/tinymce', NULL, 1, NULL, '/comp/editor/tinymce/index', 1, NULL, '1', 2, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108214882328577', '1438108211778543618', '基础使用', '/comp/editor/tinymce/index', 'demo/editor/tinymce/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108215335313409', '1438108211778543618', '嵌入form', '/comp/editor/tinymce/editor', 'demo/editor/tinymce/Editor', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108215511474177', '1438108199631839234', '基础滚动', '/comp/scroll/basic', 'demo/comp/scroll/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108215687634945', '1438108199631839234', '滚动函数', '/comp/scroll/action', 'demo/comp/scroll/Action', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108215989624834', '1438108199631839234', '虚拟滚动', '/comp/scroll/virtualScroll', 'demo/comp/scroll/VirtualScroll', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108216300003330', '1438108200802050050', '基础示例', '/comp/lazy/basic', 'demo/comp/lazy/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108216597798914', '1438108200802050050', '动画效果', '/comp/lazy/transition', 'demo/comp/lazy/Transition', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108216971091969', '1438108200919490562', '拖拽校验', '/comp/verify/drag', 'demo/comp/verify/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108217449242626', '1438108200919490562', '图片还原', '/comp/verify/rotate', 'demo/comp/verify/Rotate', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108217562488834', '1438108187455774722', '图表', '/charts', 'layouts/default/index', 1, NULL, '/charts/echarts/map', 0, NULL, '1', 7, 0, 'ion:bar-chart-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108217860284417', '1438108217562488834', '百度地图', '/charts/baiduMap', 'demo/charts/map/Baidu', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108218049028097', '1438108217562488834', '高德地图', '/charts/aMap', 'demo/charts/map/Gaode', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108218409738242', '1438108217562488834', 'Echarts', '/charts/echarts', NULL, 1, NULL, '/charts/echarts/map', 1, NULL, '1', 3, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108218787225601', '1438108218409738242', '地图', '/charts/echarts/map', 'demo/charts/Map', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108219034689538', '1438108218409738242', '折线图', '/charts/echarts/line', 'demo/charts/Line', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108219240210434', '1438108218409738242', '饼图', '/charts/echarts/pie', 'demo/charts/Pie', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108219445731330', '1438108187455774722', '外部页面', '/frame', 'layouts/default/index', 1, NULL, '/frame/doc', 0, NULL, '1', 8, 0, 'ion:tv-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108219592531970', '1438108219445731330', '项目文档(内嵌)', '/frame/doc', 'http://vue3.jeecg.com', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-11-15 17:59:32', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108219793858561', '1438108219445731330', 'antVue文档(内嵌)', '/frame/antv', 'https://2x.antdv.com/docs/vue/introduce-cn', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-11-11 17:11:10', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108220137791489', '1438108219445731330', '项目文档(外链)', '/', 'http://vue3.jeecg.com/', 1, NULL, NULL, 1, NULL, '1', 2, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-10-25 13:46:59', 0, 0, '1', 1); +INSERT INTO `sys_permission3` VALUES ('1438108220418809857', '1438108187455774722', '多级菜单', '/level', 'layouts/default/index', 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 0, NULL, '1', 9, 0, 'ion:menu-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108220523667458', '1438108220418809857', 'Menu1', '/level/menu1', NULL, 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 1, NULL, '1', 0, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108220724994049', '1438108220418809857', 'Menu2', '/level/menu2', 'demo/level/Menu2', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108220896960513', '1438108220523667458', 'Menu1-1', '/level/menu1/menu1-1', NULL, 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 1, NULL, '1', 0, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108221127647234', '1438108220896960513', 'Menu1-1-1', '/level/menu1/menu1-1/menu1-1-1', 'demo/level/Menu111', 1, NULL, NULL, 1, NULL, '1', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108221270253570', '1438108220523667458', 'Menu1-2', '/level/menu1/menu1-2', 'demo/level/Menu12', 1, NULL, NULL, 1, NULL, '1', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108221551271937', '', 'Mock示例', '/system', 'layouts/default/index', 1, NULL, '/system/account', 0, NULL, '1', 10, 0, 'ion:settings-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108221849067522', '1438108221551271937', '测试功能', '/system/test', 'demo/system/test/index', 1, NULL, NULL, 1, NULL, '1', 0, 0, 'ant-design:bulb-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:55:36', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108222218166273', '1438108221551271937', '账号管理', '/system/account', 'demo/system/account/index', 1, NULL, NULL, 1, NULL, '1', 1, 0, 'ant-design:user-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:55:46', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108222721482753', '1438108221551271937', '账号详情', '/system/account_detail/:id', 'demo/system/account/AccountDetail', 1, NULL, NULL, 1, NULL, '1', 2, 0, 'ant-design:idcard-twotone', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:12', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108223489040385', '1438108221551271937', '部门管理', '/system/dept', 'demo/system/dept/index', 1, NULL, NULL, 1, NULL, '1', 5, 0, 'ant-design:usergroup-add-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:34', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108223661006850', '1438108221551271937', '修改密码', '/system/changePassword', 'demo/system/password/index', 1, NULL, NULL, 1, NULL, '1', 6, 0, 'ant-design:field-number-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:46', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108225263230978', '1438108178010202113', '引导页', '/setup/index', 'demo/setup/index', 1, NULL, NULL, 1, NULL, '1', 12, 0, 'whh:paintroll', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 09:02:19', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438108225451974658', '', '关于', '/about/index', 'sys/about/index', 1, NULL, NULL, 0, NULL, '1', 13, 0, 'simple-icons:about-dot-me', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438115924159881218', '1438108183395688450', 'Tab带参1', '/testTab/id1', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '0', 0, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 20:22:10', 'admin', '2021-09-16 14:38:32', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438116003012796418', '1438108183395688450', 'Tab带参2', '/feat/testTab/id2', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 20:22:29', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1438469604861403137', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '职务管理', '/system/position', 'system/position/index', 1, NULL, NULL, 1, NULL, '0', 5, 0, 'ant-design:database-filled', 1, 0, 0, NULL, NULL, 'admin', '2021-09-16 19:47:33', 'admin', '2021-09-17 15:58:22', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1438782530717495298', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '分类字典', '/system/category', 'system/category/index', 1, NULL, NULL, 1, NULL, '0', 9, 0, 'ant-design:group-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-17 16:31:01', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1438782641187074050', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/system/dict', 'system/dict/index', 1, NULL, NULL, 1, NULL, '0', 10, 0, 'ant-design:hdd-twotone', 1, 0, 0, NULL, NULL, 'admin', '2021-09-17 16:31:27', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1438782851980210178', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '通知公告', '/system/notice', 'system/notice/index', 1, NULL, NULL, 1, NULL, '0', 8, 0, 'ant-design:bell-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-17 16:32:17', 'admin', '2021-09-17 16:36:15', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1438783058792951810', '1438108197958311537', '单表示例', '/system/examples/demo', 'system/examples/demo/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-17 16:33:07', 'admin', '2021-12-08 14:10:47', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439398677984878593', '', '系统监控', '/monitor', 'layouts/RouteView', 1, NULL, NULL, 0, NULL, '0', 3, 0, 'ant-design:video-camera-filled', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 09:19:22', 'admin', '2021-11-15 18:21:14', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439399179791409153', '1439398677984878593', '网关路由', '/monitor/route', 'monitor/route/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, 'ant-design:branches-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 09:21:21', 'admin', '2021-09-19 09:26:42', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439488251473993730', '1439398677984878593', '定时任务', '/monitor/quartz', 'monitor/quartz/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, 'ant-design:history-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 15:15:18', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439511654494937090', '1439398677984878593', '数据源管理', '/monitor/datasource', 'monitor/datasource/index', 1, NULL, NULL, 1, NULL, '0', 3, 0, 'ant-design:hdd-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 16:48:17', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439531077792473089', '1439398677984878593', '数据日志', '/monitor/datalog', 'monitor/datalog/index', 1, NULL, NULL, 1, NULL, '0', 4, 0, 'ant-design:funnel-plot-twotone', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 18:05:28', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439533711676973057', '1439398677984878593', '日志管理', '/monitor/log', 'monitor/log/index', 1, NULL, NULL, 1, NULL, '0', 5, 0, 'ant-design:interaction-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 18:15:56', 'admin', '2021-09-19 18:16:56', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439542701152575489', '1443390062919208961', '我的消息', '/monitor/mynews', 'monitor/mynews/index', 1, NULL, NULL, 1, NULL, '0', 6, 0, 'ant-design:wechat-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 18:51:40', 'admin', '2021-09-19 18:53:23', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439784356766064642', '1439398677984878593', 'SQL监控', '/monitor/druid', '{{ window._CONFIG[\'domianURL\'] }}/druid', 1, NULL, NULL, 1, NULL, '0', 8, 0, 'ant-design:rocket-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 10:51:55', 'admin', '2021-11-15 18:21:20', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439797053314342913', '1439398677984878593', '性能监控', '/monitor/server', 'monitor/server/index', 1, NULL, NULL, 1, NULL, '0', 9, 0, 'ant-design:thunderbolt-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 11:42:22', 'admin', '2021-09-20 14:13:14', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439839507094740994', '1439398677984878593', 'Redis监控', '/monitor/redis', 'monitor/redis/index', 1, NULL, NULL, 1, NULL, '0', 10, 0, 'ant-design:trademark-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 14:31:04', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1439842640030113793', '1439398677984878593', '请求追踪', '/monitor/trace', 'monitor/trace/index', 1, NULL, NULL, 1, NULL, '0', 11, 0, 'ant-design:ie-circle-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 14:43:31', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1441340399835742209', '1438108197958311537', '打印示例', '/jeecg/PrintDemo', 'demo/jeecg/PrintDemo', 1, NULL, NULL, 1, NULL, '0', 7, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 17:55:05', 'admin', '2021-09-24 17:55:20', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1441357157443371009', '1438108197958311537', '表格合计', '/jeecg/tableTotal', 'demo/jeecg/TableTotal', 1, NULL, NULL, 1, NULL, '0', 8, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 19:01:40', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1441361249200832513', '1438108197958311537', '异步树表格', '/jeecg/AsyncTreeTable', 'demo/jeecg/AsyncTreeTable', 1, NULL, NULL, 1, NULL, '0', 9, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 19:17:56', 'admin', '2021-09-26 16:05:55', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1442055284830769154', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '对象存储', '/system/ossfile', 'system/ossfile/index', 1, NULL, NULL, 1, NULL, '0', 11, 0, 'ant-design:file-add-outlined', 1, 0, 0, 0, NULL, 'jeecg', '2021-09-26 17:15:47', 'jeecg', '2021-09-26 17:18:01', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1443390062919208961', '', '消息中心', '/message', 'layouts/default/index', 1, NULL, '/message/manage', 0, NULL, '0', 4, 0, 'ant-design:message-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-30 09:39:43', 'admin', '2021-11-18 10:47:28', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1443391428723003394', '1443390062919208961', '消息管理', '/message/manage', 'system/message/manage/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-30 09:45:08', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1443391584864358402', '1443390062919208961', '消息模板管理', '/message/template', 'system/message/template/index', 1, NULL, NULL, 1, NULL, '0', 2, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-30 09:45:45', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1446778415130722306', '1438108219445731330', 'JEECG官网', '/', 'http://www.jeecg.com', 0, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-09 18:03:49', 'admin', '2021-11-15 18:01:26', 0, 0, NULL, 1); +INSERT INTO `sys_permission3` VALUES ('1447535997560909826', '1438108197270446081', '禁用', NULL, NULL, 0, NULL, NULL, 2, 'demo.dbarray', '2', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-11 20:14:10', 'admin', '2021-10-11 20:18:48', 0, 0, '1', 0); +INSERT INTO `sys_permission3` VALUES ('1447763172274495489', '', '统计报表', '/report', 'layouts/default/index', 1, NULL, NULL, 0, NULL, '0', 7, 0, 'ant-design:bar-chart-outlined', 0, 0, 0, 0, NULL, 'jeecg', '2021-10-12 11:16:53', 'jeecg', '2021-10-12 11:17:05', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1447763517847396354', '1447763172274495489', 'EChartDemo', '/report/chartDemo', 'report/chartdemo/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-12 11:18:15', 'jeecg', '2021-10-14 14:36:38', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1448252726202859522', '1447763172274495489', '布局统计报表', '/statisticst', 'report/statisticst/index', 1, NULL, NULL, 1, NULL, '0', 2, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-13 19:42:12', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1450308897429536769', '1438108197958311537', 'JVxeTable示例', '/jeecg/j-vxe-table-demo', 'demo/jeecg/JVxeTableDemo/index', 1, NULL, NULL, 1, NULL, '0', 10, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2021-10-19 11:52:41', 'admin', '2021-10-19 11:54:46', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1452508868884353026', '1456520526287917057', '报表设计', '/report', '{{ window._CONFIG[\'domianURL\'] }}/jmreport/list?token=${token}', 1, NULL, NULL, 1, NULL, '0', 1, 0, 'ant-design:radar-chart-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-10-25 13:34:35', 'admin', '2021-11-05 15:19:33', 0, 0, '1', 1); +INSERT INTO `sys_permission3` VALUES ('1453250018282573826', '1438108197958311537', '一对多内嵌', '/innerTable', 'demo/jeecg/InnerExpandTable', 1, NULL, NULL, 1, NULL, '0', 12, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-27 14:39:39', 'admin', '2021-10-27 14:40:29', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1454031324835807233', '1450308897429536769', '综合示例', '/jeecg/j-vxe-table-demo/normal', 'demo/jeecg/JVxeTableDemo/index', 1, NULL, NULL, 1, NULL, '0', 1, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:24:17', 'admin', '2021-10-29 18:25:28', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1454031820661260289', '1450308897429536769', '即时保存', '/jeecg/j-vxe-table-demo/jsbc', 'demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo', 1, NULL, NULL, 1, NULL, '0', 2, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:26:15', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1454034512171302914', '1450308897429536769', '无痕刷新', '/jeecg/j-vxe-table-demo/whsx', 'demo/jeecg/JVxeTableDemo/func-demo/SocketReload', 1, NULL, NULL, 1, NULL, '0', 3, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:36:57', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1455019819440021505', '1450308897429536769', '弹出子表', '/jeecg/j-vxe-table-demo/tczb', 'demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable', 1, NULL, NULL, 1, NULL, '0', 4, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-01 11:52:13', 'admin', '2021-11-01 11:52:19', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1455067599277662209', '1450308897429536769', '布局模板', '/jeecg/j-vxe-table-demo/layout', 'demo/jeecg/JVxeTableDemo/layout-demo/index', 1, NULL, NULL, 1, NULL, '0', 5, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-01 15:02:04', NULL, NULL, 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1455735714507472898', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '通讯录', '/address', 'system/address/index', 1, NULL, NULL, 1, NULL, '0', 10, 0, 'ant-design:book-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-11-03 11:16:55', 'admin', '2021-11-04 19:40:19', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1456520526287917057', '', '报表设计', '/report', 'layouts/default/index', 1, NULL, NULL, 0, NULL, '0', 4, 0, 'ant-design:project-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-11-05 15:15:28', 'admin', '2021-11-05 15:17:33', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1458389305235984385', '1438108197958311537', '一对多ERP', '/erplist', 'demo/jeecg/erplist/index', 1, NULL, NULL, 1, NULL, '0', 11, 0, '', 1, 0, 0, 0, NULL, 'admin', '2021-11-10 19:01:21', 'admin', '2021-11-30 14:06:53', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('190c2b43bec6a5f7a4194a85db67d96a', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '角色管理', '/system/role', 'system/role/index', 1, NULL, NULL, 1, NULL, NULL, 2, 0, 'ant-design:solution', 1, 1, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-09-17 15:58:00', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('1a0811914300741f4e11838ff37a1d3a', '3f915b2769fc80648e92d04e84ca059d', '手机号禁用', '', '', 0, NULL, NULL, 2, 'user:form:phone', '2', 1, 0, NULL, 1, NULL, 0, NULL, NULL, 'admin', '2019-05-11 17:19:30', 'admin', '2019-05-11 18:00:22', 0, 0, '1', NULL); +INSERT INTO `sys_permission3` VALUES ('3f915b2769fc80648e92d04e84ca059d', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户管理', '/system/user', 'system/user/index', 1, NULL, NULL, 1, NULL, NULL, 1, 0, 'ant-design:user', 0, 1, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'sunjianlei', '2021-05-08 09:57:31', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/system/depart', 'system/depart/index', 1, NULL, NULL, 1, NULL, NULL, 3, 0, 'ant-design:team', 1, 0, 0, NULL, NULL, 'admin', '2019-01-29 18:47:40', 'admin', '2021-09-17 15:58:13', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('5c2f42277948043026b7a14692456828', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '我的部门', '/system/depart-user', 'system/departUser/index', 1, NULL, NULL, 1, NULL, NULL, 4, 0, 'ant-design:home-outlined', 1, 0, 0, NULL, NULL, 'admin', '2019-04-17 15:12:24', 'admin', '2021-09-17 15:58:41', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('9502685863ab87f0ad1134142788a385', '1438108176273760258', '首页', '/dashboard/analysis', 'dashboard/Analysis', 1, NULL, NULL, 1, NULL, NULL, 1, 0, 'ant-design:bank-filled', 1, 1, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-09-17 15:43:16', 0, 0, NULL, 0); +INSERT INTO `sys_permission3` VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', '', '系统管理', '/isystem', 'layouts/RouteView', 1, NULL, NULL, 0, NULL, NULL, 2, 0, 'ant-design:setting', 0, 0, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2020-01-07 11:00:45', 0, 0, NULL, 0); + -- ---------------------------- -- Table structure for sys_permission_data_rule -- ---------------------------- @@ -6550,10 +6864,29 @@ CREATE TABLE `sys_role` ( -- ---------------------------- INSERT INTO `sys_role` VALUES ('1169504891467464705', '第三方登录角色', 'third_role', '第三方登录角色', 'admin', '2019-09-05 14:57:49', 'admin', '2020-05-02 18:20:58'); INSERT INTO `sys_role` VALUES ('1260924539346472962', '财务出纳', 'caiwu', NULL, 'admin', '2020-05-14 21:26:52', NULL, NULL); +INSERT INTO `sys_role` VALUES ('1501570619841810433', 'Vue3角色', 'vue3', NULL, 'admin', '2022-03-09 22:48:28', NULL, NULL); INSERT INTO `sys_role` VALUES ('e51758fa916c881624b046d26bd09230', '人力资源部', 'hr', NULL, 'admin', '2019-01-21 18:07:24', 'admin', '2019-10-18 11:39:43'); INSERT INTO `sys_role` VALUES ('ee8626f80f7c2619917b6236f3a7f02b', '临时角色', 'test', '这是新建的临时角色123', NULL, '2018-12-20 10:59:04', 'admin', '2019-02-19 15:08:37'); INSERT INTO `sys_role` VALUES ('f6817f48af4fb3af11b9e8bf182f618b', '管理员', 'admin', '管理员', NULL, '2018-12-21 18:03:39', 'admin', '2019-05-20 11:40:26'); +-- ---------------------------- +-- Table structure for sys_role_index +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_index`; +CREATE TABLE `sys_role_index` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `role_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色编码', + `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由地址', + `priority` int(11) NULL DEFAULT 0 COMMENT '优先级', + `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0:无效 1:有效', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色首页表' ROW_FORMAT = Dynamic; + -- ---------------------------- -- Table structure for sys_role_permission -- ---------------------------- @@ -6676,6 +7009,223 @@ INSERT INTO `sys_role_permission` VALUES ('1427184776023248898', 'ee8626f80f7c26 INSERT INTO `sys_role_permission` VALUES ('1427184776023248899', 'ee8626f80f7c2619917b6236f3a7f02b', 'e1979bb53e9ea51cecc74d86fd9d2f64', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1'); INSERT INTO `sys_role_permission` VALUES ('145eac8dd88eddbd4ce0a800ab40a92c', 'e51758fa916c881624b046d26bd09230', '08e6b9dc3c04489c8e1ff2ce6f105aa4', NULL, NULL, NULL); INSERT INTO `sys_role_permission` VALUES ('1496429874513534978', 'f6817f48af4fb3af11b9e8bf182f618b', '1494641317580423169', NULL, '2022-02-23 18:20:59', '0:0:0:0:0:0:0:1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988789567490', '1501570619841810433', '1438108176273760258', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988802150402', '1501570619841810433', '1438108176814825473', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988810539010', '1501570619841810433', '9502685863ab87f0ad1134142788a385', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988814733313', '1501570619841810433', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988814733314', '1501570619841810433', '3f915b2769fc80648e92d04e84ca059d', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988823121922', '1501570619841810433', '1214376304951664642', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988823121923', '1501570619841810433', '1214462306546319362', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510529', '1501570619841810433', '1a0811914300741f4e11838ff37a1d3a', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510530', '1501570619841810433', '190c2b43bec6a5f7a4194a85db67d96a', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510531', '1501570619841810433', '1170592628746878978', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510532', '1501570619841810433', '45c966826eeff4c99b8f8ebfe74511fc', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510533', '1501570619841810433', '5c2f42277948043026b7a14692456828', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988831510534', '1501570619841810433', '1438782851980210178', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988839899138', '1501570619841810433', '1438782530717495298', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988839899139', '1501570619841810433', '1438782641187074050', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988839899140', '1501570619841810433', '1455735714507472898', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093442', '1501570619841810433', '1442055284830769154', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093443', '1501570619841810433', '1280350452934307841', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093444', '1501570619841810433', '1439398677984878593', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093445', '1501570619841810433', '1439399179791409153', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093446', '1501570619841810433', '1439488251473993730', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988844093447', '1501570619841810433', '1438469604861403137', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988852482050', '1501570619841810433', '1439511654494937090', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988856676354', '1501570619841810433', '1439531077792473089', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988856676355', '1501570619841810433', '1439533711676973057', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988860870657', '1501570619841810433', '1439784356766064642', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988860870658', '1501570619841810433', '1439797053314342913', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988860870659', '1501570619841810433', '1439839507094740994', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988869259265', '1501570619841810433', '1439842640030113793', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988869259267', '1501570619841810433', '1439542701152575489', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988869259268', '1501570619841810433', '1456520526287917057', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988869259269', '1501570619841810433', '1452508868884353026', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453570', '1501570619841810433', '1447763172274495489', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453571', '1501570619841810433', '1447763517847396354', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453573', '1501570619841810433', '1448252726202859522', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453574', '1501570619841810433', '1438108196993622018', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453575', '1501570619841810433', '1438108197958311537', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453576', '1501570619841810433', '1438108197270446081', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453577', '1501570619841810433', '1447535997560909826', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988873453578', '1501570619841810433', '1438783058792951810', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842177', '1501570619841810433', '1438108198679732226', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842178', '1501570619841810433', '1441340399835742209', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842179', '1501570619841810433', '1441357157443371009', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842180', '1501570619841810433', '1453250018282573826', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842181', '1501570619841810433', '1458389305235984385', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988881842182', '1501570619841810433', '1455067599277662209', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988890230785', '1501570619841810433', '1455019819440021505', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988890230786', '1501570619841810433', '1454034512171302914', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988890230787', '1501570619841810433', '1454031820661260289', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988898619394', '1501570619841810433', '1454031324835807233', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988898619395', '1501570619841810433', '1450308897429536769', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988898619396', '1501570619841810433', '1441361249200832513', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988907008001', '1501570619841810433', '1438108197958315557', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988907008002', '1501570619841810433', '1438108178127642626', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988907008003', '1501570619841810433', '1438108178781954049', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988907008004', '1501570619841810433', '1438108178781954050', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988907008005', '1501570619841810433', '1438108200672026626', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202306', '1501570619841810433', '1438108180258349057', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202307', '1501570619841810433', '1438108197790539778', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202308', '1501570619841810433', '1438108197958311937', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202309', '1501570619841810433', '1438108202366525441', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202310', '1501570619841810433', '1438108203649982466', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202311', '1501570619841810433', '1438108204400762881', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202312', '1501570619841810433', '1438108204576923649', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202313', '1501570619841810433', '1438108204732112898', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988911202314', '1501570619841810433', '1438108198113501186', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988919590914', '1501570619841810433', '1438108204232990721', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988919590915', '1501570619841810433', '1438108204023275521', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501570988919590916', '1501570619841810433', '1438108203817754625', NULL, '2022-03-09 22:49:56', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577222', '1501570619841810433', '1438108205004742657', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577223', '1501570619841810433', '1438108205180903426', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577224', '1501570619841810433', '1438108205357064193', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577225', '1501570619841810433', '1438108205587750914', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577226', '1501570619841810433', '1438108205742940161', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577227', '1501570619841810433', '1438108205919100930', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514077577228', '1501570619841810433', '1438108206086873089', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965825', '1501570619841810433', '1438108206258839553', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965826', '1501570619841810433', '1438108206489526274', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965827', '1501570619841810433', '1438108206661492738', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965828', '1501570619841810433', '1438108206959288321', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965829', '1501570619841810433', '1438108207160614913', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965830', '1501570619841810433', '1438108207374524418', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965831', '1501570619841810433', '1438108207563268097', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965832', '1501570619841810433', '1438108207793954818', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965833', '1501570619841810433', '1438108208024641538', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514085965834', '1501570619841810433', '1438108208297271297', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514094354434', '1501570619841810433', '1438108199413735425', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514094354435', '1501570619841810433', '1438108208817364993', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514094354436', '1501570619841810433', '1438108208980942850', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514094354437', '1501570619841810433', '1438108209228406785', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514094354438', '1501570619841810433', '1438108199539564546', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548738', '1501570619841810433', '1438108210117599234', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548739', '1501570619841810433', '1438108210260205570', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548740', '1501570619841810433', '1438108211325558785', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548741', '1501570619841810433', '1438108211661103106', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548742', '1501570619841810433', '1438108211778543618', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548743', '1501570619841810433', '1438108214882328577', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548744', '1501570619841810433', '1438108215335313409', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548745', '1501570619841810433', '1438108197958311637', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548746', '1501570619841810433', '1438108200076435458', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548747', '1501570619841810433', '1438108200391008257', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548748', '1501570619841810433', '1438108197958311677', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548749', '1501570619841810433', '1438108178643542017', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548750', '1501570619841810433', '1438108179226550273', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514098548751', '1501570619841810433', '1438108179381739521', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937345', '1501570619841810433', '1438108198855892993', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937346', '1501570619841810433', '1438108179599843330', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937347', '1501570619841810433', '1438108199120134145', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937348', '1501570619841810433', '1438108179910221825', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937349', '1501570619841810433', '1438108198339993602', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937350', '1501570619841810433', '1438108199304683521', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937351', '1501570619841810433', '1438108180077993985', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937352', '1501570619841810433', '1438108180434509826', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937353', '1501570619841810433', '1438108180631642113', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937354', '1501570619841810433', '1438108182116425729', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937355', '1501570619841810433', '1438108201150177281', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937356', '1501570619841810433', '1438108201502498817', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937357', '1501570619841810433', '1438108201712214018', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514106937358', '1501570619841810433', '1438108202060341249', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325954', '1501570619841810433', '1438108199631839234', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325955', '1501570619841810433', '1438108215511474177', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325956', '1501570619841810433', '1438108215687634945', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325957', '1501570619841810433', '1438108215989624834', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325958', '1501570619841810433', '1438108200802050050', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325959', '1501570619841810433', '1438108216300003330', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325960', '1501570619841810433', '1438108216597798914', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325961', '1501570619841810433', '1438108200919490562', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325962', '1501570619841810433', '1438108216971091969', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325963', '1501570619841810433', '1438108217449242626', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325964', '1501570619841810433', '1438108183219527682', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514115325965', '1501570619841810433', '1438108185660612609', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714561', '1501570619841810433', '1438108185815801858', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714562', '1501570619841810433', '1438108185958408193', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714563', '1501570619841810433', '1438108186289758209', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714564', '1501570619841810433', '1438108178010202113', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714565', '1501570619841810433', '1438108178257666049', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714566', '1501570619841810433', '1438108176932265985', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714567', '1501570619841810433', '1438108177074872321', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714568', '1501570619841810433', '1438108177351696386', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714569', '1501570619841810433', '1438108177565605889', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714570', '1501570619841810433', '1438108177188118529', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714571', '1501570619841810433', '1438108177720795137', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714572', '1501570619841810433', '1438108177880178689', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714573', '1501570619841810433', '1438108178421243905', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714574', '1501570619841810433', '1438108225263230978', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514123714575', '1501570619841810433', '1438108180770054145', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514132103169', '1501570619841810433', '1438108183085309954', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501572514165657602', '1501570619841810433', '1438108225451974658', NULL, '2022-03-09 22:56:00', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194927464450', '1501570619841810433', '1438108187455774722', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194935853057', '1501570619841810433', '1438108187678072833', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194935853058', '1501570619841810433', '1438108189062193153', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194935853059', '1501570619841810433', '1438108189427097601', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047361', '1501570619841810433', '1438108189754253313', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047362', '1501570619841810433', '1438108187871010818', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047363', '1501570619841810433', '1438108190110769154', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047364', '1501570619841810433', '1438108190404370433', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047365', '1501570619841810433', '1438108188034588674', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047366', '1501570619841810433', '1438108190777663490', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047367', '1501570619841810433', '1438108191356477442', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047368', '1501570619841810433', '1438108188378521602', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047369', '1501570619841810433', '1438108192623157249', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047370', '1501570619841810433', '1438108193701093378', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047371', '1501570619841810433', '1438108188542099458', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047372', '1501570619841810433', '1438108194992939010', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047373', '1501570619841810433', '1438108195307511809', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047374', '1501570619841810433', '1438108195487866881', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047375', '1501570619841810433', '1438108195638861825', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047376', '1501570619841810433', '1438108195924074497', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194940047377', '1501570619841810433', '1438108178911977473', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435969', '1501570619841810433', '1438108183630569474', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435970', '1501570619841810433', '1438108183630569477', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435971', '1501570619841810433', '1438108183907393538', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435972', '1501570619841810433', '1438108184049999873', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435973', '1501570619841810433', '1438108188714065922', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435974', '1501570619841810433', '1438108196263813121', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194948435975', '1501570619841810433', '1438108196528054273', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630273', '1501570619841810433', '1438108196855209985', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630274', '1501570619841810433', '1438108217562488834', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630275', '1501570619841810433', '1438108217860284417', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630276', '1501570619841810433', '1438108218049028097', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630277', '1501570619841810433', '1438108218409738242', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630278', '1501570619841810433', '1438108218787225601', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630279', '1501570619841810433', '1438108219034689538', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630280', '1501570619841810433', '1438108219240210434', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630281', '1501570619841810433', '1438108219445731330', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630282', '1501570619841810433', '1438108219592531970', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194952630283', '1501570619841810433', '1438108219793858561', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194961018881', '1501570619841810433', '1446778415130722306', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194961018882', '1501570619841810433', '1438108220137791489', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194961018883', '1501570619841810433', '1438108220418809857', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194961018884', '1501570619841810433', '1438108220523667458', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194961018885', '1501570619841810433', '1438108220896960513', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213185', '1501570619841810433', '1438108221127647234', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213186', '1501570619841810433', '1438108221270253570', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213187', '1501570619841810433', '1438108220724994049', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213188', '1501570619841810433', '1438108183395688450', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213189', '1501570619841810433', '1438115924159881218', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213190', '1501570619841810433', '1438116003012796418', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213191', '1501570619841810433', '1438108183492157442', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213192', '1501570619841810433', '1438108186717577217', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576194965213193', '1501570619841810433', '1438108187103453186', NULL, '2022-03-09 23:10:37', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319401824258', '1501570619841810433', '1443390062919208961', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212866', '1501570619841810433', '1438108223661006850', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212867', '1501570619841810433', '1438108223489040385', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212868', '1501570619841810433', '1449995470942593026', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212869', '1501570619841810433', '1438108222218166273', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212870', '1501570619841810433', '1438108221849067522', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212871', '1501570619841810433', '1438108221551271937', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576319410212872', '1501570619841810433', '1438108222721482753', NULL, '2022-03-09 23:11:07', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328692207617', '1501570619841810433', '1443390062919208961', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328700596226', '1501570619841810433', '1438108223661006850', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328700596227', '1501570619841810433', '1438108223489040385', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328700596228', '1501570619841810433', '1449995470942593026', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328700596229', '1501570619841810433', '1438108222218166273', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328700596230', '1501570619841810433', '1438108221849067522', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328708984833', '1501570619841810433', '1438108221551271937', NULL, '2022-03-09 23:11:09', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1501576328708984834', '1501570619841810433', '1438108222721482753', NULL, '2022-03-09 23:11:09', '127.0.0.1'); INSERT INTO `sys_role_permission` VALUES ('154edd0599bd1dc2c7de220b489cd1e2', 'f6817f48af4fb3af11b9e8bf182f618b', '7ac9eb9ccbde2f7a033cd4944272bf1e', NULL, NULL, NULL); INSERT INTO `sys_role_permission` VALUES ('165acd6046a0eaf975099f46a3c898ea', 'f6817f48af4fb3af11b9e8bf182f618b', '4f66409ef3bbd69c1d80469d6e2a885e', NULL, NULL, NULL); INSERT INTO `sys_role_permission` VALUES ('1664b92dff13e1575e3a929caa2fa14d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd2bbf9ebca5a8fa2e227af97d2da7548', NULL, NULL, NULL); @@ -7157,8 +7707,8 @@ CREATE TABLE `sys_user` ( -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('3d464b4ea0d2491aab8a7bde74c57e95', 'zhangsan', '张三', '02ea098224c7d0d2077c14b9a3a1ed16', 'x5xRdeKB', 'https://static.jeecg.com/temp/jmlogo_1606575041993.png', NULL, NULL, NULL, NULL, '财务部', 1, 0, NULL, NULL, 1, '0005', '总经理', NULL, 'admin', '2020-05-14 21:26:24', 'admin', '2020-09-09 14:42:51', 1, '', '', NULL); -INSERT INTO `sys_user` VALUES ('a75d45a015c44384a04449ee80dc3503', 'jeecg', 'jeecg', '58a714412072f0b9', 'mIgiYJow', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', NULL, 1, NULL, NULL, 'A02A01', 1, 0, NULL, NULL, 1, '00002', 'devleader', NULL, 'admin', '2019-02-13 16:02:36', 'admin', '2020-11-26 15:16:05', 1, '', NULL, NULL); -INSERT INTO `sys_user` VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', '2018-12-05 00:00:00', 1, 'jeecg@163.com', '18611111111', 'A01', 1, 0, NULL, NULL, 1, '00001', '总经理', NULL, NULL, '2019-06-21 17:54:10', 'admin', '2020-07-10 15:27:10', 2, 'c6d7cb4deeac411cb3384b1b31278596', '', NULL); +INSERT INTO `sys_user` VALUES ('a75d45a015c44384a04449ee80dc3503', 'jeecg', 'jeecg', 'eee378a1258530cb', 'mIgiYJow', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', NULL, 1, NULL, NULL, 'A02A01', 1, 0, NULL, NULL, 1, '00002', 'devleader', NULL, 'admin', '2019-02-13 16:02:36', 'jeecg', '2022-03-09 23:03:21', 1, '', NULL, NULL); +INSERT INTO `sys_user` VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', '2018-12-05 00:00:00', 1, 'jeecg@163.com', '18611111111', 'A01', 1, 0, NULL, NULL, 1, '00001', '总经理', NULL, NULL, '2019-06-21 17:54:10', 'admin', '2022-03-09 22:50:20', 2, 'c6d7cb4deeac411cb3384b1b31278596', '', NULL); INSERT INTO `sys_user` VALUES ('f0019fdebedb443c98dcb17d88222c38', 'zhagnxiao', '张小红', 'f898134e5e52ae11a2ffb2c3b57a4e90', 'go3jJ4zX', 'https://static.jeecg.com/temp/jmlogo_1606575041993.png', '2019-04-01 00:00:00', NULL, NULL, NULL, '研发部,财务部', 2, 0, NULL, NULL, 1, '00003', '', NULL, 'admin', '2020-10-01 19:34:10', 'admin', '2020-11-26 15:24:59', 1, '', '', NULL); -- ---------------------------- @@ -7207,7 +7757,7 @@ CREATE TABLE `sys_user_depart` ( INSERT INTO `sys_user_depart` VALUES ('1303584634328633345', '3d464b4ea0d2491aab8a7bde74c57e95', 'a7d7e77e06c84325a40932163adcdaa6'); INSERT INTO `sys_user_depart` VALUES ('1256487210695356418', 'a75d45a015c44384a04449ee80dc3503', 'a7d7e77e06c84325a40932163adcdaa6'); INSERT INTO `sys_user_depart` VALUES ('1f3a0267811327b9eca86b0cc2b956f3', 'bcbe1290783a469a83ae3bd8effe15d4', '5159cde220114246b045e574adceafe9'); -INSERT INTO `sys_user_depart` VALUES ('1281490128540393474', 'e9ca23d68d884d4ebb19d07889727dae', 'c6d7cb4deeac411cb3384b1b31278596'); +INSERT INTO `sys_user_depart` VALUES ('1501571088332984321', 'e9ca23d68d884d4ebb19d07889727dae', 'c6d7cb4deeac411cb3384b1b31278596'); INSERT INTO `sys_user_depart` VALUES ('1303623812558958593', 'f0019fdebedb443c98dcb17d88222c38', '57197590443c44f083d42ae24ef26a2c'); INSERT INTO `sys_user_depart` VALUES ('1303623812588318722', 'f0019fdebedb443c98dcb17d88222c38', '67fc001af12a4f9b8458005d3f19934a'); @@ -7241,7 +7791,8 @@ INSERT INTO `sys_user_role` VALUES ('31af310584bd5795f76b1fe8c38294a0', '70f5dcf INSERT INTO `sys_user_role` VALUES ('8d7846ec783e157174e4ce2949231a65', '7ee6630e89d17afbf6d12150197b578d', 'e51758fa916c881624b046d26bd09230'); INSERT INTO `sys_user_role` VALUES ('79d66ef7aa137cfa9957081a1483009d', '9a668858c4c74cf5a2b25ad9608ba095', 'ee8626f80f7c2619917b6236f3a7f02b'); INSERT INTO `sys_user_role` VALUES ('1256487210544361473', 'a75d45a015c44384a04449ee80dc3503', 'ee8626f80f7c2619917b6236f3a7f02b'); -INSERT INTO `sys_user_role` VALUES ('1281490128242597889', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); +INSERT INTO `sys_user_role` VALUES ('1501571088286846977', 'e9ca23d68d884d4ebb19d07889727dae', '1501570619841810433'); +INSERT INTO `sys_user_role` VALUES ('1501571088274264066', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); INSERT INTO `sys_user_role` VALUES ('1303623812290523138', 'f0019fdebedb443c98dcb17d88222c38', 'ee8626f80f7c2619917b6236f3a7f02b'); -- ---------------------------- diff --git a/jeecg-boot/db/tables_nacos.sql b/jeecg-boot/db/tables_nacos.sql index 0156f6b4..8bbbfb96 100644 --- a/jeecg-boot/db/tables_nacos.sql +++ b/jeecg-boot/db/tables_nacos.sql @@ -14,7 +14,7 @@ use `nacos`; Target Server Version : 50727 File Encoding : 65001 - Date: 23/02/2022 23:09:19 + Date: 17/04/2022 17:49:41 */ SET NAMES utf8mb4; @@ -43,14 +43,18 @@ CREATE TABLE `config_info` ( `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of config_info -- ---------------------------- -INSERT INTO `config_info` VALUES (1, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '0f0306a72f6bc4ad73d2bc7cd26e3ac7', '2021-03-03 13:01:11', '2022-02-23 11:49:26', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''); -INSERT INTO `config_info` VALUES (2, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n tomcat:\n max-swallow-size: -1\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\" #暴露所有节点\n health:\n sensitive: true #关闭过滤敏感信息\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ## quartz定时任务,采用数据库方式\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n #设置自动启动,默认为 true\n auto-startup: false\n #启动时更新己存在的Job\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.quartz.impl.jdbcjobstore.JobStoreTX\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 60000\n clusterCheckinInterval: 10000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #json 时间戳统一转换\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n #启用作业执行器\n async-executor-activate: false\n #启用异步执行器\n job-executor-activate: false\n jpa:\n open-in-view: false\n #配置freemarker\n freemarker:\n # 设置模板后缀名\n suffix: .ftl\n # 设置文档类型\n content-type: text/html\n # 设置页面编码格式\n charset: UTF-8\n # 设置页面缓存\n cache: false\n prefer-file-system-access: false\n # 设置ftl文件路径\n template-loader-path:\n - classpath:/templates\n # 设置静态文件路径,js,css等\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n#mybatis plus 设置\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\n global-config:\n # 关闭MP3.0自带的banner\n banner: false\n db-config:\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n id-type: ASSIGN_ID\n # 默认数据库表下划线命名\n table-underline: true\n configuration:\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n # 返回类型为Map,显示null对应的字段\n call-setters-on-nulls: true', '411f9c73fc519225add2f7c992279f6f', '2021-03-03 13:01:42', '2021-06-28 07:13:40', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''); +INSERT INTO `config_info` VALUES (1, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '2c0746e66cbde68a15c8f240b00ef47a', '2021-03-03 13:01:11', '2022-04-15 04:59:43', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''); +INSERT INTO `config_info` VALUES (2, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n tomcat:\n max-swallow-size: -1\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\" #暴露所有节点\n health:\n sensitive: true #关闭过滤敏感信息\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ## quartz定时任务,采用数据库方式\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n #设置自动启动,默认为 true\n auto-startup: false\n #启动时更新己存在的Job\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 60000\n clusterCheckinInterval: 10000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #json 时间戳统一转换\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n #启用作业执行器\n async-executor-activate: false\n #启用异步执行器\n job-executor-activate: false\n jpa:\n open-in-view: false\n #配置freemarker\n freemarker:\n # 设置模板后缀名\n suffix: .ftl\n # 设置文档类型\n content-type: text/html\n # 设置页面编码格式\n charset: UTF-8\n # 设置页面缓存\n cache: false\n prefer-file-system-access: false\n # 设置ftl文件路径\n template-loader-path:\n - classpath:/templates\n # 设置静态文件路径,js,css等\n mvc:\n static-path-pattern: /**\n #Spring Boot 2.6+后需手动指定为ant-path-matcher\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n#mybatis plus 设置\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\n global-config:\n # 关闭MP3.0自带的banner\n banner: false\n db-config:\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n id-type: ASSIGN_ID\n # 默认数据库表下划线命名\n table-underline: true\n configuration:\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n # 返回类型为Map,显示null对应的字段\n call-setters-on-nulls: true', '8d5079bd2be1967383be77a1d03b9df3', '2021-03-03 13:01:42', '2022-04-12 15:04:36', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''); INSERT INTO `config_info` VALUES (3, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/jmreport/**\",\n \"_genkey_3\": \"/online/**\",\n \"_genkey_4\": \"/generic/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', 'be6548051d99309d7fa5ac4398404201', '2021-03-03 13:02:14', '2022-02-23 11:49:01', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'json', ''); +INSERT INTO `config_info` VALUES (6, 'jeecg-test.yaml', 'DEFAULT_GROUP', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2022-04-12 13:32:45', '2022-04-12 13:32:45', 'nacos', '192.168.5.106', '', '', NULL, NULL, NULL, 'yaml', NULL); +INSERT INTO `config_info` VALUES (7, 'jeecg-prod.yaml', 'DEFAULT_GROUP', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2022-04-12 13:33:15', '2022-04-12 13:33:15', 'nacos', '192.168.5.106', '', '', NULL, NULL, NULL, 'yaml', NULL); +INSERT INTO `config_info` VALUES (11, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '# 单库分表配置\nspring:\n shardingsphere:\n props:\n sql-show: true\n datasource:\n #添加分库数据源\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n names: ds0\n # 规则配置\n rules:\n sharding:\n # 配置绑定表,每一行为一组\n binding-tables: sys_log\n # 分布式序列算法配置\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n # 分片算法配置\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n # 自定义标准分配算法\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n # 逻辑表名称\n sys_log:\n #配置具体表的数据节点\n actual-data-nodes: ds0.sys_log$->{0..1}\n # 分表策略\n table-strategy:\n standard:\n # 分片算法名称\n sharding-algorithm-name: table-classbased\n # 分片列名称(对应数据库字段)\n sharding-column: log_type', '0e6f4541eb8581313bb568bd947ebc3d', '2022-04-13 03:12:28', '2022-04-13 06:11:31', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''); +INSERT INTO `config_info` VALUES (15, 'jeecg-sharding2.yaml', 'DEFAULT_GROUP', '# 双库分表配置\r\nspring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n username: root\r\n password: root\r\n ds1:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n username: root\r\n password: root\r\n names: ds0,ds1\r\n # 规则配置\r\n rules:\r\n replica-query:\r\n # 负载均衡算法\r\n load-balancers:\r\n round-robin:\r\n type: ROUND_ROBIN\r\n props:\r\n default: 0\r\n data-sources:\r\n prds:\r\n primary-data-source-name: ds0\r\n replica-data-source-names: ds1\r\n load-balancer-name: round_robin\r\n sharding:\r\n # 配置绑定表,每一行为一组,绑定表会提高查询效率\r\n binding-tables:\r\n - sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n # 通过operate_type取模的方式确定数据落在哪个库\r\n database-inline:\r\n type: INLINE\r\n props:\r\n algorithm-expression: ds$->{operate_type % 2}\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\r\n # 分库策略\r\n database-strategy:\r\n standard:\r\n sharding-column: operate_type\r\n sharding-algorithm-name: database-inline\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称\r\n sharding-column: log_type', '257969ade38b413213f56267ab338bb6', '2022-04-13 06:11:11', '2022-04-13 06:11:11', NULL, '0:0:0:0:0:0:0:1', '', '', NULL, NULL, NULL, 'yaml', NULL); -- ---------------------------- -- Table structure for config_info_aggr @@ -169,14 +173,38 @@ CREATE TABLE `his_config_info` ( INDEX `idx_gmt_create`(`gmt_create`) USING BTREE, INDEX `idx_gmt_modified`(`gmt_modified`) USING BTREE, INDEX `idx_did`(`data_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of his_config_info -- ---------------------------- -INSERT INTO `his_config_info` VALUES (7, 19, 'jeecg-dm.yaml', 'DEFAULT_GROUP', '', 'spring:\n jpa:\n database-platform: org.hibernate.dialect.OracleDialect\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n url: jdbc:dm://82.156.197.104:5236/?JEECG&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8\n username: JEECG\n password: 12345679A@\n driver-class-name: dm.jdbc.driver.DmDriver\n\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: NmbOS0yzYhqCSL1GWTyDqZnQDll7fiUf\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '1266e325392e3f264ac50c3df5535dcc', '2010-05-05 00:00:00', '2022-02-17 06:55:07', NULL, '192.168.1.100', 'D', ''); -INSERT INTO `his_config_info` VALUES (3, 20, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/eoa/**\",\n \"_genkey_2\": \"/joa/**\",\n \"_genkey_3\": \"/jmreport/**\",\n \"_genkey_4\": \"/bigscreen/**\",\n \"_genkey_5\": \"/desform/**\",\n \"_genkey_6\": \"/online/**\",\n \"_genkey_8\": \"/act/**\",\n \"_genkey_9\": \"/plug-in/**\",\n \"_genkey_10\": \"/generic/**\",\n \"_genkey_11\": \"/v1/**\",\n \"_genkey_12\": \"/desflow/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/eoaSocket/**\",\n \"_genkey_2\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', 'c9eff51f264ebe266c07ad1c5b6778e2', '2010-05-05 00:00:00', '2022-02-23 11:49:01', NULL, '0:0:0:0:0:0:0:1', 'U', ''); -INSERT INTO `his_config_info` VALUES (1, 21, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: 127.0.0.1\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: 1000002\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '8b05ed4ee8ecbc4e7a4d425190b60273', '2010-05-05 00:00:00', '2022-02-23 11:49:26', NULL, '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (2, 23, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\n tomcat:\n max-swallow-size: -1\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\" #暴露所有节点\n health:\n sensitive: true #关闭过滤敏感信息\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ## quartz定时任务,采用数据库方式\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n #设置自动启动,默认为 true\n auto-startup: false\n #启动时更新己存在的Job\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.quartz.impl.jdbcjobstore.JobStoreTX\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 60000\n clusterCheckinInterval: 10000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #json 时间戳统一转换\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n #启用作业执行器\n async-executor-activate: false\n #启用异步执行器\n job-executor-activate: false\n jpa:\n open-in-view: false\n #配置freemarker\n freemarker:\n # 设置模板后缀名\n suffix: .ftl\n # 设置文档类型\n content-type: text/html\n # 设置页面编码格式\n charset: UTF-8\n # 设置页面缓存\n cache: false\n prefer-file-system-access: false\n # 设置ftl文件路径\n template-loader-path:\n - classpath:/templates\n # 设置静态文件路径,js,css等\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n#mybatis plus 设置\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\n global-config:\n # 关闭MP3.0自带的banner\n banner: false\n db-config:\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n id-type: ASSIGN_ID\n # 默认数据库表下划线命名\n table-underline: true\n configuration:\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n # 返回类型为Map,显示null对应的字段\n call-setters-on-nulls: true', '411f9c73fc519225add2f7c992279f6f', '2010-05-05 00:00:00', '2022-04-12 13:31:15', 'nacos', '192.168.5.106', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 24, 'jeecg-prod.yml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2010-05-05 00:00:00', '2022-04-12 13:32:17', 'nacos', '192.168.5.106', 'I', ''); +INSERT INTO `his_config_info` VALUES (0, 25, 'jeecg-test.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2010-05-05 00:00:00', '2022-04-12 13:32:45', 'nacos', '192.168.5.106', 'I', ''); +INSERT INTO `his_config_info` VALUES (5, 26, 'jeecg-prod.yml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2010-05-05 00:00:00', '2022-04-12 13:32:54', 'nacos', '192.168.5.106', 'D', ''); +INSERT INTO `his_config_info` VALUES (0, 27, 'jeecg-prod.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n allow:\r\n web-stat-filter:\r\n enabled: true\r\n dynamic:\r\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\r\n # 连接池的配置信息\r\n # 初始化大小,最小,最大\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n # 配置获取连接等待超时的时间\r\n maxWait: 60000\r\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\r\n timeBetweenEvictionRunsMillis: 60000\r\n # 配置一个连接在池中最小生存的时间,单位是毫秒\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n # 打开PSCache,并且指定每个连接上PSCache的大小\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\r\n filters: stat,wall,slf4j\r\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n\r\n datasource:\r\n master:\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n # 多数据源配置\r\n #multi-datasource1:\r\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\r\n #username: root\r\n #password: root\r\n #driver-class-name: com.mysql.cj.jdbc.Driver\r\n #redis 配置\r\n redis:\r\n database: 0\r\n host: jeecg-boot-redis\r\n lettuce:\r\n pool:\r\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\r\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\r\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\r\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\r\n shutdown-timeout: 100ms\r\n password:\r\n port: 6379\r\n #rabbitmq配置\r\n rabbitmq:\r\n host: jeecg-boot-rabbitmq\r\n username: guest\r\n password: guest\r\n port: 5672\r\n publisher-confirms: true\r\n publisher-returns: true\r\n virtual-host: /\r\n listener:\r\n simple:\r\n acknowledge-mode: manual\r\n #消费者的最小数量\r\n concurrency: 1\r\n #消费者的最大数量\r\n max-concurrency: 1\r\n #是否支持重试\r\n retry:\r\n enabled: true\r\n#jeecg专用配置\r\nminidao :\r\n base-package: org.jeecg.modules.jmreport.*\r\njeecg :\r\n # 签名密钥串(前后端要一致,正式发布请自行修改)\r\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\r\n # 本地:local\\Minio:minio\\阿里云:alioss\r\n uploadType: local\r\n path :\r\n #文件上传根目录 设置\r\n upload: /opt/upFiles\r\n #webapp文件路径\r\n webapp: /opt/webapp\r\n shiro:\r\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\r\n #阿里云oss存储配置\r\n oss:\r\n endpoint: oss-cn-beijing.aliyuncs.com\r\n accessKey: ??\r\n secretKey: ??\r\n bucketName: jeecgdev\r\n staticDomain: ??\r\n # ElasticSearch 6设置\r\n elasticsearch:\r\n cluster-name: jeecg-ES\r\n cluster-nodes: 127.0.0.1:9200\r\n check-enabled: false\r\n # 表单设计器配置\r\n desform:\r\n # 主题颜色(仅支持 16进制颜色代码)\r\n theme-color: \"#1890ff\"\r\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\r\n upload-type: system\r\n map:\r\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\r\n baidu: ??\r\n # 在线预览文件服务器地址配置\r\n file-view-domain: 127.0.0.1:8012\r\n # minio文件上传\r\n minio:\r\n minio_url: http://minio.jeecg.com\r\n minio_name: ??\r\n minio_pass: ??\r\n bucketName: otatest\r\n #大屏报表参数设置\r\n jmreport:\r\n mode: dev\r\n #是否需要校验token\r\n is_verify_token: false\r\n #必须校验方法\r\n verify_methods: remove,delete,save,add,update\r\n #Wps在线文档\r\n wps:\r\n domain: https://wwo.wps.cn/office/\r\n appid: ??\r\n appsecret: ??\r\n #xxl-job配置\r\n xxljob:\r\n enabled: false\r\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\r\n appname: ${spring.application.name}\r\n accessToken: \'\'\r\n logPath: logs/jeecg/job/jobhandler/\r\n logRetentionDays: 30\r\n #自定义路由配置 yml nacos database\r\n route:\r\n config:\r\n data-id: jeecg-gateway-router\r\n group: DEFAULT_GROUP\r\n data-type: database\r\n #分布式锁配置\r\n redisson:\r\n address: jeecg-boot-redis:6379\r\n password:\r\n type: STANDALONE\r\n enabled: true\r\n#Mybatis输出sql日志\r\nlogging:\r\n level:\r\n org.jeecg.modules.system.mapper : info\r\n#cas单点登录\r\ncas:\r\n prefixUrl: http://localhost:8888/cas\r\n#swagger\r\nknife4j:\r\n #开启生产环境屏蔽\r\n production: false\r\n basic:\r\n enable: false\r\n username: jeecg\r\n password: jeecg1314\r\n\r\n#第三方登录\r\njustauth:\r\n enabled: true\r\n type:\r\n GITHUB:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\r\n WECHAT_ENTERPRISE:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\r\n agent-id: ??\r\n DINGTALK:\r\n client-id: ??\r\n client-secret: ??\r\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\r\n cache:\r\n type: default\r\n prefix: \'demo::\'\r\n timeout: 1h\r\n#第三方APP对接\r\nthird-app:\r\n enabled: false\r\n type:\r\n #企业微信\r\n WECHAT_ENTERPRISE:\r\n enabled: false\r\n #CORP_ID\r\n client-id: ??\r\n #SECRET\r\n client-secret: ??\r\n agent-id: ??\r\n #自建应用秘钥(新版企微需要配置)\r\n # agent-app-secret: ??\r\n #钉钉\r\n DINGTALK:\r\n enabled: false\r\n # appKey\r\n client-id: ??\r\n # appSecret\r\n client-secret: ??\r\n agent-id: ??', '474e76a8eb3fa24450d51870cc1107c6', '2010-05-05 00:00:00', '2022-04-12 13:33:15', 'nacos', '192.168.5.106', 'I', ''); +INSERT INTO `his_config_info` VALUES (1, 28, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', 'd36623a8f4ca17bf79d4343b34664fea', '2010-05-05 00:00:00', '2022-04-12 13:58:36', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (2, 29, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\n tomcat:\n max-swallow-size: -1\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\" #暴露所有节点\n health:\n sensitive: true #关闭过滤敏感信息\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ## quartz定时任务,采用数据库方式\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n #设置自动启动,默认为 true\n auto-startup: false\n #启动时更新己存在的Job\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 60000\n clusterCheckinInterval: 10000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #json 时间戳统一转换\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n #启用作业执行器\n async-executor-activate: false\n #启用异步执行器\n job-executor-activate: false\n jpa:\n open-in-view: false\n #配置freemarker\n freemarker:\n # 设置模板后缀名\n suffix: .ftl\n # 设置文档类型\n content-type: text/html\n # 设置页面编码格式\n charset: UTF-8\n # 设置页面缓存\n cache: false\n prefer-file-system-access: false\n # 设置ftl文件路径\n template-loader-path:\n - classpath:/templates\n # 设置静态文件路径,js,css等\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n#mybatis plus 设置\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\n global-config:\n # 关闭MP3.0自带的banner\n banner: false\n db-config:\n #主键类型 0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n id-type: ASSIGN_ID\n # 默认数据库表下划线命名\n table-underline: true\n configuration:\n # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用\n #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n # 返回类型为Map,显示null对应的字段\n call-setters-on-nulls: true', '3d36513f76f0f6cf5c8b4daa9201e463', '2010-05-05 00:00:00', '2022-04-12 15:04:36', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 30, 'jeecg--sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n #添加分库数据源\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n names: ds0\r\n # 规则配置\r\n rules:\r\n sharding:\r\n # 配置绑定表,每一行为一组\r\n binding-tables: sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n # 自定义标准分配算法\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds0.sys_log$->{0..1}\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称(对应数据库字段)\r\n sharding-column: log_type', '2d98965ca6c093041df0b126357b613b', '2010-05-05 00:00:00', '2022-04-13 03:12:00', NULL, '0:0:0:0:0:0:0:1', 'I', ''); +INSERT INTO `his_config_info` VALUES (10, 31, 'jeecg--sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n #添加分库数据源\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n names: ds0\r\n # 规则配置\r\n rules:\r\n sharding:\r\n # 配置绑定表,每一行为一组\r\n binding-tables: sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n # 自定义标准分配算法\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds0.sys_log$->{0..1}\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称(对应数据库字段)\r\n sharding-column: log_type', '2d98965ca6c093041df0b126357b613b', '2010-05-05 00:00:00', '2022-04-13 03:12:09', NULL, '0:0:0:0:0:0:0:1', 'D', ''); +INSERT INTO `his_config_info` VALUES (0, 32, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n #添加分库数据源\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n names: ds0\r\n # 规则配置\r\n rules:\r\n sharding:\r\n # 配置绑定表,每一行为一组\r\n binding-tables: sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n # 自定义标准分配算法\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds0.sys_log$->{0..1}\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称(对应数据库字段)\r\n sharding-column: log_type', '2d98965ca6c093041df0b126357b613b', '2010-05-05 00:00:00', '2022-04-13 03:12:28', NULL, '0:0:0:0:0:0:0:1', 'I', ''); +INSERT INTO `his_config_info` VALUES (11, 33, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n #添加分库数据源\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n username: root\r\n password: root\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n names: ds0\r\n # 规则配置\r\n rules:\r\n sharding:\r\n # 配置绑定表,每一行为一组\r\n binding-tables: sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n # 自定义标准分配算法\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds0.sys_log$->{0..1}\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称(对应数据库字段)\r\n sharding-column: log_type', '2d98965ca6c093041df0b126357b613b', '2010-05-05 00:00:00', '2022-04-13 03:25:40', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (11, 34, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\n shardingsphere:\n props:\n sql-show: true\n datasource:\n #添加分库数据源\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n names: ds0\n # 规则配置\n rules:\n sharding:\n # 配置绑定表,每一行为一组\n binding-tables: sys_log\n # 分布式序列算法配置\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n # 分片算法配置\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n # 自定义标准分配算法\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n # 逻辑表名称\n sys_log:\n #配置具体表的数据节点\n actual-data-nodes: ds0.sys_log$->{0..1}\n # 分表策略\n table-strategy:\n standard:\n # 分片算法名称\n sharding-algorithm-name: table-classbased\n # 分片列名称(对应数据库字段)\n sharding-column: log_type', '229a1bbc81ac94f732320744a6ca4762', '2010-05-05 00:00:00', '2022-04-13 03:30:40', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (11, 35, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\n shardingsphere:\n props:\n sql-show: true\n datasource:\n #添加分库数据源\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3300/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n names: ds0\n # 规则配置\n rules:\n sharding:\n # 配置绑定表,每一行为一组\n binding-tables: sys_log\n # 分布式序列算法配置\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n # 分片算法配置\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n # 自定义标准分配算法\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n # 逻辑表名称\n sys_log:\n #配置具体表的数据节点\n actual-data-nodes: ds0.sys_log$->{0..1}\n # 分表策略\n table-strategy:\n standard:\n # 分片算法名称\n sharding-algorithm-name: table-classbased\n # 分片列名称(对应数据库字段)\n sharding-column: log_type', '8a6f39994dfb0d936c0e3725ed35a621', '2010-05-05 00:00:00', '2022-04-13 03:31:13', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 36, 'jeecg-sharding2.yaml', 'DEFAULT_GROUP', '', '# 双库分表配置\r\nspring:\r\n shardingsphere:\r\n props:\r\n sql-show: true\r\n datasource:\r\n ds0:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n username: root\r\n password: root\r\n ds1:\r\n driverClassName: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\r\n type: com.alibaba.druid.pool.DruidDataSource\r\n username: root\r\n password: root\r\n names: ds0,ds1\r\n # 规则配置\r\n rules:\r\n replica-query:\r\n # 负载均衡算法\r\n load-balancers:\r\n round-robin:\r\n type: ROUND_ROBIN\r\n props:\r\n default: 0\r\n data-sources:\r\n prds:\r\n primary-data-source-name: ds0\r\n replica-data-source-names: ds1\r\n load-balancer-name: round_robin\r\n sharding:\r\n # 配置绑定表,每一行为一组,绑定表会提高查询效率\r\n binding-tables:\r\n - sys_log\r\n # 分布式序列算法配置\r\n key-generators:\r\n snowflake:\r\n type: SNOWFLAKE\r\n props:\r\n worker-id: 123\r\n # 分片算法配置\r\n sharding-algorithms:\r\n table-classbased:\r\n props:\r\n strategy: standard\r\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\r\n type: CLASS_BASED\r\n # 通过operate_type取模的方式确定数据落在哪个库\r\n database-inline:\r\n type: INLINE\r\n props:\r\n algorithm-expression: ds$->{operate_type % 2}\r\n tables:\r\n # 逻辑表名称\r\n sys_log:\r\n #配置具体表的数据节点\r\n actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\r\n # 分库策略\r\n database-strategy:\r\n standard:\r\n sharding-column: operate_type\r\n sharding-algorithm-name: database-inline\r\n # 分表策略\r\n table-strategy:\r\n standard:\r\n # 分片算法名称\r\n sharding-algorithm-name: table-classbased\r\n # 分片列名称\r\n sharding-column: log_type', '257969ade38b413213f56267ab338bb6', '2010-05-05 00:00:00', '2022-04-13 06:11:11', NULL, '0:0:0:0:0:0:0:1', 'I', ''); +INSERT INTO `his_config_info` VALUES (11, 37, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\n shardingsphere:\n props:\n sql-show: true\n datasource:\n #添加分库数据源\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n names: ds0\n # 规则配置\n rules:\n sharding:\n # 配置绑定表,每一行为一组\n binding-tables: sys_log\n # 分布式序列算法配置\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n # 分片算法配置\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n # 自定义标准分配算法\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n # 逻辑表名称\n sys_log:\n #配置具体表的数据节点\n actual-data-nodes: ds0.sys_log$->{0..1}\n # 分表策略\n table-strategy:\n standard:\n # 分片算法名称\n sharding-algorithm-name: table-classbased\n # 分片列名称(对应数据库字段)\n sharding-column: log_type', 'a454ad40d1edccb6ce3fafcb0a4d350c', '2010-05-05 00:00:00', '2022-04-13 06:11:31', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 38, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948215727,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0}]', 'b60a6340babb144a879201cff2dc93f7', '2010-05-05 00:00:00', '2022-04-14 14:56:56', NULL, '127.0.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (17, 39, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948215727,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0}]', 'b60a6340babb144a879201cff2dc93f7', '2010-05-05 00:00:00', '2022-04-14 14:57:16', NULL, '127.0.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (17, 40, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948215727,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0},{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":22.0,\"gmtCreate\":1649948235849,\"gmtModified\":1649948235849,\"grade\":1,\"id\":2,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"22\",\"resourceMode\":0}]', '81d3110456f0256a43ccd83ec16aa067', '2010-05-05 00:00:00', '2022-04-14 14:57:19', NULL, '127.0.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 41, 'jeecg-gateway-api-rules', 'SENTINEL_GROUP', '', '[{\"apiName\":\"SYSAPI\",\"app\":\"jeecg-gateway\",\"gmtCreate\":1649948439664,\"gmtModified\":1649948439664,\"id\":1,\"ip\":\"172.31.16.1\",\"port\":8720,\"predicateItems\":[{\"matchStrategy\":1,\"pattern\":\"/sys/test/**\"}]}]', '5d897363933340ac8b80879ea34a2566', '2010-05-05 00:00:00', '2022-04-14 15:00:40', NULL, '127.0.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (17, 42, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948215727,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0}]', 'b60a6340babb144a879201cff2dc93f7', '2010-05-05 00:00:00', '2022-04-14 15:00:53', NULL, '127.0.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (17, 43, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1000.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948453314,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0}]', 'da56e9a65f43503e3731ac173bfb6f99', '2010-05-05 00:00:00', '2022-04-14 15:01:10', NULL, '127.0.0.1', 'U', ''); +INSERT INTO `his_config_info` VALUES (0, 44, 'jeecg-gateway-degrade-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"count\":0.1,\"gmtCreate\":1649948712243,\"gmtModified\":1649948712243,\"grade\":0,\"id\":1,\"ip\":\"172.31.16.1\",\"limitApp\":\"default\",\"minRequestAmount\":5,\"port\":8720,\"resource\":\"jeecg-system\",\"slowRatioThreshold\":0.1,\"statIntervalMs\":1000,\"timeWindow\":30}]', 'f14f2b6ef6126f9f44aa6506aa7c6077', '2010-05-05 00:00:00', '2022-04-14 15:05:12', NULL, '127.0.0.1', 'I', ''); +INSERT INTO `his_config_info` VALUES (1, 45, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password:\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '2c0746e66cbde68a15c8f240b00ef47a', '2010-05-05 00:00:00', '2022-04-15 04:58:44', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (1, 46, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n # 连接池的配置信息\n # 初始化大小,最小,最大\n initial-size: 5\n min-idle: 5\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n # 打开PSCache,并且指定每个连接上PSCache的大小\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,\'wall\'用于防火墙\n filters: stat,wall,slf4j\n # 通过connectProperties属性来打开mergeSql功能;慢SQL记录\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n # 多数据源配置\n #multi-datasource1:\n #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n #username: root\n #password: root\n #driver-class-name: com.mysql.cj.jdbc.Driver\n #redis 配置\n redis:\n database: 0\n host: jeecg-boot-redis\n lettuce:\n pool:\n max-active: 8 #最大连接数据库连接数,设 0 为没有限制\n max-idle: 8 #最大等待连接中的数量,设 0 为没有限制\n max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n min-idle: 0 #最小等待连接中的数量,设 0 为没有限制\n shutdown-timeout: 100ms\n password: \'123\'\n port: 6379\n #rabbitmq配置\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n #消费者的最小数量\n concurrency: 1\n #消费者的最大数量\n max-concurrency: 1\n #是否支持重试\n retry:\n enabled: true\n#jeecg专用配置\nminidao :\n base-package: org.jeecg.modules.jmreport.*\njeecg :\n # 签名密钥串(前后端要一致,正式发布请自行修改)\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n # 本地:local\\Minio:minio\\阿里云:alioss\n uploadType: local\n path :\n #文件上传根目录 设置\n upload: /opt/upFiles\n #webapp文件路径\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n #阿里云oss存储配置\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n # ElasticSearch 6设置\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: 127.0.0.1:9200\n check-enabled: false\n # 表单设计器配置\n desform:\n # 主题颜色(仅支持 16进制颜色代码)\n theme-color: \"#1890ff\"\n # 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置)\n upload-type: system\n map:\n # 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home\n baidu: ??\n # 在线预览文件服务器地址配置\n file-view-domain: 127.0.0.1:8012\n # minio文件上传\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n #大屏报表参数设置\n jmreport:\n mode: dev\n #是否需要校验token\n is_verify_token: false\n #必须校验方法\n verify_methods: remove,delete,save,add,update\n #Wps在线文档\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n #xxl-job配置\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n #自定义路由配置 yml nacos database\n route:\n config:\n data-id: jeecg-gateway-router\n group: DEFAULT_GROUP\n data-type: database\n #分布式锁配置\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n#Mybatis输出sql日志\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\n#cas单点登录\ncas:\n prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n #开启生产环境屏蔽\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\n\n#第三方登录\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\n#第三方APP对接\nthird-app:\n enabled: false\n type:\n #企业微信\n WECHAT_ENTERPRISE:\n enabled: false\n #CORP_ID\n client-id: ??\n #SECRET\n client-secret: ??\n agent-id: ??\n #自建应用秘钥(新版企微需要配置)\n # agent-app-secret: ??\n #钉钉\n DINGTALK:\n enabled: false\n # appKey\n client-id: ??\n # appSecret\n client-secret: ??\n agent-id: ??', '762ef6033b00e3f4dcb1e86948591995', '2010-05-05 00:00:00', '2022-04-15 04:59:43', 'nacos', '0:0:0:0:0:0:0:1', 'U', ''); +INSERT INTO `his_config_info` VALUES (17, 47, 'jeecg-gateway-flow-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1000.0,\"gmtCreate\":1649948215727,\"gmtModified\":1649948453314,\"grade\":1,\"id\":1,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"jeecg-system\",\"resourceMode\":0},{\"app\":\"jeecg-gateway\",\"burst\":0,\"controlBehavior\":0,\"count\":1.0,\"gmtCreate\":1649948469824,\"gmtModified\":1649948469824,\"grade\":1,\"id\":3,\"interval\":1,\"intervalUnit\":0,\"ip\":\"172.31.16.1\",\"port\":8720,\"resource\":\"SYSAPI\",\"resourceMode\":1}]', 'e99c56c11c6db8497f1870edb1f5971b', '2010-05-05 00:00:00', '2022-04-17 09:37:18', NULL, '0:0:0:0:0:0:0:1', 'D', ''); +INSERT INTO `his_config_info` VALUES (20, 48, 'jeecg-gateway-api-rules', 'SENTINEL_GROUP', '', '[{\"apiName\":\"SYSAPI\",\"app\":\"jeecg-gateway\",\"gmtCreate\":1649948439664,\"gmtModified\":1649948439664,\"id\":1,\"ip\":\"172.31.16.1\",\"port\":8720,\"predicateItems\":[{\"matchStrategy\":1,\"pattern\":\"/sys/test/**\"}]}]', '5d897363933340ac8b80879ea34a2566', '2010-05-05 00:00:00', '2022-04-17 09:37:18', NULL, '0:0:0:0:0:0:0:1', 'D', ''); +INSERT INTO `his_config_info` VALUES (23, 49, 'jeecg-gateway-degrade-rules', 'SENTINEL_GROUP', '', '[{\"app\":\"jeecg-gateway\",\"count\":0.1,\"gmtCreate\":1649948712243,\"gmtModified\":1649948712243,\"grade\":0,\"id\":1,\"ip\":\"172.31.16.1\",\"limitApp\":\"default\",\"minRequestAmount\":5,\"port\":8720,\"resource\":\"jeecg-system\",\"slowRatioThreshold\":0.1,\"statIntervalMs\":1000,\"timeWindow\":30}]', 'f14f2b6ef6126f9f44aa6506aa7c6077', '2010-05-05 00:00:00', '2022-04-17 09:37:18', NULL, '0:0:0:0:0:0:0:1', 'D', ''); -- ---------------------------- -- Table structure for permissions @@ -257,4 +285,4 @@ CREATE TABLE `users` ( -- ---------------------------- INSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1); -SET FOREIGN_KEY_CHECKS = 1; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/jeecg-boot/db/增量SQL/3.0.0升级到3.1.0增量脚本sql b/jeecg-boot/db/增量SQL/3.0.0升级到3.1.0增量脚本sql deleted file mode 100644 index 1933c416..00000000 --- a/jeecg-boot/db/增量SQL/3.0.0升级到3.1.0增量脚本sql +++ /dev/null @@ -1,39 +0,0 @@ --- 第三方用户表应该加上创建人,创建时间、修改人、修改时间 -ALTER TABLE `sys_third_account` -ADD COLUMN `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称' AFTER `third_user_id`, -ADD COLUMN `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期' AFTER `create_by`, -ADD COLUMN `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称' AFTER `create_time`, -ADD COLUMN `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期' AFTER `update_by`; - --- online 表单字段db类型,区分年月日和年月日时分秒 -UPDATE onl_cgform_field SET db_type = 'Datetime' where db_type = 'Date'; - --- 对象存储字段太短 -ALTER TABLE `oss_file` -MODIFY COLUMN `url` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址' AFTER `file_name`; - --- 地址获取到多个地址, 地址过长导致权限菜单修改失败 -ALTER TABLE `sys_role_permission` -MODIFY COLUMN `operate_ip` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作ip' AFTER `operate_date`; - --- 修改 sys_permission 下的两个字段为 tinyint 类型 -ALTER TABLE `sys_permission` -MODIFY COLUMN `hidden` tinyint(1) NULL DEFAULT 0 COMMENT '是否隐藏路由: 0否,1是' AFTER `keep_alive`, -MODIFY COLUMN `hide_tab` tinyint(1) NULL DEFAULT NULL COMMENT '是否隐藏tab: 0否,1是' AFTER `hidden`; - --- 默认示例,内嵌百度改成jeecg.com官网 -UPDATE sys_permission SET name = 'JEECG官方网站' , url = 'http://www.jeecg.com' WHERE id = 'a400e4f4d54f79bf5ce160ae432231af'; - --- 菜单名和代码改名 erp风格 -UPDATE `sys_permission` SET `parent_id` = '2a470fc0c3954d9dbb61de6d80846549', `name` = '一对多erp风格示例', `url` = '/jeecg/tablist/JeecgOrderDMainList', `component` = 'jeecg/tablist/JeecgOrderDMainList', `component_name` = NULL, `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = NULL, `sort_no` = 2.00, `always_show` = 0, `icon` = NULL, `is_route` = 1, `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `description` = NULL, `status` = NULL, `del_flag` = 0, `rule_flag` = 0, `create_by` = 'admin', `create_time` = '2019-02-20 14:45:09', `update_by` = 'admin', `update_time` = '2022-01-17 17:02:51', `internal_or_external` = 0, `hide_tab` = '0' WHERE `id` = '6ad53fd1b220989a8b71ff482d683a5a'; - --- 分类字典 列表页 显示数据id -UPDATE sys_category SET code='B01-2-3' WHERE id='1404629269499936770'; -UPDATE sys_category SET code='B01-2-2' WHERE id='937fd2e9aa13b8bab1da1ca36d3fd344'; - --- 新的表格合计菜单 -INSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_route`, `is_leaf`, `keep_alive`, `hidden`, `description`, `status`, `del_flag`, `rule_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `internal_or_external`, `hide_tab`) VALUES ('1494641317580423169', '2a470fc0c3954d9dbb61de6d80846549', '表格合计News', '/jeecg/tableOrderTotal', 'jeecg/TableOrderTotal', NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 1, 0, 0, NULL, '1', 0, 0, 'admin', '2022-02-18 19:53:54', 'admin', '2022-02-18 19:55:04', 0, '0'); - --- online老数据,存在字符串类型key值不一致的情况,String改为string -UPDATE onl_cgform_field SET db_type = 'string' where binary db_type = 'String'; - diff --git a/jeecg-boot/db/增量SQL/3.1.0升级到3.2.0增量脚本sql b/jeecg-boot/db/增量SQL/3.1.0升级到3.2.0增量脚本sql new file mode 100644 index 00000000..82e70517 --- /dev/null +++ b/jeecg-boot/db/增量SQL/3.1.0升级到3.2.0增量脚本sql @@ -0,0 +1,16 @@ +-- ---------------------------- +-- Table structure for sys_role_index +-- ---------------------------- +CREATE TABLE `sys_role_index` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `role_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色编码', + `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由地址', + `priority` int(11) NULL DEFAULT 0 COMMENT '优先级', + `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0:无效 1:有效', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色首页表' ROW_FORMAT = Dynamic; \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/pom.xml b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/pom.xml index 4fed55c3..643de641 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/pom.xml +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-base-api org.jeecgframework.boot - 3.1.0 + 3.2.0 4.0.0 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java deleted file mode 100644 index 254ab7c0..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.jeecg.common.bpm.api; - -import org.jeecg.common.api.vo.Result; -import org.jeecg.common.constant.ServiceNameConstants; -import org.jeecg.common.online.api.factory.OnlineBaseExtAPIFallbackFactory; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; - -/** - * 流程接口 - * - * @author scott - */ -@Component -@FeignClient(contextId = "bpmBaseRemoteApi", value = ServiceNameConstants.SYSTEM_SERVICE, - fallbackFactory = OnlineBaseExtAPIFallbackFactory.class) -public interface IBpmBaseExtAPI { - /** - * 23. 流程提交接口(online,自定义开发) - * - * @param flowCode - * 流程业务关联 例如:joa_leave_01 - * @param id - * 表单业务数据data id - * @param formUrl - * 流程审批时附件页面默认展示的PC端表单组件(地址) - * @param formUrlMobile - * 流程审批时附件页面默认展示的移动端表单组件(地址) - * @param username - * 流程发起人账号 - * @param jsonData - * Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - @PostMapping(value = "/act/process/extActProcess/startMutilProcess") - Result startMutilProcess(@RequestParam("flowCode") String flowCode, @RequestParam("id") String id, - @RequestParam("formUrl") String formUrl, @RequestParam("formUrlMobile") String formUrlMobile, - @RequestParam("username") String username, @RequestParam("jsonData") String jsonData) throws Exception; - - /** - * 24. 流程提交接口(自定义表单设计器) - * - * @param flowCode - * 流程业务关联 例如:joa_leave_01 - * @param id - * 表单业务数据data id - * @param formUrl - * 流程审批时附件页面默认展示的PC端表单组件(地址) - * @param formUrlMobile - * 流程审批时附件页面默认展示的移动端表单组件(地址) - * @param username - * 流程发起人账号 - * @param jsonData - * Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - @PostMapping(value = "/act/process/extActProcess/startDesFormMutilProcess") - Result startDesFormMutilProcess(@RequestParam("flowCode") String flowCode, @RequestParam("id") String id, - @RequestParam("formUrl") String formUrl, @RequestParam("formUrlMobile") String formUrlMobile, - @RequestParam("username") String username, @RequestParam("jsonData") String jsonData) throws Exception; - - /** - * 25. 保存流程草稿箱接口(自定义开发表单、online表单) - * - * @param flowCode - * 流程业务关联 例如:joa_leave_01 - * @param id - * 表单业务数据data id - * @param formUrl - * 流程审批时附件页面默认展示的PC端表单组件(地址) 【非必填】 - * @param formUrlMobile - * 流程审批时附件页面默认展示的移动端表单组件(地址) 【非必填】 - * @param username - * 流程发起人账号 - * @param jsonData - * Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - @PostMapping(value = "/act/process/extActProcess/saveMutilProcessDraft") - Result saveMutilProcessDraft(@RequestParam("flowCode") String flowCode, @RequestParam("id") String id, - @RequestParam("formUrl") String formUrl, @RequestParam("formUrlMobile") String formUrlMobile, - @RequestParam("username") String username, @RequestParam("jsonData") String jsonData) throws Exception; - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/factory/BpmBaseExtAPIFallbackFactory.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/factory/BpmBaseExtAPIFallbackFactory.java deleted file mode 100644 index 6546be5a..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/factory/BpmBaseExtAPIFallbackFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.jeecg.common.bpm.api.factory; - -import org.jeecg.common.bpm.api.IBpmBaseExtAPI; -import org.jeecg.common.bpm.api.fallback.BpmBaseExtAPIFallback; -import org.springframework.stereotype.Component; - -import feign.hystrix.FallbackFactory; - -@Component -public class BpmBaseExtAPIFallbackFactory implements FallbackFactory { - - @Override - public IBpmBaseExtAPI create(Throwable throwable) { - BpmBaseExtAPIFallback fallback = new BpmBaseExtAPIFallback(); - fallback.setCause(throwable); - return fallback; - } -} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/fallback/BpmBaseExtAPIFallback.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/fallback/BpmBaseExtAPIFallback.java deleted file mode 100644 index b0ddadcd..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/bpm/api/fallback/BpmBaseExtAPIFallback.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.jeecg.common.bpm.api.fallback; - -import java.util.List; -import java.util.Map; - -import org.jeecg.common.api.vo.Result; -import org.jeecg.common.bpm.api.IBpmBaseExtAPI; -import org.jeecg.common.online.api.IOnlineBaseExtAPI; -import org.jeecg.common.system.vo.DictModel; - -import com.alibaba.fastjson.JSONObject; - -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -/** - * 进入fallback的方法 检查是否token未设置 - */ -@Slf4j -public class BpmBaseExtAPIFallback implements IBpmBaseExtAPI { - - @Setter - private Throwable cause; - - @Override - public Result startMutilProcess(String flowCode, String id, String formUrl, String formUrlMobile, - String username, String jsonData) throws Exception { - return null; - } - - @Override - public Result startDesFormMutilProcess(String flowCode, String id, String formUrl, String formUrlMobile, - String username, String jsonData) throws Exception { - return null; - } - - @Override - public Result saveMutilProcessDraft(String flowCode, String id, String formUrl, String formUrlMobile, - String username, String jsonData) throws Exception { - return null; - } -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java deleted file mode 100644 index 6627bb36..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.jeecg.common.online.api; - -import com.alibaba.fastjson.JSONObject; -import org.jeecg.common.constant.ServiceNameConstants; -import org.jeecg.common.online.api.factory.OnlineBaseExtAPIFallbackFactory; -import org.jeecg.common.system.vo.DictModel; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - * 【Online】Feign API接口 - */ -@Component -@FeignClient(contextId = "onlineBaseRemoteApi", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = OnlineBaseExtAPIFallbackFactory.class) -//@FeignClient(contextId = "onlineBaseRemoteApi", value = ServiceNameConstants.SYSTEM_ONLINE, fallbackFactory = OnlineBaseExtAPIFallbackFactory.class) -public interface IOnlineBaseExtAPI { - - /** - * 【Online】 表单设计器专用:同步新增 - */ - @PostMapping(value = "/online/api/cgform/crazyForm/{name}") - String cgformPostCrazyForm(@PathVariable("name") String tableName, @RequestBody JSONObject jsonObject) throws Exception; - - /** - * 【Online】 表单设计器专用:同步编辑 - */ - @PutMapping(value = "/online/api/cgform/crazyForm/{name}") - String cgformPutCrazyForm(@PathVariable("name") String tableName, @RequestBody JSONObject jsonObject) throws Exception; - - /** - * 通过online表名查询数据,同时查询出子表的数据 - * - * @param tableName online表名 - * @param dataIds online数据ID - * @return - */ - @GetMapping(value = "/online/api/cgform/queryAllDataByTableName") - JSONObject cgformQueryAllDataByTableName(@RequestParam("tableName") String tableName, @RequestParam("dataIds") String dataIds); - - /** - * online表单删除数据 - * - * @param cgformCode Online表单code - * @param dataIds 数据ID,可逗号分割 - * @return - */ - @DeleteMapping("/online/api/cgform/cgformDeleteDataByCode") - String cgformDeleteDataByCode(@RequestParam("cgformCode") String cgformCode, @RequestParam("dataIds") String dataIds); - - /** - * 【cgreport】通过 head code 获取 sql语句,并执行该语句返回查询数据 - * - * @param code 报表Code,如果没传ID就通过code查 - * @param forceKey - * @param dataList - * @return - */ - @GetMapping("/online/api/cgreportGetData") - Map cgreportGetData(@RequestParam("code") String code, @RequestParam("forceKey") String forceKey, @RequestParam("dataList") String dataList); - - /** - * 【cgreport】对 cgreportGetData 的返回值做优化,封装 DictModel 集合 - * - * @return - */ - @GetMapping("/online/api/cgreportGetDataPackage") - List cgreportGetDataPackage(@RequestParam("code") String code, @RequestParam("dictText") String dictText, @RequestParam("dictCode") String dictCode, @RequestParam("dataList") String dataList); - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/factory/OnlineBaseExtAPIFallbackFactory.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/factory/OnlineBaseExtAPIFallbackFactory.java deleted file mode 100644 index 491297c5..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/factory/OnlineBaseExtAPIFallbackFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jeecg.common.online.api.factory; - -import feign.hystrix.FallbackFactory; -import org.jeecg.common.online.api.IOnlineBaseExtAPI; -import org.jeecg.common.online.api.fallback.OnlineBaseExtAPIFallback; -import org.springframework.stereotype.Component; - -@Component -public class OnlineBaseExtAPIFallbackFactory implements FallbackFactory { - - @Override - public IOnlineBaseExtAPI create(Throwable throwable) { - OnlineBaseExtAPIFallback fallback = new OnlineBaseExtAPIFallback(); - fallback.setCause(throwable); - return fallback; - } -} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/fallback/OnlineBaseExtAPIFallback.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/fallback/OnlineBaseExtAPIFallback.java deleted file mode 100644 index 51050ece..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/fallback/OnlineBaseExtAPIFallback.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.jeecg.common.online.api.fallback; - -import com.alibaba.fastjson.JSONObject; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.online.api.IOnlineBaseExtAPI; -import org.jeecg.common.system.vo.DictModel; - -import java.util.List; -import java.util.Map; - -/** - * 进入fallback的方法 检查是否token未设置 - */ -@Slf4j -public class OnlineBaseExtAPIFallback implements IOnlineBaseExtAPI { - - @Setter - private Throwable cause; - - @Override - public String cgformPostCrazyForm(String tableName, JSONObject jsonObject) { - return null; - } - - @Override - public String cgformPutCrazyForm(String tableName, JSONObject jsonObject) { - return null; - } - - @Override - public JSONObject cgformQueryAllDataByTableName(String tableName, String dataIds) { - return null; - } - - @Override - public String cgformDeleteDataByCode(String cgformCode, String dataIds) { - return null; - } - - @Override - public Map cgreportGetData(String code, String forceKey, String dataList) { - return null; - } - - @Override - public List cgreportGetDataPackage(String code, String dictText, String dictCode, String dataList) { - return null; - } - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 24f6d003..bf0fc3d5 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -7,6 +7,7 @@ import org.jeecg.common.api.dto.message.*; import org.jeecg.common.constant.ServiceNameConstants; import org.jeecg.common.system.api.factory.SysBaseAPIFallbackFactory; import org.jeecg.common.system.vo.*; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; @@ -16,18 +17,17 @@ import java.util.Map; import java.util.Set; /** - * 相比较local版 - * 去掉了一些方法: - * addLog getDatabaseType queryAllDepart - * queryAllUser(Wrapper wrapper) queryAllUser(String[] userIds, int pageNo, int pageSize) - * 修改了一些方法: - * createLog - * sendSysAnnouncement 只保留了一个,其余全部干掉 * - * cloud接口数量43 local:35 common:9 额外一个特殊queryAllRole一个当两个用 + * 1、cloud接口数量43 local:35 common:9 额外一个特殊queryAllRole一个当两个用 + * - 相比较local版 + * - 去掉了一些方法:addLog、getDatabaseType、queryAllDepart、queryAllUser(Wrapper wrapper)、queryAllUser(String[] userIds, int pageNo, int pageSize) + * - 修改了一些方法:createLog、sendSysAnnouncement(只保留了一个,其余全部干掉) + * 2、@ConditionalOnMissingClass("org.jeecg.modules.system.service.impl.SysBaseApiImpl")=> 有实现类的时候,不实例化Feign接口 + * @author: jeecg-boot */ @Component -@FeignClient(contextId = "sysBaseRemoteApi", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysBaseAPIFallbackFactory.class) +@FeignClient(contextId = "sysBaseRemoteApi", value = ServiceNameConstants.SERVICE_SYSTEM, fallbackFactory = SysBaseAPIFallbackFactory.class) +@ConditionalOnMissingClass("org.jeecg.modules.system.service.impl.SysBaseApiImpl") public interface ISysBaseAPI extends CommonAPI { /** @@ -103,6 +103,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param code * @return */ + @Override @GetMapping("/sys/api/queryDictItemsByCode") List queryDictItemsByCode(@RequestParam("code") String code); @@ -111,10 +112,13 @@ public interface ISysBaseAPI extends CommonAPI { * @param code * @return */ + @Override @GetMapping("/sys/api/queryEnableDictItemsByCode") public List queryEnableDictItemsByCode(@RequestParam("code") String code); - /** 11查询所有的父级字典,按照create_time排序 */ + /** 11查询所有的父级字典,按照create_time排序 + * @return List 字典值集合 + */ @GetMapping("/sys/api/queryAllDict") List queryAllDict(); @@ -122,8 +126,8 @@ public interface ISysBaseAPI extends CommonAPI { * 12查询所有分类字典 * @return */ - @GetMapping("/sys/api/queryAllDSysCategory") - List queryAllDSysCategory(); + @GetMapping("/sys/api/queryAllSysCategory") + List queryAllSysCategory(); /** * 13获取表数据字典 @@ -132,6 +136,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param code * @return */ + @Override @GetMapping("/sys/api/queryTableDictItemsByCode") List queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code); @@ -144,6 +149,8 @@ public interface ISysBaseAPI extends CommonAPI { /** * 15根据业务类型 busType 及业务 busId 修改消息已读 + * @param busType 业务类型 + * @param busId 业务id */ @GetMapping("/sys/api/updateSysAnnounReadFlag") public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId); @@ -180,6 +187,9 @@ public interface ISysBaseAPI extends CommonAPI { /** * 19分页查询用户 返回JSONObject + * @param userIds 多个用户id + * @param pageNo 当前页数 + * @param pageSize 每页条数 * @return */ @GetMapping("/sys/api/queryAllUser") @@ -188,7 +198,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 20获取所有角色 带参 - * roleIds 默认选中角色 + * @param roleIds 默认选中角色 * @return */ @GetMapping("/sys/api/queryAllRole") @@ -243,7 +253,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 27根据id获取所有参与用户 - * userIds + * @param userIds 多个用户id * @return */ @GetMapping("/sys/api/queryAllUserByIds") @@ -260,7 +270,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 29根据name获取所有参与用户 - * userNames + * @param userNames 多个用户账号 * @return */ @GetMapping("/sys/api/queryUserByNames") @@ -293,6 +303,8 @@ public interface ISysBaseAPI extends CommonAPI { /** * 33通过部门id获取部门全部信息 + * @param id 部门id + * @return SysDepartModel 部门信息 */ @GetMapping("/sys/api/selectAllById") SysDepartModel selectAllById(@RequestParam("id") String id); @@ -313,6 +325,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param username * @return */ + @Override @GetMapping("/sys/api/queryUserRoles") Set queryUserRoles(@RequestParam("username")String username); @@ -321,6 +334,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param username * @return */ + @Override @GetMapping("/sys/api/queryUserAuths") Set queryUserAuths(@RequestParam("username")String username); @@ -330,6 +344,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param dbSourceId * @return */ + @Override @GetMapping("/sys/api/getDynamicDbSourceById") DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId") String dbSourceId); @@ -339,13 +354,16 @@ public interface ISysBaseAPI extends CommonAPI { * @param dbSourceCode * @return */ + @Override @GetMapping("/sys/api/getDynamicDbSourceByCode") DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode); /** * 39根据用户账号查询用户信息 CommonAPI中定义 * @param username + * @return LoginUser 用户信息 */ + @Override @GetMapping("/sys/api/getUserByName") LoginUser getUserByName(@RequestParam("username") String username); @@ -357,6 +375,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param key * @return */ + @Override @GetMapping("/sys/api/translateDictFromTable") String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key); @@ -366,13 +385,18 @@ public interface ISysBaseAPI extends CommonAPI { * @param key * @return */ + @Override @GetMapping("/sys/api/translateDict") String translateDict(@RequestParam("code") String code, @RequestParam("key") String key); /** * 42查询数据权限 + * @param component + * @param requestPath + * @param username 用户姓名 * @return */ + @Override @GetMapping("/sys/api/queryPermissionDataRule") List queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username); @@ -381,6 +405,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param username * @return */ + @Override @GetMapping("/sys/api/getCacheUser") SysUserCacheInfo getCacheUser(@RequestParam("username") String username); @@ -426,13 +451,16 @@ public interface ISysBaseAPI extends CommonAPI { void sendEmailMsg(@RequestParam("email")String email,@RequestParam("title")String title,@RequestParam("content")String content); /** * 41 获取公司下级部门和公司下所有用户id - * @param orgCode + * @param orgCode 部门编号 + * @return List */ @GetMapping("/sys/api/getDeptUserByOrgCode") List getDeptUserByOrgCode(@RequestParam("orgCode")String orgCode); /** * 42 查询分类字典翻译 + * @param ids 多个分类字典id + * @return List */ @GetMapping("/sys/api/loadCategoryDictItem") List loadCategoryDictItem(@RequestParam("ids") String ids); @@ -472,6 +500,7 @@ public interface ISysBaseAPI extends CommonAPI { * * @param dictCode 字典code格式:table,text,code * @param keyword 过滤关键字 + * @param pageSize 每页条数 * @return */ @GetMapping("/sys/api/loadDictItemByKeyword") diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/factory/SysBaseAPIFallbackFactory.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/factory/SysBaseAPIFallbackFactory.java index ab6ea8a5..fa3e3c12 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/factory/SysBaseAPIFallbackFactory.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/factory/SysBaseAPIFallbackFactory.java @@ -1,10 +1,14 @@ package org.jeecg.common.system.api.factory; -import feign.hystrix.FallbackFactory; +import org.springframework.cloud.openfeign.FallbackFactory; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.api.fallback.SysBaseAPIFallback; import org.springframework.stereotype.Component; +/** + * @Description: SysBaseAPIFallbackFactory + * @author: jeecg-boot + */ @Component public class SysBaseAPIFallbackFactory implements FallbackFactory { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java index 45cc7de8..aa1f0df8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java @@ -14,6 +14,7 @@ import java.util.Set; /** * 进入fallback的方法 检查是否token未设置 + * @author: jeecg-boot */ @Slf4j public class SysBaseAPIFallback implements ISysBaseAPI { @@ -79,11 +80,12 @@ public class SysBaseAPIFallback implements ISysBaseAPI { @Override public List queryAllDict() { + log.error("fegin接口queryAllDict失败:"+cause.getMessage(), cause); return null; } @Override - public List queryAllDSysCategory() { + public List queryAllSysCategory() { return null; } @@ -221,7 +223,7 @@ public class SysBaseAPIFallback implements ISysBaseAPI { @Override public LoginUser getUserByName(String username) { - log.error("通过用户名获取当前登录用户信息 {}", cause); + log.error("jeecg-system服务节点不通,导致获取登录用户信息失败: " + cause.getMessage(), cause); return null; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java index 7d5eed22..c628b658 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java @@ -1,164 +1,180 @@ -package org.jeecg.config; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.SortedMap; - -import javax.servlet.http.HttpServletRequest; - -import org.jeecg.common.config.mqtoken.UserTokenContext; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.util.DateUtils; -import org.jeecg.common.util.PathMatcherUtil; -import org.jeecg.config.sign.interceptor.SignAuthConfiguration; -import org.jeecg.config.sign.util.HttpUtils; -import org.jeecg.config.sign.util.SignUtil; -import org.springframework.beans.factory.ObjectFactory; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.http.HttpMessageConverters; -import org.springframework.cloud.openfeign.FeignAutoConfiguration; -import org.springframework.cloud.openfeign.support.SpringDecoder; -import org.springframework.cloud.openfeign.support.SpringEncoder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Scope; -import org.springframework.http.MediaType; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.support.config.FastJsonConfig; -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; -import com.alibaba.fastjson.support.springfox.SwaggerJsonSerializer; - -import feign.Feign; -import feign.Logger; -import feign.RequestInterceptor; -import feign.codec.Decoder; -import feign.codec.Encoder; -import feign.form.spring.SpringFormEncoder; -import lombok.extern.slf4j.Slf4j; - -@ConditionalOnClass(Feign.class) -@AutoConfigureBefore(FeignAutoConfiguration.class) -@Slf4j -@Configuration -public class FeignConfig { - - @Bean - public RequestInterceptor requestInterceptor() { - return requestTemplate -> { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (null != attributes) { - HttpServletRequest request = attributes.getRequest(); - log.debug("Feign request: {}", request.getRequestURI()); - // 将token信息放入header中 - String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); - if(token==null || "".equals(token)){ - token = request.getParameter("token"); - } - log.debug("Feign request token: {}", token); - requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token); - - //根据URL地址过滤请求 【字典表参数签名验证】 - if (PathMatcherUtil.matches(Arrays.asList(SignAuthConfiguration.urlList),requestTemplate.path())) { - try { - log.info("============================ [begin] fegin api url ============================"); - log.info(requestTemplate.path()); - log.info(requestTemplate.method()); - String queryLine = requestTemplate.queryLine(); - if(queryLine!=null && queryLine.startsWith("?")){ - queryLine = queryLine.substring(1); - } - log.info(queryLine); - if(requestTemplate.body()!=null){ - log.info(new String(requestTemplate.body())); - } - SortedMap allParams = HttpUtils.getAllParams(requestTemplate.path(),queryLine,requestTemplate.body(),requestTemplate.method()); - String sign = SignUtil.getParamsSign(allParams); - log.info(" Feign request params sign: {}",sign); - log.info("============================ [end] fegin api url ============================"); - requestTemplate.header(CommonConstant.X_SIGN, sign); - requestTemplate.header(CommonConstant.X_TIMESTAMP, DateUtils.getCurrentTimestamp().toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - }else{ - String token = UserTokenContext.getToken(); - log.debug("Feign request token: {}", token); - requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token); - } - }; - } - - - - /** - * Feign 客户端的日志记录,默认级别为NONE - * Logger.Level 的具体级别如下: - * NONE:不记录任何信息 - * BASIC:仅记录请求方法、URL以及响应状态码和执行时间 - * HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息 - * FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据 - */ - @Bean - Logger.Level feignLoggerLevel() { - return Logger.Level.FULL; - } - - /** - * Feign支持文件上传 - * @param messageConverters - * @return - */ - @Bean - @Primary - @Scope("prototype") - public Encoder multipartFormEncoder(ObjectFactory messageConverters) { - return new SpringFormEncoder(new SpringEncoder(messageConverters)); - } - - // update-begin--Author:sunjianlei Date:20210604 for: 给 Feign 添加 FastJson 的解析支持 ---------- - @Bean - public Encoder feignEncoder() { - return new SpringEncoder(feignHttpMessageConverter()); - } - - @Bean - public Decoder feignDecoder() { - return new SpringDecoder(feignHttpMessageConverter()); - } - - /** - * 设置解码器为fastjson - * - * @return - */ - private ObjectFactory feignHttpMessageConverter() { - final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter()); - return () -> httpMessageConverters; - } - - private FastJsonHttpMessageConverter getFastJsonConverter() { - FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); - - List supportedMediaTypes = new ArrayList<>(); - MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE); - supportedMediaTypes.add(mediaTypeJson); - converter.setSupportedMediaTypes(supportedMediaTypes); - FastJsonConfig config = new FastJsonConfig(); - config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer()); - config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect); - converter.setFastJsonConfig(config); - - return converter; - } - // update-end--Author:sunjianlei Date:20210604 for: 给 Feign 添加 FastJson 的解析支持 ---------- - -} +//package org.jeecg.config; +// +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.List; +//import java.util.SortedMap; +// +//import javax.servlet.http.HttpServletRequest; +// +//import org.jeecg.common.config.mqtoken.UserTokenContext; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.util.DateUtils; +//import org.jeecg.common.util.PathMatcherUtil; +//import org.jeecg.config.sign.interceptor.SignAuthConfiguration; +//import org.jeecg.config.sign.util.HttpUtils; +//import org.jeecg.config.sign.util.SignUtil; +//import org.springframework.beans.factory.ObjectFactory; +//import org.springframework.boot.autoconfigure.AutoConfigureBefore; +//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +//import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +//import org.springframework.cloud.openfeign.FeignAutoConfiguration; +//import org.springframework.cloud.openfeign.support.SpringDecoder; +//import org.springframework.cloud.openfeign.support.SpringEncoder; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; +//import org.springframework.context.annotation.Scope; +//import org.springframework.http.MediaType; +//import org.springframework.web.context.request.RequestContextHolder; +//import org.springframework.web.context.request.ServletRequestAttributes; +// +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.serializer.SerializerFeature; +//import com.alibaba.fastjson.support.config.FastJsonConfig; +//import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +//import com.alibaba.fastjson.support.springfox.SwaggerJsonSerializer; +// +//import feign.Feign; +//import feign.Logger; +//import feign.RequestInterceptor; +//import feign.codec.Decoder; +//import feign.codec.Encoder; +//import feign.form.spring.SpringFormEncoder; +//import lombok.extern.slf4j.Slf4j; +// +///** +// * @Description: FeignConfig +// * @author: JeecgBoot +// */ +//@ConditionalOnClass(Feign.class) +//@AutoConfigureBefore(FeignAutoConfiguration.class) +//@Slf4j +//@Configuration +//public class FeignConfig { +// +// /** +// * 设置feign header参数 +// * 【X_ACCESS_TOKEN】【X_SIGN】【X_TIMESTAMP】 +// * @return +// */ +// @Bean +// public RequestInterceptor requestInterceptor() { +// return requestTemplate -> { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// if (null != attributes) { +// HttpServletRequest request = attributes.getRequest(); +// log.debug("Feign request: {}", request.getRequestURI()); +// // 将token信息放入header中 +// String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); +// if(token==null || "".equals(token)){ +// token = request.getParameter("token"); +// } +// log.info("Feign Login Request token: {}", token); +// requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token); +// }else{ +// //解决后台任务、MQ中调用feign接口,无会话token的问题 +// String token = UserTokenContext.getToken(); +// log.info("Feign No Login token: {}", token); +// requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token); +// } +// +// //================================================================================================================ +// //针对特殊接口,进行加签验证 ——根据URL地址过滤请求 【字典表参数签名验证】 +// if (PathMatcherUtil.matches(Arrays.asList(SignAuthConfiguration.SIGN_URL_LIST),requestTemplate.path())) { +// try { +// log.info("============================ [begin] fegin api url ============================"); +// log.info(requestTemplate.path()); +// log.info(requestTemplate.method()); +// String queryLine = requestTemplate.queryLine(); +// String questionMark="?"; +// if(queryLine!=null && queryLine.startsWith(questionMark)){ +// queryLine = queryLine.substring(1); +// } +// log.info(queryLine); +// if(requestTemplate.body()!=null){ +// log.info(new String(requestTemplate.body())); +// } +// SortedMap allParams = HttpUtils.getAllParams(requestTemplate.path(),queryLine,requestTemplate.body(),requestTemplate.method()); +// String sign = SignUtil.getParamsSign(allParams); +// log.info(" Feign request params sign: {}",sign); +// log.info("============================ [end] fegin api url ============================"); +// requestTemplate.header(CommonConstant.X_SIGN, sign); +// requestTemplate.header(CommonConstant.X_TIMESTAMP, DateUtils.getCurrentTimestamp().toString()); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// //================================================================================================================ +// }; +// } +// +// +// +// /** +// * Feign 客户端的日志记录,默认级别为NONE +// * Logger.Level 的具体级别如下: +// * NONE:不记录任何信息 +// * BASIC:仅记录请求方法、URL以及响应状态码和执行时间 +// * HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息 +// * FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据 +// */ +// @Bean +// Logger.Level feignLoggerLevel() { +// return Logger.Level.FULL; +// } +// +// /** +// * Feign支持文件上传 +// * @param messageConverters +// * @return +// */ +// @Bean +// @Primary +// @Scope("prototype") +// public Encoder multipartFormEncoder(ObjectFactory messageConverters) { +// return new SpringFormEncoder(new SpringEncoder(messageConverters)); +// } +// +// // update-begin--Author:sunjianlei Date:20210604 for: 给 Feign 添加 FastJson 的解析支持 ---------- +// /** +// * 给 Feign 添加 FastJson 的解析支持 +// */ +// @Bean +// public Encoder feignEncoder() { +// return new SpringEncoder(feignHttpMessageConverter()); +// } +// +// @Bean +// public Decoder feignDecoder() { +// return new SpringDecoder(feignHttpMessageConverter()); +// } +// +// /** +// * 设置解码器为fastjson +// * +// * @return +// */ +// private ObjectFactory feignHttpMessageConverter() { +// final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter()); +// return () -> httpMessageConverters; +// } +// +// private FastJsonHttpMessageConverter getFastJsonConverter() { +// FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); +// +// List supportedMediaTypes = new ArrayList<>(); +// MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE); +// supportedMediaTypes.add(mediaTypeJson); +// converter.setSupportedMediaTypes(supportedMediaTypes); +// FastJsonConfig config = new FastJsonConfig(); +// config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer()); +// config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect); +// converter.setFastJsonConfig(config); +// +// return converter; +// } +// // update-end--Author:sunjianlei Date:20210604 for: 给 Feign 添加 FastJson 的解析支持 ---------- +// +//} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/pom.xml b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/pom.xml index 89c8d3fa..d8428e5f 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/pom.xml +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-base-api org.jeecgframework.boot - 3.1.0 + 3.2.0 4.0.0 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java deleted file mode 100644 index e59c7068..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/bpm/api/IBpmBaseExtAPI.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.jeecg.common.bpm.api; - -import java.util.List; -import java.util.Map; - -import org.jeecg.common.api.vo.Result; -import org.jeecg.common.system.vo.DictModel; - -import com.alibaba.fastjson.JSONObject; - -/** - * 流程接口 - * - * @author scott - */ -public interface IBpmBaseExtAPI { - /** - * 23. 流程提交接口(online,自定义开发) - * @param flowCode 流程业务关联 例如:joa_leave_01 - * @param id 表单业务数据data id - * @param formUrl 流程审批时附件页面默认展示的PC端表单组件(地址) - * @param formUrlMobile 流程审批时附件页面默认展示的移动端表单组件(地址) - * @param username 流程发起人账号 - * @param jsonData Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - Result startMutilProcess(String flowCode, String id, String formUrl, String formUrlMobile, String username, String jsonData) throws Exception; - - /** - * 24. 流程提交接口(自定义表单设计器) - * @param flowCode 流程业务关联 例如:joa_leave_01 - * @param id 表单业务数据data id - * @param formUrl 流程审批时附件页面默认展示的PC端表单组件(地址) - * @param formUrlMobile 流程审批时附件页面默认展示的移动端表单组件(地址) - * @param username 流程发起人账号 - * @param jsonData Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - Result startDesFormMutilProcess(String flowCode, String id, String formUrl, String formUrlMobile, String username, String jsonData) throws Exception; - /** - * 25. 保存流程草稿箱接口(自定义开发表单、online表单) - * @param flowCode 流程业务关联 例如:joa_leave_01 - * @param id 表单业务数据data id - * @param formUrl 流程审批时附件页面默认展示的PC端表单组件(地址) 【非必填】 - * @param formUrlMobile 流程审批时附件页面默认展示的移动端表单组件(地址) 【非必填】 - * @param username 流程发起人账号 - * @param jsonData Json串,额外扩展的流程变量值 【非必填】 - * @return - * @throws Exception - */ - Result saveMutilProcessDraft(String flowCode, String id, String formUrl, String formUrlMobile, String username, String jsonData) throws Exception; - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java deleted file mode 100644 index bda8bea8..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtAPI.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.jeecg.common.online.api; - -import com.alibaba.fastjson.JSONObject; -import org.jeecg.common.system.vo.DictModel; - -import java.util.List; -import java.util.Map; - -/** - * 表单设计器【Online】翻译API接口 - * - * @author sunjianlei - */ -public interface IOnlineBaseExtAPI { - - /** - * 【Online】 表单设计器专用:同步新增 - */ - String cgformPostCrazyForm(String tableName, JSONObject jsonObject) throws Exception; - - /** - * 【Online】 表单设计器专用:同步编辑 - */ - String cgformPutCrazyForm(String tableName, JSONObject jsonObject) throws Exception; - - /** - * online表单删除数据 - * - * @param cgformCode Online表单code - * @param dataIds 数据ID,可逗号分割 - * @return - */ - String cgformDeleteDataByCode(String cgformCode, String dataIds); - - /** - * 通过online表名查询数据,同时查询出子表的数据 - * - * @param tableName online表名 - * @param dataIds online数据ID - * @return - */ - JSONObject cgformQueryAllDataByTableName(String tableName, String dataIds); - - /** - * 对 cgreportGetData 的返回值做优化,封装 DictModel 集合 - * - * @return - */ - List cgreportGetDataPackage(String code, String dictText, String dictCode, String dataList); - - /** - * 【cgreport】通过 head code 获取 sql语句,并执行该语句返回查询数据 - * - * @param code 报表Code,如果没传ID就通过code查 - * @param forceKey - * @param dataList - * @return - */ - Map cgreportGetData(String code, String forceKey, String dataList); - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 3d0c34a1..acaefdc4 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -80,14 +80,16 @@ public interface ISysBaseAPI extends CommonAPI { - /** 11查询所有的父级字典,按照create_time排序 */ + /** 11查询所有的父级字典,按照create_time排序 + * @return List 字典集合 + */ public List queryAllDict(); /** * 12查询所有分类字典 * @return */ - public List queryAllDSysCategory(); + public List queryAllSysCategory(); /** @@ -132,6 +134,9 @@ public interface ISysBaseAPI extends CommonAPI { /** * 19分页查询用户 返回JSONObject + * @param userIds 多个用户id + * @param pageNo 当前页数 + * @param pageSize 每页显示条数 * @return */ public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize); @@ -144,7 +149,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 21获取所有角色 带参 - * roleIds 默认选中角色 + * @param roleIds 默认选中角色 * @return */ public List queryAllRole(String[] roleIds ); @@ -192,7 +197,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 28根据id获取所有参与用户 - * userIds + * @param userIds 多个用户id * @return */ public List queryAllUserByIds(String[] userIds); @@ -207,7 +212,7 @@ public interface ISysBaseAPI extends CommonAPI { /** * 30根据name获取所有参与用户 - * userNames + * @param userNames 多个用户账户 * @return */ List queryUserByNames(String[] userNames); @@ -236,6 +241,8 @@ public interface ISysBaseAPI extends CommonAPI { /** * 34通过部门id获取部门全部信息 + * @param id 部门id + * @return SysDepartModel对象 */ SysDepartModel selectAllById(String id); @@ -284,11 +291,14 @@ public interface ISysBaseAPI extends CommonAPI { /** * 41 获取公司下级部门和公司下所有用户信息 * @param orgCode + * @return List */ List getDeptUserByOrgCode(String orgCode); /** * 查询分类字典翻译 + * @param ids 多个分类字典id + * @return List */ List loadCategoryDictItem(String ids); @@ -323,6 +333,7 @@ public interface ISysBaseAPI extends CommonAPI { * * @param dictCode 字典code格式:table,text,code * @param keyword 过滤关键字 + * @param pageSize 分页条数 * @return */ List loadDictItemByKeyword(String dictCode, String keyword, Integer pageSize); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/pom.xml b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/pom.xml index 9218f19c..3132554f 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/pom.xml +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-api/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-base org.jeecgframework.boot - 3.1.0 + 3.2.0 4.0.0 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/pom.xml b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/pom.xml index c5caecbe..3d0c2ffa 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-boot-base - 3.1.0 + 3.2.0 4.0.0 @@ -63,6 +63,11 @@ org.springframework.boot spring-boot-starter-validation + + + io.micrometer + micrometer-registry-prometheus + @@ -114,7 +119,7 @@ org.jeecgframework.boot hibernate-re - 3.1.0-beta2 + 3.2.0-beta @@ -176,6 +181,11 @@ org.apache.shiro shiro-core + + + com.puppycrawl.tools + checkstyle + diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java index b355910e..39634af8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java @@ -6,6 +6,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +/** + * 通用api + * @author: jeecg-boot + */ public interface CommonAPI { /** @@ -67,6 +71,9 @@ public interface CommonAPI { /** * 8查询数据权限 + * @param component 组件 + * @param username 用户名 + * @param requestPath 前段请求地址 * @return */ List queryPermissionDataRule(String component, String requestPath, String username); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java index 589a70b5..552655c3 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java @@ -8,6 +8,7 @@ import java.io.Serializable; /** * 文件下载 * cloud api 用到的接口传输对象 + * @author: jeecg-boot */ @Data public class FileDownDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileUploadDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileUploadDTO.java index 4f61f67b..8862d356 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileUploadDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileUploadDTO.java @@ -8,6 +8,7 @@ import java.io.Serializable; /** * 文件上传 * cloud api 用到的接口传输对象 + * @author: jeecg-boot */ @Data public class FileUploadDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java index 8d57e234..e50ee7fe 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java @@ -7,6 +7,7 @@ import java.util.Date; /** * 日志对象 * cloud api 用到的接口传输对象 + * @author: jeecg-boot */ @Data public class LogDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/OnlineAuthDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/OnlineAuthDTO.java index d0243c24..5407a6dd 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/OnlineAuthDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/OnlineAuthDTO.java @@ -8,6 +8,7 @@ import java.util.List; /** * online 拦截器权限判断 * cloud api 用到的接口传输对象 + * @author: jeecg-boot */ @Data public class OnlineAuthDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusMessageDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusMessageDTO.java index 26ab6eef..28f2c397 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusMessageDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusMessageDTO.java @@ -6,6 +6,7 @@ import java.io.Serializable; /** * 带业务参数的消息 + * @author: jeecg-boot */ @Data public class BusMessageDTO extends MessageDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusTemplateMessageDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusTemplateMessageDTO.java index 09ac23ef..bcc34760 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusTemplateMessageDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusTemplateMessageDTO.java @@ -7,6 +7,7 @@ import java.util.Map; /** * 带业务参数的模板消息 + * @author: jeecg-boot */ @Data public class BusTemplateMessageDTO extends TemplateMessageDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java index d9c941a6..5e68fd73 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java @@ -7,6 +7,7 @@ import java.io.Serializable; /** * 普通消息 + * @author: jeecg-boot */ @Data public class MessageDTO implements Serializable { @@ -26,7 +27,7 @@ public class MessageDTO implements Serializable { /** * 发送给所有人 */ - protected boolean toAll; + protected Boolean toAll; /** * 消息主题 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateDTO.java index 63ea3d2d..39e8f9b9 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateDTO.java @@ -7,6 +7,7 @@ import java.util.Map; /** * 消息模板dto + * @author: jeecg-boot */ @Data public class TemplateDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateMessageDTO.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateMessageDTO.java index e03fa473..49427173 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateMessageDTO.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateMessageDTO.java @@ -6,6 +6,7 @@ import java.util.Map; /** * 模板消息 + * @author: jeecg-boot */ @Data public class TemplateMessageDTO extends TemplateDTO implements Serializable { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java index 6b7724e3..53b23971 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java @@ -58,7 +58,7 @@ public class Result implements Serializable { * @param code * @param message */ - public Result(Integer code,String message) { + public Result(Integer code, String message) { this.code = code; this.message = message; } @@ -70,7 +70,6 @@ public class Result implements Serializable { return this; } - @Deprecated public static Result ok() { Result r = new Result(); r.setSuccess(true); @@ -78,16 +77,16 @@ public class Result implements Serializable { return r; } - @Deprecated public static Result ok(String msg) { Result r = new Result(); r.setSuccess(true); r.setCode(CommonConstant.SC_OK_200); + //Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D + r.setResult((T) msg); r.setMessage(msg); return r; } - @Deprecated public static Result ok(T data) { Result r = new Result(); r.setSuccess(true); @@ -103,7 +102,13 @@ public class Result implements Serializable { return r; } - @Deprecated + /** + * 此方法是为了兼容升级所创建 + * + * @param msg + * @param + * @return + */ public static Result OK(String msg) { Result r = new Result(); r.setSuccess(true); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java index 23576070..7738835c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java @@ -14,9 +14,10 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.enums.ModuleType; +import org.jeecg.common.constant.enums.OperateTypeEnum; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; @@ -97,7 +98,7 @@ public class AutoLogAspect { //请求的参数 dto.setRequestParam(getReqestParams(request,joinPoint)); //设置IP地址 - dto.setIp(IPUtils.getIpAddr(request)); + dto.setIp(IpUtils.getIpAddr(request)); //获取登录用户信息 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); if(sysUser!=null){ @@ -120,25 +121,9 @@ public class AutoLogAspect { if (operateType > 0) { return operateType; } - if (methodName.startsWith("list")) { - return CommonConstant.OPERATE_TYPE_1; - } - if (methodName.startsWith("add")) { - return CommonConstant.OPERATE_TYPE_2; - } - if (methodName.startsWith("edit")) { - return CommonConstant.OPERATE_TYPE_3; - } - if (methodName.startsWith("delete")) { - return CommonConstant.OPERATE_TYPE_4; - } - if (methodName.startsWith("import")) { - return CommonConstant.OPERATE_TYPE_5; - } - if (methodName.startsWith("export")) { - return CommonConstant.OPERATE_TYPE_6; - } - return CommonConstant.OPERATE_TYPE_1; + //update-begin---author:wangshuai ---date:20220331 for:阿里云代码扫描规范(不允许任何魔法值出现在代码中)------------ + return OperateTypeEnum.getTypeByMethodName(methodName); + //update-end---author:wangshuai ---date:20220331 for:阿里云代码扫描规范(不允许任何魔法值出现在代码中)------------ } /** @@ -152,7 +137,7 @@ public class AutoLogAspect { private String getReqestParams(HttpServletRequest request, JoinPoint joinPoint) { String httpMethod = request.getMethod(); String params = ""; - if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) || "PATCH".equals(httpMethod)) { + if (CommonConstant.HTTP_POST.equals(httpMethod) || CommonConstant.HTTP_PUT.equals(httpMethod) || CommonConstant.HTTP_PATCH.equals(httpMethod)) { Object[] paramsArray = joinPoint.getArgs(); // java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false) // https://my.oschina.net/mengzhang6/blog/2395893 @@ -169,7 +154,8 @@ public class AutoLogAspect { PropertyFilter profilter = new PropertyFilter() { @Override public boolean apply(Object o, String name, Object value) { - if(value!=null && value.toString().length()>500){ + int length = 500; + if(value!=null && value.toString().length()>length){ return false; } return true; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java index abe49f1b..2e5053c7 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java @@ -42,11 +42,13 @@ import java.util.stream.Collectors; public class DictAspect { @Lazy @Autowired - private CommonAPI commonAPI; + private CommonAPI commonApi; @Autowired public RedisTemplate redisTemplate; - // 定义切点Pointcut + /** + * 定义切点Pointcut + */ @Pointcut("execution(public * org.jeecg.modules..*.*Controller.*(..)) || @annotation(org.jeecg.common.aspect.annotation.AutoDict)") public void excudeService() { } @@ -94,7 +96,7 @@ public class DictAspect { //step.1 筛选出加了 Dict 注解的字段列表 List dictFieldList = new ArrayList<>(); // 字典数据列表, key = 字典code,value=数据列表 - Map> dataListMap = new HashMap<>(); + Map> dataListMap = new HashMap<>(5); for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) { ObjectMapper mapper = new ObjectMapper(); @@ -135,7 +137,7 @@ public class DictAspect { this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(","))); } //date类型默认转换string格式化日期 - if (field.getType().getName().equals("java.util.Date")&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){ + if (CommonConstant.JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){ SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName())))); } @@ -204,7 +206,7 @@ public class DictAspect { */ private Map> translateAllDict(Map> dataListMap) { // 翻译后的字典文本,key=dictCode - Map> translText = new HashMap<>(); + Map> translText = new HashMap<>(5); // 需要翻译的数据(有些可以从redis缓存中获取,就不走数据库查询) List needTranslData = new ArrayList<>(); //step.1 先通过redis中获取缓存字典数据 @@ -258,7 +260,7 @@ public class DictAspect { String values = String.join(",", needTranslDataTable); log.info("translateDictFromTableByKeys.dictCode:" + dictCode); log.info("translateDictFromTableByKeys.values:" + values); - List texts = commonAPI.translateDictFromTableByKeys(table, text, code, values); + List texts = commonApi.translateDictFromTableByKeys(table, text, code, values); log.info("translateDictFromTableByKeys.result:" + texts); List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); list.addAll(texts); @@ -287,7 +289,7 @@ public class DictAspect { String values = String.join(",", needTranslData); log.info("translateManyDict.dictCodes:" + dictCodes); log.info("translateManyDict.values:" + values); - Map> manyDict = commonAPI.translateManyDict(dictCodes, values); + Map> manyDict = commonApi.translateManyDict(dictCodes, values); log.info("translateManyDict.result:" + manyDict); for (String dictCode : manyDict.keySet()) { List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); @@ -365,7 +367,7 @@ public class DictAspect { log.warn(e.getMessage()); } }else { - tmpValue= commonAPI.translateDictFromTable(table,text,code,k.trim()); + tmpValue= commonApi.translateDictFromTable(table,text,code,k.trim()); } }else { String keyString = String.format("sys:cache:dict::%s:%s",code,k.trim()); @@ -376,7 +378,7 @@ public class DictAspect { log.warn(e.getMessage()); } }else { - tmpValue = commonAPI.translateDict(code, k.trim()); + tmpValue = commonApi.translateDict(code, k.trim()); } } //update-end--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java index 34687f7a..292e209e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java @@ -9,6 +9,8 @@ import org.aspectj.lang.reflect.MethodSignature; import org.jeecg.common.api.CommonAPI; import org.jeecg.common.aspect.annotation.PermissionData; import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.system.query.QueryRuleEnum; import org.jeecg.common.system.util.JeecgDataAutorUtils; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.SysPermissionDataRuleModel; @@ -28,6 +30,7 @@ import java.util.List; * 当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息 * @Date 2019年4月10日 * @Version: 1.0 + * @author: jeecg-boot */ @Aspect @Component @@ -35,7 +38,7 @@ import java.util.List; public class PermissionDataAspect { @Lazy @Autowired - private CommonAPI commonAPI; + private CommonAPI commonApi; @Pointcut("@annotation(org.jeecg.common.aspect.annotation.PermissionData)") public void pointCut() { @@ -55,7 +58,7 @@ public class PermissionDataAspect { //update-begin-author:taoyan date:20211027 for:JTC-132【online报表权限】online报表带参数的菜单配置数据权限无效 //先判断是否online报表请求 // TODO 参数顺序调整有隐患 - if(requestPath.indexOf(UrlMatchEnum.CGREPORT_DATA.getMatch_url())>=0){ + if(requestPath.indexOf(UrlMatchEnum.CGREPORT_DATA.getMatchUrl())>=0){ // 获取地址栏参数 String urlParamString = request.getParameter(CommonConstant.ONL_REP_URL_PARAM_STR); if(oConvertUtils.isNotEmpty(urlParamString)){ @@ -67,12 +70,12 @@ public class PermissionDataAspect { String username = JwtUtil.getUserNameByToken(request); //查询数据权限信息 //TODO 微服务情况下也得支持缓存机制 - List dataRules = commonAPI.queryPermissionDataRule(component, requestPath, username); + List dataRules = commonApi.queryPermissionDataRule(component, requestPath, username); if(dataRules!=null && dataRules.size()>0) { //临时存储 JeecgDataAutorUtils.installDataSearchConditon(request, dataRules); //TODO 微服务情况下也得支持缓存机制 - SysUserCacheInfo userinfo = commonAPI.getCacheUser(username); + SysUserCacheInfo userinfo = commonApi.getCacheUser(username); JeecgDataAutorUtils.installUserInfo(request, userinfo); } return point.proceed(); @@ -83,7 +86,7 @@ public class PermissionDataAspect { if(oConvertUtils.isNotEmpty(requestPath)){ url = requestPath.replace("\\", "/"); url = url.replace("//", "/"); - if(url.indexOf("//")>=0){ + if(url.indexOf(SymbolConstant.DOUBLE_SLASH)>=0){ url = filterUrl(url); } /*if(url.startsWith("/")){ @@ -105,17 +108,19 @@ public class PermissionDataAspect { if(oConvertUtils.isNotEmpty(queryString)){ requestPath += "?" + queryString; } - if (requestPath.indexOf("&") > -1) {// 去掉其他参数(保留一个参数) 例如:loginController.do?login + // 去掉其他参数(保留一个参数) 例如:loginController.do?login + if (requestPath.indexOf(SymbolConstant.AND) > -1) { requestPath = requestPath.substring(0, requestPath.indexOf("&")); } - if(requestPath.indexOf("=")!=-1){ - if(requestPath.indexOf(".do")!=-1){ + if(requestPath.indexOf(QueryRuleEnum.EQ.getValue())!=-1){ + if(requestPath.indexOf(CommonConstant.SPOT_DO)!=-1){ requestPath = requestPath.substring(0,requestPath.indexOf(".do")+3); }else{ requestPath = requestPath.substring(0,requestPath.indexOf("?")); } } - requestPath = requestPath.substring(request.getContextPath().length() + 1);// 去掉项目路径 + // 去掉项目路径 + requestPath = requestPath.substring(request.getContextPath().length() + 1); return filterUrl(requestPath); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/UrlMatchEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/UrlMatchEnum.java index 4407fcea..c592ce4a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/UrlMatchEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/UrlMatchEnum.java @@ -6,16 +6,22 @@ package org.jeecg.common.aspect; * @Description: 请求URL与菜单路由URL转换规则(方便于采用菜单路由URL来配置数据权限规则) */ public enum UrlMatchEnum { + /**求URL与菜单路由URL转换规则 /online/cgform/api/getData/ */ CGFORM_DATA("/online/cgform/api/getData/", "/online/cgformList/"), + /**求URL与菜单路由URL转换规则 /online/cgform/api/exportXls/ */ CGFORM_EXCEL_DATA("/online/cgform/api/exportXls/", "/online/cgformList/"), + /**求URL与菜单路由URL转换规则 /online/cgform/api/getTreeData/ */ CGFORM_TREE_DATA("/online/cgform/api/getTreeData/", "/online/cgformList/"), + /**求URL与菜单路由URL转换规则 /online/cgreport/api/getColumnsAndData/ */ CGREPORT_DATA("/online/cgreport/api/getColumnsAndData/", "/online/cgreport/"), + /**求URL与菜单路由URL转换规则 /online/cgreport/api/exportXls/ */ CGREPORT_EXCEL_DATA("/online/cgreport/api/exportXls/", "/online/cgreport/"), + /**求URL与菜单路由URL转换规则 /online/cgreport/api/exportManySheetXls/ */ CGREPORT_EXCEL_DATA2("/online/cgreport/api/exportManySheetXls/", "/online/cgreport/"); - UrlMatchEnum(String url, String match_url) { + UrlMatchEnum(String url, String matchUrl) { this.url = url; - this.match_url = match_url; + this.matchUrl = matchUrl; } /** @@ -25,7 +31,7 @@ public enum UrlMatchEnum { /** * 菜单路由 URL前缀 (对应菜单路径) */ - private String match_url; + private String matchUrl; /** * 根据req url 获取到菜单配置路径(前端页面路由URL) @@ -41,14 +47,14 @@ public enum UrlMatchEnum { //如果遍历获取的type和参数type一致 if (url.indexOf(lr.url) != -1) { //返回type对象的desc - return url.replace(lr.url, lr.match_url); + return url.replace(lr.url, lr.matchUrl); } } return null; } - public String getMatch_url() { - return match_url; + public String getMatchUrl() { + return matchUrl; } // public static void main(String[] args) { // /** diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java index 5accee84..871ff447 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java @@ -6,9 +6,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 类描述: 字典注解 - * 作 者: dangzhenghui - * 日 期: 2019年03月17日-下午9:37:16 + * 字典注解 + * @author: dangzhenghui + * @date: 2019年03月17日-下午9:37:16 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/OnlineAuth.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/OnlineAuth.java index 072d6afc..0100d070 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/OnlineAuth.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/OnlineAuth.java @@ -4,6 +4,7 @@ import java.lang.annotation.*; /** * online请求拦截专用注解 + * @author: jeecg-boot */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index a53929c4..507dd720 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -1,5 +1,9 @@ package org.jeecg.common.constant; +/** + * @Description: 通用常量 + * @author: jeecg-boot + */ public interface CommonConstant { /** @@ -75,8 +79,8 @@ public interface CommonConstant { public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:"; /** 登录用户Token令牌缓存KEY前缀 */ public static final String PREFIX_USER_TOKEN = "prefix_user_token_"; - /** Token缓存时间:3600秒即一小时 */ - public static final int TOKEN_EXPIRE_TIME = 3600; +// /** Token缓存时间:3600秒即一小时 */ +// public static final int TOKEN_EXPIRE_TIME = 3600; /** 登录二维码 */ public static final String LOGIN_QRCODE_PRE = "QRCODELOGIN:"; @@ -339,4 +343,34 @@ public interface CommonConstant { /**ONLINE 报表权限用 从request中获取地址栏后的参数*/ String ONL_REP_URL_PARAM_STR="onlRepUrlParamStr"; + /**POST请求*/ + String HTTP_POST = "POST"; + + /**PUT请求*/ + String HTTP_PUT = "PUT"; + + /**PATCH请求*/ + String HTTP_PATCH = "PATCH"; + + /**未知的*/ + String UNKNOWN = "unknown"; + + /**字符串http*/ + String STR_HTTP = "http"; + + /**String 类型的空值*/ + String STRING_NULL = "null"; + + /**java.util.Date 包*/ + String JAVA_UTIL_DATE = "java.util.Date"; + + /**.do*/ + String SPOT_DO = ".do"; + + + /**前端vue版本标识*/ + String VERSION="X-Version"; + + /**前端vue版本*/ + String VERSION_VUE3="vue3"; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonSendStatus.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonSendStatus.java index 369f485a..c69218c7 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonSendStatus.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonSendStatus.java @@ -6,15 +6,26 @@ package org.jeecg.common.constant; * */ public interface CommonSendStatus { - - public static final String UNPUBLISHED_STATUS_0 = "0"; //未发布 - - public static final String PUBLISHED_STATUS_1 = "1"; //已发布 - - public static final String REVOKE_STATUS_2 = "2"; //撤销 - //app端推送会话标识后缀 - public static final String APP_SESSION_SUFFIX = "_app"; //app端推送会话标识后缀 + /** + * 未发布 + */ + public static final String UNPUBLISHED_STATUS_0 = "0"; + + /** + * 已发布 + */ + public static final String PUBLISHED_STATUS_1 = "1"; + + /** + * 撤销 + */ + public static final String REVOKE_STATUS_2 = "2"; + + /** + * app端推送会话标识后缀 + */ + public static final String APP_SESSION_SUFFIX = "_app"; /**流程催办——系统通知消息模板*/ diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java index 7f13c36a..95f1bc34 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java @@ -1,16 +1,33 @@ package org.jeecg.common.constant; /** * 数据库上下文常量 + * @author: jeecg-boot */ public interface DataBaseConstant { //*********数据库类型**************************************** + + /**MYSQL数据库*/ public static final String DB_TYPE_MYSQL = "MYSQL"; + + /** ORACLE*/ public static final String DB_TYPE_ORACLE = "ORACLE"; - public static final String DB_TYPE_DM = "DM";//达梦数据库 + + /**达梦数据库*/ + public static final String DB_TYPE_DM = "DM"; + + /**postgreSQL达梦数据库*/ public static final String DB_TYPE_POSTGRESQL = "POSTGRESQL"; + + /**sqlserver数据库*/ public static final String DB_TYPE_SQLSERVER = "SQLSERVER"; + + /**mariadb 数据库*/ public static final String DB_TYPE_MARIADB = "MARIADB"; + + /**DB2 数据库*/ public static final String DB_TYPE_DB2 = "DB2"; + + /**HSQL 数据库*/ public static final String DB_TYPE_HSQL = "HSQL"; // // 数据库类型,对应 database_type 字典 @@ -131,4 +148,9 @@ public interface DataBaseConstant { * 租户ID 数据库字段名 */ String TENANT_ID_TABLE = "tenant_id"; + + /** + * sql语句 where + */ + String SQL_WHERE = "where"; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ProvinceCityArea.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ProvinceCityArea.java index 44fe009f..2c4596bf 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ProvinceCityArea.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ProvinceCityArea.java @@ -13,6 +13,10 @@ import java.util.Scanner; import java.util.Set; import java.util.List; +/** + * @Description: 省市区 + * @author: jeecg-boot + */ @Component("pca") public class ProvinceCityArea { List areaList; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java index b54dc342..0d8711e8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java @@ -26,10 +26,13 @@ package org.jeecg.common.constant; public interface ServiceNameConstants { /** - * 系统管理 admin + * 微服务名:系统管理模块 */ - String SYSTEM_SERVICE = "jeecg-system"; - String SYSTEM_ONLINE = "jeecg-online"; + String SERVICE_SYSTEM = "jeecg-system"; + /** + * 微服务名:Demo模块 + */ + String SERVICE_DEMO = "jeecg-demo"; /** * gateway通过header传递根路径 basePath diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/SymbolConstant.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/SymbolConstant.java new file mode 100644 index 00000000..5156a914 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/SymbolConstant.java @@ -0,0 +1,89 @@ +package org.jeecg.common.constant; + +/** + * @Description: 符号和特殊符号常用类 + * @author: wangshuai + * @date: 2022年03月30日 17:44 + */ +public class SymbolConstant { + + /** + * 符号:点 + */ + public static final String SPOT = "."; + + /** + * 符号:双斜杠 + */ + public static final String DOUBLE_BACKSLASH = "\\"; + + /** + * 符号:冒号 + */ + public static final String COLON = ":"; + + /** + * 符号:逗号 + */ + public static final String COMMA = ","; + + /** + * 符号:左花括号 } + */ + public static final String LEFT_CURLY_BRACKET = "{"; + + /** + * 符号:右花括号 } + */ + public static final String RIGHT_CURLY_BRACKET = "}"; + + /** + * 符号:井号 # + */ + public static final String WELL_NUMBER = "#"; + + /** + * 符号:单斜杠 + */ + public static final String SINGLE_SLASH = "/"; + + /** + * 符号:双斜杠 + */ + public static final String DOUBLE_SLASH = "//"; + + /** + * 符号:感叹号 + */ + public static final String EXCLAMATORY_MARK = "!"; + + /** + * 符号:下划线 + */ + public static final String UNDERLINE = "_"; + + /** + * 符号:单引号 + */ + public static final String SINGLE_QUOTATION_MARK = "'"; + + /** + * 符号:星号 + */ + public static final String ASTERISK = "*"; + + /** + * 符号:百分号 + */ + public static final String PERCENT_SIGN = "%"; + + /** + * 符号:美元 $ + */ + public static final String DOLLAR = "$"; + + /** + * 符号:和 & + */ + public static final String AND = "&"; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/VXESocketConst.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/VXESocketConst.java index 210562a2..75594630 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/VXESocketConst.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/VXESocketConst.java @@ -2,8 +2,9 @@ package org.jeecg.common.constant; /** * VXESocket 常量 + * @author: jeecg-boot */ -public class VXESocketConst { +public class VxeSocketConst { /** * 消息类型 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java index fd25dddc..0265e755 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java @@ -7,6 +7,7 @@ import java.util.Map; /** * online表单枚举 代码生成器用到 + * @author: jeecg-boot */ public enum CgformEnum { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/LowAppAopEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/LowAppAopEnum.java index 638c80ba..b865cadb 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/LowAppAopEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/LowAppAopEnum.java @@ -3,6 +3,7 @@ package org.jeecg.common.constant.enums; /** * LowApp 切面注解枚举 * @date 2022-1-5 + * @author: jeecg-boot */ public enum LowAppAopEnum { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ModuleType.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ModuleType.java index e6cd7650..5d3aa1ed 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ModuleType.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ModuleType.java @@ -2,6 +2,7 @@ package org.jeecg.common.constant.enums; /** * 日志按模块分类 + * @author: jeecg-boot */ public enum ModuleType { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/OperateTypeEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/OperateTypeEnum.java new file mode 100644 index 00000000..a438b403 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/OperateTypeEnum.java @@ -0,0 +1,95 @@ +package org.jeecg.common.constant.enums; + +import org.jeecg.common.constant.CommonConstant; + +/** + * @Description: 操作类型 + * @author: jeecg-boot + * @date: 2022/3/31 10:05 + */ +public enum OperateTypeEnum { + + /** + * 列表 + */ + LIST(CommonConstant.OPERATE_TYPE_1, "list"), + + /** + * 新增 + */ + ADD(CommonConstant.OPERATE_TYPE_2, "add"), + + /** + * 编辑 + */ + EDIT(CommonConstant.OPERATE_TYPE_3, "edit"), + + /** + * 删除 + */ + DELETE(CommonConstant.OPERATE_TYPE_4, "delete"), + + /** + * 导入 + */ + IMPORT(CommonConstant.OPERATE_TYPE_5, "import"), + + /** + * 导出 + */ + EXPORT(CommonConstant.OPERATE_TYPE_6, "export"); + + /** + * 类型 1列表,2新增,3编辑,4删除,5导入,6导出 + */ + int type; + + /** + * 编码(请求方式) + */ + String code; + + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + /** + * 构造器 + * + * @param type 类型 + * @param code 编码(请求方式) + */ + OperateTypeEnum(int type, String code) { + this.type = type; + this.code = code; + } + + + /** + * 根据请求名称匹配 + * + * @param methodName 请求名称 + * @return Integer 类型 + */ + public static Integer getTypeByMethodName(String methodName) { + for (OperateTypeEnum e : OperateTypeEnum.values()) { + if (methodName.startsWith(e.getCode())) { + return e.getType(); + } + } + return CommonConstant.OPERATE_TYPE_1; + } +} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java index dbb65480..09d9c103 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java @@ -8,11 +8,14 @@ import java.util.List; * 首页自定义 * 通过角色编码与首页组件路径配置 * 枚举的顺序有权限高低权重作用(也就是配置多个角色,在前面的角色首页,会优先生效) + * @author: jeecg-boot */ public enum RoleIndexConfigEnum { + /**首页自定义 admin*/ ADMIN("admin", "dashboard/Analysis"), //TEST("test", "dashboard/IndexChart"), + /**首页自定义 hr*/ HR("hr", "dashboard/IndexBdc"); //DM("dm", "dashboard/IndexTask"), diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java index b57da23e..e30a6c85 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java @@ -29,9 +29,15 @@ public class JeecgElasticsearchTemplate { /** Elasticsearch 的版本号 */ private String version = null; - // ElasticSearch 最大可返回条目数 + /**ElasticSearch 最大可返回条目数*/ public static final int ES_MAX_SIZE = 10000; + /**es7*/ + public static final String IE_SEVEN = "7"; + + /**url not found 404*/ + public static final String URL_NOT_FOUND = "404 Not Found"; + public JeecgElasticsearchTemplate(@Value("${jeecg.elasticsearch.cluster-nodes}") String baseUrl, @Value("${jeecg.elasticsearch.check-enabled}") boolean checkEnabled) { log.debug("JeecgElasticsearchTemplate BaseURL:" + baseUrl); if (StringUtils.isNotEmpty(baseUrl)) { @@ -81,7 +87,7 @@ public class JeecgElasticsearchTemplate { /** * cat 查询ElasticSearch系统数据,返回json */ - public ResponseEntity _cat(String urlAfter, Class responseType) { + private ResponseEntity cat(String urlAfter, Class responseType) { String url = this.getBaseUrl().append("/_cat").append(urlAfter).append("?").append(FORMAT_JSON).toString(); return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType); } @@ -106,7 +112,7 @@ public class JeecgElasticsearchTemplate { if (!StringUtils.isEmpty(indexName)) { urlAfter.append("/").append(indexName.trim().toLowerCase()); } - return _cat(urlAfter.toString(), JSONArray.class).getBody(); + return cat(urlAfter.toString(), JSONArray.class).getBody(); } /** @@ -205,7 +211,7 @@ public class JeecgElasticsearchTemplate { String url = this.getBaseUrl(indexName, typeName).append("/_mapping?").append(FORMAT_JSON).toString(); // 针对 es 7.x 版本做兼容 this.getElasticsearchVersion(); - if (oConvertUtils.isNotEmpty(this.version) && this.version.startsWith("7")) { + if (oConvertUtils.isNotEmpty(this.version) && this.version.startsWith(IE_SEVEN)) { url += "&include_type_name=true"; } log.info("getIndexMapping-url:" + url); @@ -243,7 +249,7 @@ public class JeecgElasticsearchTemplate { return RestUtil.get(url); } catch (org.springframework.web.client.HttpClientErrorException e) { String message = e.getMessage(); - if (message != null && message.contains("404 Not Found")) { + if (message != null && message.contains(URL_NOT_FOUND)) { return null; } throw e; @@ -259,7 +265,7 @@ public class JeecgElasticsearchTemplate { */ public Map getIndexMappingFormat(String indexName, String typeName, Class clazz) { JSONObject mapping = this.getIndexMapping(indexName, typeName); - Map map = new HashMap<>(); + Map map = new HashMap<>(5); if (mapping == null) { return map; } @@ -362,7 +368,7 @@ public class JeecgElasticsearchTemplate { */ public boolean saveBatch(String indexName, String typeName, JSONArray dataList) { String url = this.getBaseUrl().append("/_bulk").append("?refresh=wait_for").toString(); - StringBuilder bodySB = new StringBuilder(); + StringBuilder bodySb = new StringBuilder(); for (int i = 0; i < dataList.size(); i++) { JSONObject data = dataList.getJSONObject(i); String id = data.getString("id"); @@ -374,14 +380,14 @@ public class JeecgElasticsearchTemplate { actionInfo.put("_index", indexName); actionInfo.put("_type", typeName); action.put("create", actionInfo); - bodySB.append(action.toJSONString()).append("\n"); + bodySb.append(action.toJSONString()).append("\n"); // 该行的数据 data.remove("id"); - bodySB.append(data.toJSONString()).append("\n"); + bodySb.append(data.toJSONString()).append("\n"); } - System.out.println("+-+-+-: bodySB.toString(): " + bodySB.toString()); + System.out.println("+-+-+-: bodySb.toString(): " + bodySb.toString()); HttpHeaders headers = RestUtil.getHeaderApplicationJson(); - RestUtil.request(url, HttpMethod.PUT, headers, null, bodySB, JSONObject.class); + RestUtil.request(url, HttpMethod.PUT, headers, null, bodySb, JSONObject.class); return true; } @@ -437,16 +443,16 @@ public class JeecgElasticsearchTemplate { } /** - * @param _source (源滤波器)指定返回的字段,传null返回所有字段 + * @param source (源滤波器)指定返回的字段,传null返回所有字段 * @param query * @param from 从第几条数据开始 * @param size 返回条目数 * @return { "query": query } */ - public JSONObject buildQuery(List _source, JSONObject query, int from, int size) { + public JSONObject buildQuery(List source, JSONObject query, int from, int size) { JSONObject json = new JSONObject(); - if (_source != null) { - json.put("_source", _source); + if (source != null) { + json.put("_source", source); } json.put("query", query); json.put("from", from); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java index d9bcacf8..6f7205be 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java @@ -1,5 +1,9 @@ package org.jeecg.common.exception; +/** + * @Description: jeecg-boot自定义401异常 + * @author: jeecg-boot + */ public class JeecgBoot401Exception extends RuntimeException { private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java index 703b7e70..fe0706c0 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java @@ -1,5 +1,9 @@ package org.jeecg.common.exception; +/** + * @Description: jeecg-boot自定义异常 + * @author: jeecg-boot + */ public class JeecgBootException extends RuntimeException { private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java index 2c17c81a..bd688846 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java @@ -1,10 +1,10 @@ package org.jeecg.common.exception; -import io.lettuce.core.RedisConnectionException; +import cn.hutool.core.util.ObjectUtil; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; import org.jeecg.common.api.vo.Result; -import org.springframework.beans.factory.annotation.Value; +import org.jeecg.common.enums.SentinelErrorInfoEnum; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.data.redis.connection.PoolException; @@ -27,8 +27,7 @@ import lombok.extern.slf4j.Slf4j; @RestControllerAdvice @Slf4j public class JeecgBootExceptionHandler { - @Value("${spring.servlet.multipart.max-file-size}") - private String maxFileSize; + /** * 处理自定义异常 */ @@ -69,6 +68,13 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(Exception.class) public Result handleException(Exception e){ log.error(e.getMessage(), e); + //update-begin---author:zyf ---date:20220411 for:处理Sentinel限流自定义异常 + Throwable throwable = e.getCause(); + SentinelErrorInfoEnum errorInfoEnum = SentinelErrorInfoEnum.getErrorByException(throwable); + if (ObjectUtil.isNotEmpty(errorInfoEnum)) { + return Result.error(errorInfoEnum.getError()); + } + //update-end---author:zyf ---date:20220411 for:处理Sentinel限流自定义异常 return Result.error("操作失败,"+e.getMessage()); } @@ -78,7 +84,7 @@ public class JeecgBootExceptionHandler { * @return */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public Result HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){ + public Result httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){ StringBuffer sb = new StringBuffer(); sb.append("不支持"); sb.append(e.getMethod()); @@ -102,7 +108,7 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public Result handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { log.error(e.getMessage(), e); - return Result.error(String.format("文件大小超出%s限制, 请压缩或降低文件质量! ", maxFileSize)); + return Result.error("文件大小超出10MB限制, 请压缩或降低文件质量! "); } @ExceptionHandler(DataIntegrityViolationException.class) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/handler/IFillRuleHandler.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/handler/IFillRuleHandler.java index 7ca68a97..7c6478b3 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/handler/IFillRuleHandler.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/handler/IFillRuleHandler.java @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject; public interface IFillRuleHandler { /** + * 填值规则 * @param params 页面配置固定参数 * @param formData 动态表单参数 * @return diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java index cff9a269..c665a09e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java @@ -37,7 +37,7 @@ import java.util.stream.Collectors; */ @Slf4j public class JeecgController> { - //issues/2933 JeecgController注入service时改用protected修饰,能避免重复引用service + /**issues/2933 JeecgController注入service时改用protected修饰,能避免重复引用service*/ @Autowired protected S service; @@ -68,7 +68,8 @@ public class JeecgController> { // Step.3 AutoPoi 导出Excel ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下 + //此处设置的filename无效 ,前端会重更新设置一下 + mv.addObject(NormalExcelConstants.FILE_NAME, title); mv.addObject(NormalExcelConstants.CLASS, clazz); //update-begin--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置-------------------- ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title); @@ -111,18 +112,22 @@ public class JeecgController> { } else { exportList = records; } - Map map = new HashMap(); + Map map = new HashMap<>(5); ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title+i,upLoadPath); exportParams.setType(ExcelType.XSSF); - //map.put("title",exportParams);//表格Title - map.put(NormalExcelConstants.PARAMS,exportParams);//表格Title - map.put(NormalExcelConstants.CLASS,clazz);//表格对应实体 - map.put(NormalExcelConstants.DATA_LIST, exportList);//数据集合 + //map.put("title",exportParams); + //表格Title + map.put(NormalExcelConstants.PARAMS,exportParams); + //表格对应实体 + map.put(NormalExcelConstants.CLASS,clazz); + //数据集合 + map.put(NormalExcelConstants.DATA_LIST, exportList); listMap.add(map); } // Step.4 AutoPoi 导出Excel ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下 + //此处设置的filename无效 ,前端会重更新设置一下 + mv.addObject(NormalExcelConstants.FILE_NAME, title); mv.addObject(NormalExcelConstants.MAP_LIST, listMap); return mv; } @@ -164,7 +169,8 @@ public class JeecgController> { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java index 51deae42..2eebaffd 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java @@ -1,6 +1,7 @@ package org.jeecg.common.system.base.entity; import java.io.Serializable; + import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; @@ -23,30 +24,45 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class JeecgEntity implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "ID") + private java.lang.String id; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + @Excel(name = "创建人", width = 15) + private java.lang.String createBy; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + + /** + * 更新人 + */ + @ApiModelProperty(value = "更新人") + @Excel(name = "更新人", width = 15) + private java.lang.String updateBy; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; - /** ID */ - @TableId(type = IdType.ASSIGN_ID) - @ApiModelProperty(value = "ID") - private java.lang.String id; - /** 创建人 */ - @ApiModelProperty(value = "创建人") - @Excel(name = "创建人", width = 15) - private java.lang.String createBy; - /** 创建时间 */ - @ApiModelProperty(value = "创建时间") - @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private java.util.Date createTime; - /** 更新人 */ - @ApiModelProperty(value = "更新人") - @Excel(name = "更新人", width = 15) - private java.lang.String updateBy; - /** 更新时间 */ - @ApiModelProperty(value = "更新时间") - @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private java.util.Date updateTime; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/MatchTypeEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/MatchTypeEnum.java index 9c057d08..d19342de 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/MatchTypeEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/MatchTypeEnum.java @@ -9,7 +9,9 @@ import org.jeecg.common.util.oConvertUtils; */ public enum MatchTypeEnum { + /**查询链接规则 AND*/ AND("AND"), + /**查询链接规则 OR*/ OR("OR"); private String value; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryCondition.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryCondition.java index d239781e..566280db 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryCondition.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryCondition.java @@ -2,6 +2,10 @@ package org.jeecg.common.system.query; import java.io.Serializable; +/** + * @Description: QueryCondition + * @author: jeecg-boot + */ public class QueryCondition implements Serializable { private static final long serialVersionUID = 4740166316629191651L; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java index 8ff0a9f3..523ffd00 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java @@ -15,6 +15,7 @@ import java.util.stream.Collectors; import org.apache.commons.beanutils.PropertyUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.system.util.JeecgDataAutorUtils; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.SysPermissionDataRuleModel; @@ -30,6 +31,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; +/** + * @Description: 查询生成器 + * @author: jeecg-boot + */ @Slf4j public class QueryGenerator { public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN"; @@ -63,14 +68,20 @@ public class QueryGenerator { /**mysql 模糊查询之特殊字符下划线 (_、\)*/ public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%"; - + + /**日期格式化yyyy-MM-dd*/ + public static final String YYYY_MM_DD = "yyyy-MM-dd"; + + /**to_date*/ + public static final String TO_DATE = "to_date"; + /**时间格式化 */ - private static final ThreadLocal local = new ThreadLocal(); + private static final ThreadLocal LOCAL = new ThreadLocal(); private static SimpleDateFormat getTime(){ - SimpleDateFormat time = local.get(); + SimpleDateFormat time = LOCAL.get(); if(time == null){ time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - local.set(time); + LOCAL.set(time); } return time; } @@ -107,7 +118,7 @@ public class QueryGenerator { */ //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 - PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj); + PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(searchObj); Map ruleMap = getRuleMap(); //权限规则自定义SQL表达式 @@ -120,7 +131,7 @@ public class QueryGenerator { String name, type, column; // update-begin--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题 - Map fieldColumnMap = new HashMap(); + Map fieldColumnMap = new HashMap<>(5); for (int i = 0; i < origDescriptors.length; i++) { //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况 name = origDescriptors[i].getName(); @@ -217,7 +228,7 @@ public class QueryGenerator { } } - //多字段排序 TODO 需要修改前端 + /**多字段排序 TODO 需要修改前端*/ private static void doMultiFieldsOrder(QueryWrapper queryWrapper,Map parameterMap) { String column=null,order=null; if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) { @@ -327,6 +338,7 @@ public class QueryGenerator { case "boolean": queryValue = Boolean.parseBoolean(valueStr); break; + default: } } catch (Exception e) { log.error("高级查询值转换失败:", e); @@ -376,20 +388,27 @@ public class QueryGenerator { //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284------------------- //TODO 此处规则,只适用于 le lt ge gt // step 2 .>= =< - if (rule == null && val.length() >= 3) { - if(QUERY_SEPARATE_KEYWORD.equals(val.substring(2, 3))){ + int length2 = 2; + int length3 = 3; + if (rule == null && val.length() >= length3) { + if(QUERY_SEPARATE_KEYWORD.equals(val.substring(length2, length3))){ rule = QueryRuleEnum.getByValue(val.substring(0, 2)); } } // step 1 .> < - if (rule == null && val.length() >= 2) { - if(QUERY_SEPARATE_KEYWORD.equals(val.substring(1, 2))){ + if (rule == null && val.length() >= length2) { + if(QUERY_SEPARATE_KEYWORD.equals(val.substring(1, length2))){ rule = QueryRuleEnum.getByValue(val.substring(0, 1)); } } //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284--------------------- // step 3 like + //update-begin-author:taoyan for: /issues/3382 默认带*就走模糊,但是如果只有一个*,那么走等于查询 + if(rule == null && val.equals(STAR)){ + rule = QueryRuleEnum.EQ; + } + //update-end-author:taoyan for: /issues/3382 默认带*就走模糊,但是如果只有一个*,那么走等于查询 if (rule == null && val.contains(STAR)) { if (val.startsWith(STAR) && val.endsWith(STAR)) { rule = QueryRuleEnum.LIKE; @@ -416,7 +435,7 @@ public class QueryGenerator { //update-begin--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284--------------------- //特殊处理:Oracle的表达式to_date('xxx','yyyy-MM-dd')含有逗号,会被识别为in查询,转为等于查询 - if(rule == QueryRuleEnum.IN && val.indexOf("yyyy-MM-dd")>=0 && val.indexOf("to_date")>=0){ + if(rule == QueryRuleEnum.IN && val.indexOf(YYYY_MM_DD)>=0 && val.indexOf(TO_DATE)>=0){ rule = QueryRuleEnum.EQ; } //update-end--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284--------------------- @@ -439,6 +458,11 @@ public class QueryGenerator { return value; } String val = (value + "").toString().trim(); + //update-begin-author:taoyan date:20220302 for: 查询条件的值为等号(=)bug #3443 + if(QueryRuleEnum.EQ.getValue().equals(val)){ + return val; + } + //update-end-author:taoyan date:20220302 for: 查询条件的值为等号(=)bug #3443 if (rule == QueryRuleEnum.LIKE) { value = val.substring(1, val.length() - 1); //mysql 模糊查询之特殊字符下划线 (_、\) @@ -538,7 +562,8 @@ public class QueryGenerator { */ private static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException { Date date = null; - if(value.length()==10) { + int length = 10; + if(value.length()==length) { if(rule==QueryRuleEnum.GE) { //比较大于 date = getTime().parse(value + " 00:00:00"); @@ -633,7 +658,7 @@ public class QueryGenerator { * @return */ public static Map getRuleMap() { - Map ruleMap = new HashMap(); + Map ruleMap = new HashMap<>(5); List list =JeecgDataAutorUtils.loadDataSearchConditon(); if(list != null&&list.size()>0){ if(list.get(0)==null){ @@ -664,7 +689,8 @@ public class QueryGenerator { addEasyQuery(queryWrapper, name, rule, converRuleValue(dataRule.getRuleValue())); }else if (propertyType.equals(Date.class)) { String dateStr =converRuleValue(dataRule.getRuleValue()); - if(dateStr.length()==10){ + int length = 10; + if(dateStr.length()==length){ addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.date_sdf.get())); }else{ addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get())); @@ -836,15 +862,15 @@ public class QueryGenerator { */ private static String getFieldConditionValue(Object value,boolean isString, String dataBaseType) { String str = value.toString().trim(); - if(str.startsWith("!")) { + if(str.startsWith(SymbolConstant.EXCLAMATORY_MARK)) { str = str.substring(1); - }else if(str.startsWith(">=")) { + }else if(str.startsWith(QueryRuleEnum.GE.getValue())) { str = str.substring(2); - }else if(str.startsWith("<=")) { + }else if(str.startsWith(QueryRuleEnum.LE.getValue())) { str = str.substring(2); - }else if(str.startsWith(">")) { + }else if(str.startsWith(QueryRuleEnum.GT.getValue())) { str = str.substring(1); - }else if(str.startsWith("<")) { + }else if(str.startsWith(QueryRuleEnum.LT.getValue())) { str = str.substring(1); }else if(str.indexOf(QUERY_COMMA_ESCAPE)>0) { str = str.replaceAll("\\+\\+", COMMA); @@ -860,7 +886,7 @@ public class QueryGenerator { } }else { // 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的 - if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith("'") && str.startsWith("'")){ + if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){ return " N"+str; } return value.toString(); @@ -891,34 +917,34 @@ public class QueryGenerator { private static String getLikeConditionValue(Object value) { String str = value.toString().trim(); - if(str.startsWith("*") && str.endsWith("*")) { + if(str.startsWith(SymbolConstant.ASTERISK) && str.endsWith(SymbolConstant.ASTERISK)) { if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ return "N'%"+str.substring(1,str.length()-1)+"%'"; }else{ return "'%"+str.substring(1,str.length()-1)+"%'"; } - }else if(str.startsWith("*")) { + }else if(str.startsWith(SymbolConstant.ASTERISK)) { if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ return "N'%"+str.substring(1)+"'"; }else{ return "'%"+str.substring(1)+"'"; } - }else if(str.endsWith("*")) { + }else if(str.endsWith(SymbolConstant.ASTERISK)) { if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ return "N'"+str.substring(0,str.length()-1)+"%'"; }else{ return "'"+str.substring(0,str.length()-1)+"%'"; } }else { - if(str.indexOf("%")>=0) { + if(str.indexOf(SymbolConstant.PERCENT_SIGN)>=0) { if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){ - if(str.startsWith("'") && str.endsWith("'")){ + if(str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){ return "N"+str; }else{ return "N"+"'"+str+"'"; } }else{ - if(str.startsWith("'") && str.endsWith("'")){ + if(str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){ return str; }else{ return "'"+str+"'"; @@ -944,11 +970,11 @@ public class QueryGenerator { StringBuffer sb = new StringBuffer(); //权限查询 Map ruleMap = getRuleMap(); - PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz); - String sql_and = " and "; + PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(clazz); + String sqlAnd = " and "; for (String c : ruleMap.keySet()) { if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ - sb.append(sql_and+getSqlRuleValue(ruleMap.get(c).getRuleValue())); + sb.append(sqlAnd+getSqlRuleValue(ruleMap.get(c).getRuleValue())); } } String name, column; @@ -973,7 +999,7 @@ public class QueryGenerator { value = NumberUtils.parseNumber(dataRule.getRuleValue(),propType); } String filedSql = getSingleSqlByRule(rule, oConvertUtils.camelToUnderline(column), value,isString); - sb.append(sql_and+filedSql); + sb.append(sqlAnd+filedSql); } } log.info("query auth sql is:"+sb.toString()); @@ -989,7 +1015,7 @@ public class QueryGenerator { public static void installAuthMplus(QueryWrapper queryWrapper,Class clazz) { //权限查询 Map ruleMap = getRuleMap(); - PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz); + PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(clazz); for (String c : ruleMap.keySet()) { if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); @@ -1028,7 +1054,7 @@ public class QueryGenerator { StringBuffer sb = new StringBuffer(); //权限查询 Map ruleMap = getRuleMap(); - String sql_and = " and "; + String sqlAnd = " and "; for (String c : ruleMap.keySet()) { SysPermissionDataRuleModel dataRule = ruleMap.get(c); String ruleValue = dataRule.getRuleValue(); @@ -1036,7 +1062,7 @@ public class QueryGenerator { continue; } if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ - sb.append(sql_and+getSqlRuleValue(ruleValue)); + sb.append(sqlAnd+getSqlRuleValue(ruleValue)); }else{ boolean isString = false; ruleValue = ruleValue.trim(); @@ -1047,7 +1073,7 @@ public class QueryGenerator { QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); String value = converRuleValue(ruleValue); String filedSql = getSingleSqlByRule(rule, c, value,isString); - sb.append(sql_and+filedSql); + sb.append(sqlAnd+filedSql); } } log.info("query auth sql is = "+sb.toString()); @@ -1136,8 +1162,8 @@ public class QueryGenerator { */ private static String specialStrConvert(String value) { if (DataBaseConstant.DB_TYPE_MYSQL.equals(getDbType()) || DataBaseConstant.DB_TYPE_MARIADB.equals(getDbType())) { - String[] special_str = QueryGenerator.LIKE_MYSQL_SPECIAL_STRS.split(","); - for (String str : special_str) { + String[] specialStr = QueryGenerator.LIKE_MYSQL_SPECIAL_STRS.split(","); + for (String str : specialStr) { if (value.indexOf(str) !=-1) { value = value.replace(str, "\\" + str); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java index 1bc35ffc..c31bf2b3 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java @@ -9,18 +9,31 @@ import org.jeecg.common.util.oConvertUtils; */ public enum QueryRuleEnum { + /**查询规则 大于*/ GT(">","gt","大于"), + /**查询规则 大于等于*/ GE(">=","ge","大于等于"), + /**查询规则 小于*/ LT("<","lt","小于"), + /**查询规则 小于等于*/ LE("<=","le","小于等于"), + /**查询规则 等于*/ EQ("=","eq","等于"), + /**查询规则 不等于*/ NE("!=","ne","不等于"), + /**查询规则 包含*/ IN("IN","in","包含"), + /**查询规则 全模糊*/ LIKE("LIKE","like","全模糊"), + /**查询规则 左模糊*/ LEFT_LIKE("LEFT_LIKE","left_like","左模糊"), + /**查询规则 右模糊*/ RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"), + /**查询规则 带加号等于*/ EQ_WITH_ADD("EQWITHADD","eq_with_add","带加号等于"), + /**查询规则 多词模糊匹配*/ LIKE_WITH_AND("LIKEWITHAND","like_with_and","多词模糊匹配————暂时未用上"), + /**查询规则 自定义SQL片段*/ SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段"); private String value; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java index 125062f0..9dc53e54 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java @@ -32,7 +32,8 @@ public class JeecgDataAutorUtils { */ public static synchronized void installDataSearchConditon(HttpServletRequest request, List dataRules) { @SuppressWarnings("unchecked") - List list = (List)loadDataSearchConditon();// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST + // 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST + List list = (List)loadDataSearchConditon(); if (list==null) { // 2.如果不存在,则new一个list list = new ArrayList(); @@ -40,7 +41,8 @@ public class JeecgDataAutorUtils { for (SysPermissionDataRuleModel tsDataRule : dataRules) { list.add(tsDataRule); } - request.setAttribute(MENU_DATA_AUTHOR_RULES, list); // 3.往list里面增量存指 + // 3.往list里面增量存指 + request.setAttribute(MENU_DATA_AUTHOR_RULES, list); } /** @@ -59,7 +61,7 @@ public class JeecgDataAutorUtils { * * @return */ - public static synchronized String loadDataSearchConditonSQLString() { + public static synchronized String loadDataSearchConditonSqlString() { return (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL); } @@ -70,7 +72,7 @@ public class JeecgDataAutorUtils { * @param sql */ public static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) { - String ruleSql = (String)loadDataSearchConditonSQLString(); + String ruleSql = (String) loadDataSearchConditonSqlString(); if (!StringUtils.hasText(ruleSql)) { request.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java index f6247d88..73fc14ae 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java @@ -20,6 +20,7 @@ import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SysUserCacheInfo; @@ -34,8 +35,9 @@ import org.jeecg.common.util.oConvertUtils; **/ public class JwtUtil { - // Token过期时间2小时(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准) - public static final long EXPIRE_TIME = 2 * 60 * 60 * 1000; + /**Token有效期为1小时(Token在reids中缓存时间为两倍)*/ + public static final long EXPIRE_TIME = 60 * 60 * 1000; + static final String WELL_NUMBER = SymbolConstant.WELL_NUMBER + SymbolConstant.LEFT_CURLY_BRACKET; /** * @@ -45,6 +47,8 @@ public class JwtUtil { */ public static void responseError(ServletResponse response, Integer code, String errorMsg) { HttpServletResponse httpServletResponse = (HttpServletResponse) response; + // issues/I4YH95浏览器显示乱码问题 + httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8"); Result jsonResult = new Result(code, errorMsg); OutputStream os = null; try { @@ -133,11 +137,13 @@ public class JwtUtil { //${myVar}% //得到${} 后面的值 String moshi = ""; - if(key.indexOf("}")!=-1){ + String wellNumber = WELL_NUMBER; + + if(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){ moshi = key.substring(key.indexOf("}")+1); } String returnValue = null; - if (key.contains("#{")) { + if (key.contains(wellNumber)) { key = key.substring(2,key.indexOf("}")); } if (oConvertUtils.isNotEmpty(key)) { @@ -165,12 +171,13 @@ public class JwtUtil { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String moshi = ""; - if(key.indexOf("}")!=-1){ + String wellNumber = WELL_NUMBER; + if(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){ moshi = key.substring(key.indexOf("}")+1); } String returnValue = null; //针对特殊标示处理#{sysOrgCode},判断替换 - if (key.contains("#{")) { + if (key.contains(wellNumber)) { key = key.substring(2,key.indexOf("}")); } else { key = key; @@ -228,7 +235,8 @@ public class JwtUtil { //update-begin-author:taoyan date:20210330 for:多租户ID作为系统变量 else if (key.equals(DataBaseConstant.TENANT_ID) || key.toLowerCase().equals(DataBaseConstant.TENANT_ID_TABLE)){ returnValue = sysUser.getRelTenantIds(); - if(oConvertUtils.isEmpty(returnValue) || (returnValue!=null && returnValue.indexOf(",")>0)){ + boolean flag = returnValue != null && returnValue.indexOf(SymbolConstant.COMMA) > 0; + if(oConvertUtils.isEmpty(returnValue) || flag){ returnValue = SpringContextUtils.getHttpServletRequest().getHeader(CommonConstant.TENANT_ID); } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/ComboModel.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/ComboModel.java index 6846ad20..663cdb9c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/ComboModel.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/ComboModel.java @@ -7,6 +7,10 @@ import lombok.experimental.Accessors; import java.io.Serializable; +/** + * @Description: 文档管理 + * @author: jeecg-boot + */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java index f0936cb7..b4071469 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java @@ -8,6 +8,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +/** + * @Description: 字典类 + * @author: jeecg-boot + */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModelMany.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModelMany.java index 778fb4b5..cc6a34f1 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModelMany.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModelMany.java @@ -5,6 +5,7 @@ import lombok.EqualsAndHashCode; /** * 查询多个字典时用到 + * @author: jeecg-boot */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictQuery.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictQuery.java index 58be310e..b24ede84 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictQuery.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictQuery.java @@ -4,6 +4,7 @@ import lombok.Data; /** * 字典查询参数实体 + * @author: jeecg-boot */ @Data public class DictQuery { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DynamicDataSourceModel.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DynamicDataSourceModel.java index 5926a3b7..303ab170 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DynamicDataSourceModel.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DynamicDataSourceModel.java @@ -3,6 +3,10 @@ package org.jeecg.common.system.vo; import lombok.Data; import org.springframework.beans.BeanUtils; +/** + * @Description: 数据源 + * @author: jeecg-boot + */ @Data public class DynamicDataSourceModel { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysDepartModel.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysDepartModel.java index fd60393d..41dca9d8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysDepartModel.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysDepartModel.java @@ -1,7 +1,8 @@ package org.jeecg.common.system.vo; /** - * lvdandan 部门机构model + * 部门机构model + * @author: lvdandan */ public class SysDepartModel { /**ID*/ diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java index edbda8db..a6e117ab 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java @@ -4,6 +4,10 @@ import java.util.List; import org.jeecg.common.util.DateUtils; +/** + * @Description: 用户缓存信息 + * @author: jeecg-boot + */ public class SysUserCacheInfo { private String sysUserCode; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserType.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserType.java index 9363b080..c080c611 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserType.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserType.java @@ -6,5 +6,8 @@ package org.jeecg.common.util; * */ public enum BrowserType { + /** + * 浏览类型 IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko + */ IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java index 152a9762..08b3fbcb 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java @@ -13,9 +13,13 @@ import javax.servlet.http.HttpServletRequest; * */ public class BrowserUtils { - - // 判断是否是IE - public static boolean isIE(HttpServletRequest request) { + + /** + * 判断是否是IE + * @param request + * @return + */ + public static boolean isIe(HttpServletRequest request) { return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true : false; @@ -27,7 +31,7 @@ public class BrowserUtils { * @param request * @return */ - public static Double getIEversion(HttpServletRequest request) { + public static Double getIeVersion(HttpServletRequest request) { Double version = 0.0; if (getBrowserType(request, IE11)) { version = 11.0; @@ -83,7 +87,7 @@ public class BrowserUtils { if (getBrowserType(request, OPERA)) { browserType = BrowserType.Opera; } - if (getBrowserType(request, "Camino")) { + if (getBrowserType(request, CAMINO)) { browserType = BrowserType.Camino; } return browserType; @@ -110,6 +114,7 @@ public class BrowserUtils { private final static String CHROME = "Chrome"; private final static String SAFARI = "Safari"; private final static String OTHER = "其它"; + private final static String CAMINO = "Camino"; public static String checkBrowse(HttpServletRequest request) { String userAgent = request.getHeader("USER-AGENT"); @@ -199,7 +204,8 @@ public class BrowserUtils { /** 判断请求是否来自移动端 */ public static boolean isMobile(HttpServletRequest request) { String ua = request.getHeader("User-Agent").toLowerCase(); - Pattern pattern = Pattern.compile("(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)"); + String type = "(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)"; + Pattern pattern = Pattern.compile(type); return pattern.matcher(ua).find(); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java index c9aab4ea..89acf024 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.filter.FileTypeFilter; import org.jeecg.common.util.oss.OssBootUtil; import org.jeecgframework.poi.util.PoiPublicUtil; @@ -27,12 +28,24 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * @Description: 通用工具 + * @author: jeecg-boot + */ @Slf4j public class CommonUtils { - //中文正则 + /** + * 中文正则 + */ private static Pattern ZHONGWEN_PATTERN = Pattern.compile("[\u4e00-\u9fa5]"); + /** + * 文件名 正则字符串 + * 文件名支持的字符串:字母数字中文.-_()() 除此之外的字符将被删除 + */ + private static String FILE_NAME_REGEX = "[^A-Za-z\\.\\(\\)\\-()\\_0-9\\u4e00-\\u9fa5]"; + public static String uploadOnlineImage(byte[] data,String basePath,String bizPath,String uploadType){ String dbPath = null; String fileName = "image" + Math.round(Math.random() * 100000000000L); @@ -84,10 +97,17 @@ public class CommonUtils { .replace("#", "").replace("“", "").replace("”", ""); //替换上传文件名字中的空格 fileName=fileName.replaceAll("\\s",""); + //update-beign-author:taoyan date:20220302 for: /issues/3381 online 在线表单 使用文件组件时,上传文件名中含%,下载异常 + fileName = fileName.replaceAll(FILE_NAME_REGEX, ""); + //update-end-author:taoyan date:20220302 for: /issues/3381 online 在线表单 使用文件组件时,上传文件名中含%,下载异常 return fileName; } - // java 判断字符串里是否包含中文字符 + /** + * java 判断字符串里是否包含中文字符 + * @param str + * @return + */ public static boolean ifContainChinese(String str) { if(str.getBytes().length == str.length()){ return false; @@ -127,11 +147,13 @@ public class CommonUtils { String fileName = null; File file = new File(uploadpath + File.separator + bizPath + File.separator ); if (!file.exists()) { - file.mkdirs();// 创建文件根目录 + // 创建文件根目录 + file.mkdirs(); } - String orgName = mf.getOriginalFilename();// 获取文件名 + // 获取文件名 + String orgName = mf.getOriginalFilename(); orgName = CommonUtils.getFileName(orgName); - if(orgName.indexOf(".")!=-1){ + if(orgName.indexOf(SymbolConstant.SPOT)!=-1){ fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")); }else{ fileName = orgName+ "_" + System.currentTimeMillis(); @@ -145,7 +167,7 @@ public class CommonUtils { }else{ dbpath = fileName; } - if (dbpath.contains("\\")) { + if (dbpath.contains(SymbolConstant.DOUBLE_BACKSLASH)) { dbpath = dbpath.replace("\\", "/"); } return dbpath; @@ -259,16 +281,17 @@ public class CommonUtils { Connection connection = dataSource.getConnection(); try { DatabaseMetaData md = connection.getMetaData(); - String dbType = md.getDatabaseProductName().toLowerCase(); - if(dbType.indexOf("mysql")>=0) { + String dbType = md.getDatabaseProductName().toUpperCase(); + String sqlserver= "SQL SERVER"; + if(dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL; - }else if(dbType.indexOf("oracle")>=0 ||dbType.indexOf("dm")>=0) { + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE)>=0 ||dbType.indexOf(DataBaseConstant.DB_TYPE_DM)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE; - }else if(dbType.indexOf("sqlserver")>=0||dbType.indexOf("sql server")>=0) { + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER)>=0||dbType.indexOf(sqlserver)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER; - }else if(dbType.indexOf("postgresql")>=0) { + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL; - }else if(dbType.indexOf("mariadb")>=0) { + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB)>=0) { DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB; }else { log.error("数据库类型:[" + dbType + "]不识别!"); @@ -291,10 +314,10 @@ public class CommonUtils { */ public static String getBaseUrl(HttpServletRequest request) { //1.【兼容】兼容微服务下的 base path------- - String x_gateway_base_path = request.getHeader("X_GATEWAY_BASE_PATH"); - if(oConvertUtils.isNotEmpty(x_gateway_base_path)){ - log.info("x_gateway_base_path = "+ x_gateway_base_path); - return x_gateway_base_path; + String xGatewayBasePath = request.getHeader("X_GATEWAY_BASE_PATH"); + if(oConvertUtils.isNotEmpty(xGatewayBasePath)){ + log.info("x_gateway_base_path = "+ xGatewayBasePath); + return xGatewayBasePath; } //2.【兼容】SSL认证之后,request.getScheme()获取不到https的问题 // https://blog.csdn.net/weixin_34376986/article/details/89767950 @@ -310,7 +333,8 @@ public class CommonUtils { //返回 host domain String baseDomainPath = null; - if(80 == serverPort){ + int length = 80; + if(length == serverPort){ baseDomainPath = scheme + "://" + serverName + contextPath ; }else{ baseDomainPath = scheme + "://" + serverName + ":" + serverPort + contextPath ; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java index c9304695..291b508d 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java @@ -9,6 +9,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import org.jeecg.common.constant.SymbolConstant; import org.springframework.util.StringUtils; /** @@ -63,14 +64,20 @@ public class DateUtils extends PropertyEditorSupport { } }; - // 以毫秒表示的时间 + /** + * 以毫秒表示的时间 + */ private static final long DAY_IN_MILLIS = 24 * 3600 * 1000; private static final long HOUR_IN_MILLIS = 3600 * 1000; private static final long MINUTE_IN_MILLIS = 60 * 1000; private static final long SECOND_IN_MILLIS = 1000; - // 指定模式的时间格式 - private static SimpleDateFormat getSDFormat(String pattern) { + /** + * 指定模式的时间格式 + * @param pattern + * @return + */ + private static SimpleDateFormat getSdFormat(String pattern) { return new SimpleDateFormat(pattern); } @@ -169,15 +176,17 @@ public class DateUtils extends PropertyEditorSupport { /** * 日期转换为字符串 * - * @param date_sdf 日期格式 + * @param dateSdf 日期格式 * @return 字符串 */ - public static String date2Str(SimpleDateFormat date_sdf) { - Date date = getDate(); - if (null == date) { - return null; + public static String date2Str(SimpleDateFormat dateSdf) { + synchronized (dateSdf) { + Date date = getDate(); + if (null == date) { + return null; + } + return dateSdf.format(date); } - return date_sdf.format(date); } /** @@ -189,28 +198,30 @@ public class DateUtils extends PropertyEditorSupport { */ public static String dateformat(String date, String format) { SimpleDateFormat sformat = new SimpleDateFormat(format); - Date _date = null; + Date nowDate = null; try { - _date = sformat.parse(date); + nowDate = sformat.parse(date); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } - return sformat.format(_date); + return sformat.format(nowDate); } /** * 日期转换为字符串 * * @param date 日期 - * @param date_sdf 日期格式 + * @param dateSdf 日期格式 * @return 字符串 */ - public static String date2Str(Date date, SimpleDateFormat date_sdf) { - if (null == date) { - return null; + public static String date2Str(Date date, SimpleDateFormat dateSdf) { + synchronized (dateSdf) { + if (null == date) { + return null; + } + return dateSdf.format(date); } - return date_sdf.format(date); } /** @@ -367,7 +378,9 @@ public class DateUtils extends PropertyEditorSupport { * 获取时间字符串 */ public static String getDataString(SimpleDateFormat formatstr) { - return formatstr.format(getCalendar().getTime()); + synchronized (formatstr) { + return formatstr.format(getCalendar().getTime()); + } } /** @@ -407,7 +420,7 @@ public class DateUtils extends PropertyEditorSupport { * @return 默认日期按指定格式显示 */ public static String formatDate(String pattern) { - return getSDFormat(pattern).format(getCalendar().getTime()); + return getSdFormat(pattern).format(getCalendar().getTime()); } /** @@ -418,7 +431,7 @@ public class DateUtils extends PropertyEditorSupport { * @return 指定日期按指定格式显示 */ public static String formatDate(Calendar cal, String pattern) { - return getSDFormat(pattern).format(cal.getTime()); + return getSdFormat(pattern).format(cal.getTime()); } /** @@ -429,7 +442,7 @@ public class DateUtils extends PropertyEditorSupport { * @return 指定日期按指定格式显示 */ public static String formatDate(Date date, String pattern) { - return getSDFormat(pattern).format(date); + return getSdFormat(pattern).format(date); } // //////////////////////////////////////////////////////////////////////////// @@ -536,7 +549,7 @@ public class DateUtils extends PropertyEditorSupport { * @throws ParseException */ public static Date parseDate(String src, String pattern) throws ParseException { - return getSDFormat(pattern).parse(src); + return getSdFormat(pattern).parse(src); } @@ -592,24 +605,29 @@ public class DateUtils extends PropertyEditorSupport { public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) { long millisDiff = getMillis(calSrc) - getMillis(calDes); + char year = 'y'; + char day = 'd'; + char hour = 'h'; + char minute = 'm'; + char second = 's'; - if (flag == 'y') { + if (flag == year) { return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR)); } - if (flag == 'd') { + if (flag == day) { return (int) (millisDiff / DAY_IN_MILLIS); } - if (flag == 'h') { + if (flag == hour) { return (int) (millisDiff / HOUR_IN_MILLIS); } - if (flag == 'm') { + if (flag == minute) { return (int) (millisDiff / MINUTE_IN_MILLIS); } - if (flag == 's') { + if (flag == second) { return (int) (millisDiff / SECOND_IN_MILLIS); } @@ -628,9 +646,11 @@ public class DateUtils extends PropertyEditorSupport { public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.hasText(text)) { try { - if (text.indexOf(":") == -1 && text.length() == 10) { + int length10 = 10; + int length19 = 19; + if (text.indexOf(SymbolConstant.COLON) == -1 && text.length() == length10) { setValue(DateUtils.date_sdf.get().parse(text)); - } else if (text.indexOf(":") > 0 && text.length() == 19) { + } else if (text.indexOf(SymbolConstant.COLON) > 0 && text.length() == length19) { setValue(DateUtils.datetimeFormat.get().parse(text)); } else { throw new IllegalArgumentException("Could not parse date, date format is error "); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsEnum.java index 414a35b3..b06460a0 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsEnum.java @@ -2,10 +2,17 @@ package org.jeecg.common.util; import org.apache.commons.lang3.StringUtils; +/** + * @Description: 短信枚举类 + * @author: jeecg-boot + */ public enum DySmsEnum { - + + /**登录短信模板编码*/ LOGIN_TEMPLATE_CODE("SMS_175435174","JEECG","code"), + /**忘记密码短信模板编码*/ FORGET_PASSWORD_TEMPLATE_CODE("SMS_175435174","JEECG","code"), + /**注册账号短信模板编码*/ REGISTER_TEMPLATE_CODE("SMS_175430166","JEECG","code"), /**会议通知*/ MEET_NOTICE_TEMPLATE_CODE("SMS_201480469","H5活动之家","username,title,minute,time"), diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java index e619de46..48df5678 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java @@ -23,17 +23,18 @@ import com.aliyuncs.profile.IClientProfile; * * 备注:Demo工程编码采用UTF-8 * 国际短信发送请勿参照此DEMO + * @author: jeecg-boot */ public class DySmsHelper { private final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class); - //产品名称:云通信短信API产品,开发者无需替换 - static final String product = "Dysmsapi"; - //产品域名,开发者无需替换 - static final String domain = "dysmsapi.aliyuncs.com"; + /**产品名称:云通信短信API产品,开发者无需替换*/ + static final String PRODUCT = "Dysmsapi"; + /**产品域名,开发者无需替换*/ + static final String DOMAIN = "dysmsapi.aliyuncs.com"; - // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) + /**TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)*/ static String accessKeyId; static String accessKeySecret; @@ -67,7 +68,7 @@ public class DySmsHelper { //初始化acsClient,暂不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); - DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); + DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN); IAcsClient acsClient = new DefaultAcsClient(profile); //验证json参数 @@ -96,7 +97,8 @@ public class DySmsHelper { SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); logger.info("短信接口返回的数据----------------"); logger.info("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}"); - if ("OK".equals(sendSmsResponse.getCode())) { + String ok = "OK"; + if (ok.equals(sendSmsResponse.getCode())) { result = true; } return result; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/HTMLUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/HTMLUtils.java index 11014c60..e84d6f35 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/HTMLUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/HTMLUtils.java @@ -5,7 +5,10 @@ import org.springframework.web.util.HtmlUtils; /** * HTML 工具类 + * @author: jeecg-boot + * @date: 2022/3/30 14:43 */ +@SuppressWarnings("AlibabaClassNamingShouldBeCamel") public class HTMLUtils { /** diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IPUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IPUtils.java index 6f7c0df1..01b9d6be 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IPUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IPUtils.java @@ -3,6 +3,7 @@ package org.jeecg.common.util; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; +import org.jeecg.common.constant.CommonConstant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,8 +14,8 @@ import org.slf4j.LoggerFactory; * @email jeecgos@163.com * @Date 2019年01月14日 */ -public class IPUtils { - private static Logger logger = LoggerFactory.getLogger(IPUtils.class); +public class IpUtils { + private static Logger logger = LoggerFactory.getLogger(IpUtils.class); /** * 获取IP地址 @@ -26,19 +27,19 @@ public class IPUtils { String ip = null; try { ip = request.getHeader("x-forwarded-for"); - if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } - if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (StringUtils.isEmpty(ip) || ip.length() == 0 ||CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } - if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } - if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } - if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } catch (Exception e) { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ImportExcelUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ImportExcelUtil.java index fdb3f6dc..ead7ee69 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ImportExcelUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ImportExcelUtil.java @@ -12,6 +12,7 @@ import java.util.List; /** * 导出返回信息 + * @author: jeecg-boot */ @Slf4j public class ImportExcelUtil { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MD5Util.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MD5Util.java index cf70fa92..d79f3a5a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MD5Util.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MD5Util.java @@ -2,9 +2,16 @@ package org.jeecg.common.util; import java.security.MessageDigest; -public class MD5Util { +/** + * @Description: 加密工具 + * @author: jeecg-boot + */ +public class Md5Util { - public static String byteArrayToHexString(byte b[]) { + private static final String[] HEXDIGITS = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + + public static String byteArrayToHexString(byte[] b) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++){ resultSb.append(byteToHexString(b[i])); @@ -19,10 +26,10 @@ public class MD5Util { } int d1 = n / 16; int d2 = n % 16; - return hexDigits[d1] + hexDigits[d2]; + return HEXDIGITS[d1] + HEXDIGITS[d2]; } - public static String MD5Encode(String origin, String charsetname) { + public static String md5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); @@ -37,7 +44,4 @@ public class MD5Util { return resultString; } - private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", - "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; - } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java index e96fa21f..3a36cbe0 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java @@ -3,6 +3,7 @@ package org.jeecg.common.util; import io.minio.*; import io.minio.http.Method; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.filter.FileTypeFilter; import org.jeecg.common.util.filter.StrAttackFilter; import org.springframework.web.multipart.MultipartFile; @@ -12,6 +13,7 @@ import java.net.URLDecoder; /** * minio文件上传工具类 + * @author: jeecg-boot */ @Slf4j public class MinioUtil { @@ -52,7 +54,7 @@ public class MinioUtil { * @return */ public static String upload(MultipartFile file, String bizPath, String customBucket) { - String file_url = ""; + String fileUrl = ""; //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 bizPath=StrAttackFilter.filter(bizPath); //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 @@ -87,7 +89,7 @@ public class MinioUtil { ); // 使用putObject上传一个本地文件到存储桶中。 - if(objectName.startsWith("/")){ + if(objectName.startsWith(SymbolConstant.SINGLE_SLASH)){ objectName = objectName.substring(1); } PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName) @@ -96,11 +98,11 @@ public class MinioUtil { .stream(stream,stream.available(),-1).build(); minioClient.putObject(objectArgs); stream.close(); - file_url = minioUrl+newBucket+"/"+objectName; + fileUrl = minioUrl+newBucket+"/"+objectName; }catch (Exception e){ log.error(e.getMessage(), e); } - return file_url; + return fileUrl; } /** @@ -156,7 +158,7 @@ public class MinioUtil { * @param expires * @return */ - public static String getObjectURL(String bucketName, String objectName, Integer expires) { + public static String getObjectUrl(String bucketName, String objectName, Integer expires) { initMinio(minioUrl, minioName,minioPass); try{ //update-begin---author:liusq Date:20220121 for:获取文件外链报错提示method不能为空,导致文件下载和预览失败---- diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyClassLoader.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyClassLoader.java index 06bffdec..20289b60 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyClassLoader.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyClassLoader.java @@ -1,5 +1,7 @@ package org.jeecg.common.util; +import org.jeecg.common.constant.SymbolConstant; + /** * @Author 张代浩 */ @@ -15,7 +17,11 @@ public class MyClassLoader extends ClassLoader { return myclass; } - // 获得类的全名,包括包名 + /** + * 获得类的全名,包括包名 + * @param object + * @return + */ public static String getPackPath(Object object) { // 检查用户传入的参数是否为空 if (object == null) { @@ -40,23 +46,30 @@ public class MyClassLoader extends ClassLoader { // 如果不是匿名包,将包名转化为路径 if (pack != null) { String packName = pack.getName(); + String javaSpot="java."; + String javaxSpot="javax."; // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 - if (packName.startsWith("java.") || packName.startsWith("javax.")) { + if (packName.startsWith(javaSpot) || packName.startsWith(javaxSpot)) { throw new java.lang.IllegalArgumentException("不要传送系统类!"); } // 在类的名称中,去掉包名的部分,获得类的文件名 clsName = clsName.substring(packName.length() + 1); // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, - if (packName.indexOf(".") < 0) { + if (packName.indexOf(SymbolConstant.SPOT) < 0) { path = packName + "/"; - } else {// 否则按照包名的组成部分,将包名转换为路径 + } else { + // 否则按照包名的组成部分,将包名转换为路径 int start = 0, end = 0; end = packName.indexOf("."); + StringBuilder pathBuilder = new StringBuilder(); while (end != -1) { - path = path + packName.substring(start, end) + "/"; + pathBuilder.append(packName, start, end).append("/"); start = end + 1; end = packName.indexOf(".", start); } + if(oConvertUtils.isNotEmpty(pathBuilder.toString())){ + path = pathBuilder.toString(); + } path = path + packName.substring(start) + "/"; } } @@ -73,7 +86,7 @@ public class MyClassLoader extends ClassLoader { pos = realPath.indexOf(path + clsName); realPath = realPath.substring(0, pos - 1); // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 - if (realPath.endsWith("!")) { + if (realPath.endsWith(SymbolConstant.EXCLAMATORY_MARK)) { realPath = realPath.substring(0, realPath.lastIndexOf("/")); } /*------------------------------------------------------------ diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PasswordUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PasswordUtil.java index 1ecb69b6..aaae509e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PasswordUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PasswordUtil.java @@ -7,6 +7,11 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; + +/** + * @Description: 密码工具类 + * @author: jeecg-boot + */ public class PasswordUtil { /** @@ -14,11 +19,17 @@ public class PasswordUtil { * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1 * */ - /** - * 定义使用的算法为:PBEWITHMD5andDES算法 - */ - public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法 - public static final String Salt = "63293188";//密钥 + /** + * 定义使用的算法为:PBEWITHMD5andDES算法 + * 加密算法 + */ + public static final String ALGORITHM = "PBEWithMD5AndDES"; + + /** + * 定义使用的算法为:PBEWITHMD5andDES算法 + * 密钥 + */ + public static final String SALT = "63293188"; /** * 定义迭代次数为1000次 @@ -39,7 +50,7 @@ public class PasswordUtil { public static byte[] getStaticSalt() { // 产出盐 - return Salt.getBytes(); + return SALT.getBytes(); } /** @@ -49,7 +60,7 @@ public class PasswordUtil { * 生成密钥时所使用的密码 * @return Key PBE算法密钥 * */ - private static Key getPBEKey(String password) { + private static Key getPbeKey(String password) { // 实例化使用的算法 SecretKeyFactory keyFactory; SecretKey secretKey = null; @@ -81,7 +92,7 @@ public class PasswordUtil { */ public static String encrypt(String plaintext, String password, String salt) { - Key key = getPBEKey(password); + Key key = getPbeKey(password); byte[] encipheredData = null; PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); try { @@ -110,7 +121,7 @@ public class PasswordUtil { */ public static String decrypt(String ciphertext, String password, String salt) { - Key key = getPBEKey(password); + Key key = getPbeKey(password); byte[] passDec = null; PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); try { @@ -158,7 +169,7 @@ public class PasswordUtil { * @return */ public static byte[] hexStringToBytes(String hexString) { - if (hexString == null || hexString.equals("")) { + if (hexString == null || "".equals(hexString)) { return null; } hexString = hexString.toUpperCase(); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PathMatcherUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PathMatcherUtil.java index e4427ba9..f8736a18 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PathMatcherUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PathMatcherUtil.java @@ -7,6 +7,7 @@ import org.springframework.util.AntPathMatcher; /** * 使用Spring自身提供的地址匹配工具匹配URL + * @author: jeecg-boot */ public class PathMatcherUtil { @@ -77,8 +78,19 @@ public class PathMatcherUtil { } private interface Matcher { + + /** + * 实际验证路径匹配权限 + * @param var1 + * @return + */ boolean matches(String var1); + /** + * 提取path中匹配到的部分 + * @param var1 + * @return + */ Map extractUriTemplateVariables(String var1); } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PmsUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PmsUtil.java index efefda8c..09262026 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PmsUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PmsUtil.java @@ -10,6 +10,10 @@ import java.io.FileWriter; import java.util.Date; import java.util.List; +/** + * @Description: PmsUtil + * @author: jeecg-boot + */ @Slf4j @Component public class PmsUtil { @@ -41,7 +45,7 @@ public class PmsUtil { for (String s : msg) { //写数据 if (s.indexOf("_") > 0) { - String arr[] = s.split("_"); + String[] arr = s.split("_"); bw.write("第" + arr[0] + "行:" + arr[1]); } else { bw.write(s); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ReflectHelper.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ReflectHelper.java index a66ae891..3e843eec 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ReflectHelper.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ReflectHelper.java @@ -231,7 +231,7 @@ public class ReflectHelper { List list = new ArrayList(); Map infoMap = null; for (int i = 0; i < fields.length; i++) { - infoMap = new HashMap(); + infoMap = new HashMap<>(5); infoMap.put("type", fields[i].getType().toString()); infoMap.put("name", fields[i].getName()); infoMap.put("value", getFieldValueByName(fields[i].getName(), o)); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestUtil.java index 28141c28..e0ec2e6a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestUtil.java @@ -28,7 +28,8 @@ public class RestUtil { // issues/2959 // 微服务版集成企业微信单点登录 // 因为微服务版没有端口号,导致 SpringContextUtils.getDomain() 方法获取的域名的端口号变成了:-1所以出问题了,只需要把这个-1给去掉就可以了。 - if (domain.endsWith(":-1")) { + String port=":-1"; + if (domain.endsWith(port)) { domain = domain.substring(0, domain.length() - 3); } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java index 723e0de4..cd3d8783 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java @@ -11,6 +11,10 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +/** + * @Description: spring上下文工具类 + * @author: jeecg-boot + */ @Component public class SpringContextUtils implements ApplicationContextAware { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java index 2195f66f..f2ac6574 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java @@ -3,7 +3,6 @@ package org.jeecg.common.util; import cn.hutool.crypto.SecureUtil; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.exception.JeecgBootException; - import javax.servlet.http.HttpServletRequest; import java.util.regex.Pattern; @@ -19,15 +18,18 @@ public class SqlInjectionUtil { * (上线修改值 20200501,同步修改前端的盐值) */ private final static String TABLE_DICT_SIGN_SALT = "20200501"; - private final static String xssStr = "and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|user()"; + private final static String XSS_STR = "and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|user()"; - /* - * 针对表字典进行额外的sign签名校验(增加安全机制) - * @param dictCode: - * @param sign: - * @param request: - * @Return: void - */ + /**show tables*/ + private final static String SHOW_TABLES = "show\\s+tables"; + + /** + * 针对表字典进行额外的sign签名校验(增加安全机制) + * @param dictCode: + * @param sign: + * @param request: + * @Return: void + */ public static void checkDictTableSign(String dictCode, String sign, HttpServletRequest request) { //表字典SQL注入漏洞,签名校验 String accessToken = request.getHeader("X-Access-Token"); @@ -56,7 +58,7 @@ public class SqlInjectionUtil { //SQL注入检测存在绕过风险 https://gitee.com/jeecg/jeecg-boot/issues/I4NZGE value = value.replaceAll("/\\*.*\\*/",""); - String[] xssArr = xssStr.split("\\|"); + String[] xssArr = XSS_STR.split("\\|"); for (int i = 0; i < xssArr.length; i++) { if (value.indexOf(xssArr[i]) > -1) { log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]); @@ -64,7 +66,7 @@ public class SqlInjectionUtil { throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } } - if(Pattern.matches("show\\s+tables", value)){ + if(Pattern.matches(SHOW_TABLES, value)){ throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } return; @@ -77,7 +79,7 @@ public class SqlInjectionUtil { * @return */ public static void filterContent(String[] values) { - String[] xssArr = xssStr.split("\\|"); + String[] xssArr = XSS_STR.split("\\|"); for (String value : values) { if (value == null || "".equals(value)) { return; @@ -94,7 +96,7 @@ public class SqlInjectionUtil { throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } } - if(Pattern.matches("show\\s+tables", value)){ + if(Pattern.matches(SHOW_TABLES, value)){ throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } } @@ -102,11 +104,13 @@ public class SqlInjectionUtil { } /** - * @特殊方法(不通用) 仅用于字典条件SQL参数,注入过滤 + * 【提醒:不通用】 + * 仅用于字典条件SQL参数,注入过滤 + * * @param value * @return */ - @Deprecated + //@Deprecated public static void specialFilterContent(String value) { String specialXssStr = " exec | insert | select | delete | update | drop | count | chr | mid | master | truncate | char | declare |;|+|"; String[] xssArr = specialXssStr.split("\\|"); @@ -125,7 +129,7 @@ public class SqlInjectionUtil { throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } } - if(Pattern.matches("show\\s+tables", value)){ + if(Pattern.matches(SHOW_TABLES, value)){ throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } return; @@ -133,11 +137,12 @@ public class SqlInjectionUtil { /** - * @特殊方法(不通用) 仅用于Online报表SQL解析,注入过滤 + * 【提醒:不通用】 + * 仅用于Online报表SQL解析,注入过滤 * @param value * @return */ - @Deprecated + //@Deprecated public static void specialFilterContentForOnlineReport(String value) { String specialXssStr = " exec | insert | delete | update | drop | chr | mid | master | truncate | char | declare |"; String[] xssArr = specialXssStr.split("\\|"); @@ -157,7 +162,7 @@ public class SqlInjectionUtil { } } - if(Pattern.matches("show\\s+tables", value)){ + if(Pattern.matches(SHOW_TABLES, value)){ throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value); } return; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SysAnnmentTypeEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SysAnnmentTypeEnum.java index 3d8375a6..b10df1d1 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SysAnnmentTypeEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SysAnnmentTypeEnum.java @@ -2,6 +2,7 @@ package org.jeecg.common.util; /** * 系统公告自定义跳转方式 + * @author: jeecg-boot */ public enum SysAnnmentTypeEnum { /** diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java index 1a5644b0..b85615c3 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java @@ -3,6 +3,7 @@ package org.jeecg.common.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBoot401Exception; import org.jeecg.common.system.util.JwtUtil; @@ -35,40 +36,16 @@ public class TokenUtils { /** * 验证Token */ - public static boolean verifyToken(HttpServletRequest request, CommonAPI commonAPI, RedisUtil redisUtil) { + public static boolean verifyToken(HttpServletRequest request, CommonAPI commonApi, RedisUtil redisUtil) { log.debug(" -- url --" + request.getRequestURL()); String token = getTokenByRequest(request); - - if (StringUtils.isBlank(token)) { - throw new JeecgBoot401Exception("Token不能为空!"); - } - - // 解密获得username,用于和数据库进行对比 - String username = JwtUtil.getUsername(token); - if (username == null) { - throw new JeecgBoot401Exception("Token非法无效!"); - } - - // 查询用户信息 - LoginUser user = commonAPI.getUserByName(username); - if (user == null) { - throw new JeecgBoot401Exception("用户不存在!"); - } - // 判断用户状态 - if (user.getStatus() != 1) { - throw new JeecgBoot401Exception("账号已锁定,请联系管理员!"); - } - // 校验token是否超时失效 & 或者账号密码是否错误 - if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) { - throw new JeecgBoot401Exception("Token失效,请重新登录"); - } - return true; + return TokenUtils.verifyToken(token, commonApi, redisUtil); } /** * 验证Token */ - public static boolean verifyToken(String token, CommonAPI commonAPI, RedisUtil redisUtil) { + public static boolean verifyToken(String token, CommonAPI commonApi, RedisUtil redisUtil) { if (StringUtils.isBlank(token)) { throw new JeecgBoot401Exception("token不能为空!"); } @@ -80,7 +57,8 @@ public class TokenUtils { } // 查询用户信息 - LoginUser user = commonAPI.getUserByName(username); + LoginUser user = TokenUtils.getLoginUser(username, commonApi, redisUtil); + //LoginUser user = commonApi.getUserByName(username); if (user == null) { throw new JeecgBoot401Exception("用户不存在!"); } @@ -104,25 +82,36 @@ public class TokenUtils { * @return */ private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) { - String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token)); + String cacheToken = oConvertUtils.getString(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token)); if (oConvertUtils.isNotEmpty(cacheToken)) { // 校验token有效性 if (!JwtUtil.verify(cacheToken, userName, passWord)) { String newAuthorization = JwtUtil.sign(userName, passWord); // 设置Toekn缓存有效时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); } - //update-begin--Author:scott Date:20191005 for:解决每次请求,都重写redis中 token缓存问题 -// else { -// redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, cacheToken); -// // 设置超时时间 -// redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000); -// } - //update-end--Author:scott Date:20191005 for:解决每次请求,都重写redis中 token缓存问题 return true; } return false; } + /** + * 获取登录用户 + * + * @param commonApi + * @param username + * @return + */ + public static LoginUser getLoginUser(String username, CommonAPI commonApi, RedisUtil redisUtil) { + LoginUser loginUser = null; + String loginUserKey = CacheConstant.SYS_USERS_CACHE + "::" + username; + if(redisUtil.hasKey(loginUserKey)){ + loginUser = (LoginUser) redisUtil.get(loginUserKey); + }else{ + // 查询用户信息 + loginUser = commonApi.getUserByName(username); + } + return loginUser; + } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/UUIDGenerator.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/UUIDGenerator.java index bed22773..9893f256 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/UUIDGenerator.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/UUIDGenerator.java @@ -18,8 +18,8 @@ public class UUIDGenerator { */ public static String generate() { - return new StringBuilder(32).append(format(getIP())).append( - format(getJVM())).append(format(getHiTime())).append( + return new StringBuilder(32).append(format(getIp())).append( + format(getJvm())).append(format(getHiTime())).append( format(getLoTime())).append(format(getCount())).toString(); } @@ -53,7 +53,7 @@ public class UUIDGenerator { return buf.toString(); } - private final static int getJVM() { + private final static int getJvm() { return JVM; } @@ -69,7 +69,7 @@ public class UUIDGenerator { /** * Unique in a local network */ - private final static int getIP() { + private final static int getIp() { return IP; } @@ -86,7 +86,8 @@ public class UUIDGenerator { private final static int toInt(byte[] bytes) { int result = 0; - for (int i = 0; i < 4; i++) { + int length = 4; + for (int i = 0; i < length; i++) { result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; } return result; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java index 5683e77a..3b939f56 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java @@ -13,9 +13,12 @@ public class YouBianCodeUtil { // 数字位数(默认生成3位的数字) - private static final int numLength = 2;//代表数字位数 + /**代表数字位数*/ + private static final int NUM_LENGTH = 2; - public static final int zhanweiLength = 1+numLength; + public static final int ZHANWEI_LENGTH = 1+ NUM_LENGTH; + + public static final char LETTER= 'Z'; /** * 根据前一个code,获取同级下一个code @@ -31,10 +34,10 @@ public class YouBianCodeUtil { String num = getStrNum(1); newcode = zimu + num; } else { - String before_code = code.substring(0, code.length() - 1- numLength); - String after_code = code.substring(code.length() - 1 - numLength,code.length()); - char after_code_zimu = after_code.substring(0, 1).charAt(0); - Integer after_code_num = Integer.parseInt(after_code.substring(1)); + String beforeCode = code.substring(0, code.length() - 1- NUM_LENGTH); + String afterCode = code.substring(code.length() - 1 - NUM_LENGTH,code.length()); + char afterCodeZimu = afterCode.substring(0, 1).charAt(0); + Integer afterCodeNum = Integer.parseInt(afterCode.substring(1)); // org.jeecgframework.core.util.LogUtil.info(after_code); // org.jeecgframework.core.util.LogUtil.info(after_code_zimu); // org.jeecgframework.core.util.LogUtil.info(after_code_num); @@ -42,23 +45,23 @@ public class YouBianCodeUtil { String nextNum = ""; char nextZimu = 'A'; // 先判断数字等于999*,则计数从1重新开始,递增 - if (after_code_num == getMaxNumByLength(numLength)) { + if (afterCodeNum == getMaxNumByLength(NUM_LENGTH)) { nextNum = getNextStrNum(0); } else { - nextNum = getNextStrNum(after_code_num); + nextNum = getNextStrNum(afterCodeNum); } // 先判断数字等于999*,则字母从A重新开始,递增 - if(after_code_num == getMaxNumByLength(numLength)) { - nextZimu = getNextZiMu(after_code_zimu); + if(afterCodeNum == getMaxNumByLength(NUM_LENGTH)) { + nextZimu = getNextZiMu(afterCodeZimu); }else{ - nextZimu = after_code_zimu; + nextZimu = afterCodeZimu; } // 例如Z99,下一个code就是Z99A01 - if ('Z' == after_code_zimu && getMaxNumByLength(numLength) == after_code_num) { + if (LETTER == afterCodeZimu && getMaxNumByLength(NUM_LENGTH) == afterCodeNum) { newcode = code + (nextZimu + nextNum); } else { - newcode = before_code + (nextZimu + nextNum); + newcode = beforeCode + (nextZimu + nextNum); } } return newcode; @@ -107,7 +110,7 @@ public class YouBianCodeUtil { * @return */ private static String getStrNum(int num) { - String s = String.format("%0" + numLength + "d", num); + String s = String.format("%0" + NUM_LENGTH + "d", num); return s; } @@ -129,7 +132,7 @@ public class YouBianCodeUtil { * @return */ private static char getNextZiMu(char zimu) { - if (zimu == 'Z') { + if (zimu == LETTER) { return 'A'; } zimu++; @@ -145,21 +148,21 @@ public class YouBianCodeUtil { if(length==0){ return 0; } - String max_num = ""; + StringBuilder maxNum = new StringBuilder(); for (int i=0;i dialectMap = new HashMap(); static{ dialectMap.put("mysql", "org.hibernate.dialect.MySQL5InnoDBDialect"); - dialectMap.put("mariadb", "org.hibernate.dialect.MariaDBDialect");// 1 -- - dialectMap.put("oracle", "org.hibernate.dialect.OracleDialect");//1 - dialectMap.put("oracle12c", "org.hibernate.dialect.OracleDialect"); // TODO 没找到不确定 - dialectMap.put("db2", "org.hibernate.dialect.DB2390Dialect"); // 1xx - dialectMap.put("h2", "org.hibernate.dialect.HSQLDialect");// H2数据库 - dialectMap.put("hsql", "org.hibernate.dialect.HSQLDialect");// HSQL数据库 1 - dialectMap.put("sqlite", "org.jeecg.modules.online.config.dialect.SQLiteDialect"); //SQLite数据库 应用平台mobile - dialectMap.put("postgresql", "org.hibernate.dialect.PostgreSQLDialect"); //1 -- + // mariadb数据库 1 -- + dialectMap.put("mariadb", "org.hibernate.dialect.MariaDBDialect"); + //oracle数据库 1 + dialectMap.put("oracle", "org.hibernate.dialect.OracleDialect"); + // TODO 没找到不确定 + dialectMap.put("oracle12c", "org.hibernate.dialect.OracleDialect"); + // db2数据库 1xx + dialectMap.put("db2", "org.hibernate.dialect.DB2390Dialect"); + // H2数据库 + dialectMap.put("h2", "org.hibernate.dialect.HSQLDialect"); + // HSQL数据库 1 + dialectMap.put("hsql", "org.hibernate.dialect.HSQLDialect"); + //SQLite数据库 应用平台mobile + dialectMap.put("sqlite", "org.jeecg.modules.online.config.dialect.SQLiteDialect"); + //PostgreSQL数据库1 -- + dialectMap.put("postgresql", "org.hibernate.dialect.PostgreSQLDialect"); dialectMap.put("sqlserver2005", "org.hibernate.dialect.SQLServer2005Dialect"); - dialectMap.put("sqlserver", "org.hibernate.dialect.SQLServerDialect"); //1 - dialectMap.put("dm", "org.hibernate.dialect.DmDialect");//达梦数据库 [国产] 1-- - dialectMap.put("xugu", "org.hibernate.dialect.HSQLDialect"); //虚谷数据库 - dialectMap.put("kingbasees", "org.hibernate.dialect.PostgreSQLDialect"); //人大金仓 [国产] 1 - dialectMap.put("phoenix", "org.hibernate.dialect.HSQLDialect"); // Phoenix HBase数据库 - dialectMap.put("zenith", "org.hibernate.dialect.PostgreSQLDialect"); // Gauss 数据库 - dialectMap.put("clickhouse", "org.hibernate.dialect.MySQLDialect"); //阿里云PolarDB - dialectMap.put("gbase", "org.hibernate.dialect.PostgreSQLDialect"); // 南大通用数据库 TODO 没找到不确定 - dialectMap.put("oscar", "org.hibernate.dialect.PostgreSQLDialect"); //神通数据库 [国产] TODO 没找到不确定 - dialectMap.put("sybase", "org.hibernate.dialect.SybaseDialect"); //Sybase ASE 数据库 - dialectMap.put("oceanbase", "org.hibernate.dialect.PostgreSQLDialect"); //OceanBase 数据库 TODO 没找到不确定 + //sqlserver数据库1 + dialectMap.put("sqlserver", "org.hibernate.dialect.SQLServerDialect"); + //达梦数据库 [国产] 1-- + dialectMap.put("dm", "org.hibernate.dialect.DmDialect"); + //虚谷数据库 + dialectMap.put("xugu", "org.hibernate.dialect.HSQLDialect"); + //人大金仓 [国产] 1 + dialectMap.put("kingbasees", "org.hibernate.dialect.PostgreSQLDialect"); + // Phoenix HBase数据库 + dialectMap.put("phoenix", "org.hibernate.dialect.HSQLDialect"); + // Gauss 数据库 + dialectMap.put("zenith", "org.hibernate.dialect.PostgreSQLDialect"); + //阿里云PolarDB + dialectMap.put("clickhouse", "org.hibernate.dialect.MySQLDialect"); + // 南大通用数据库 TODO 没找到不确定 + dialectMap.put("gbase", "org.hibernate.dialect.PostgreSQLDialect"); + //神通数据库 [国产] TODO 没找到不确定 + dialectMap.put("oscar", "org.hibernate.dialect.PostgreSQLDialect"); + //Sybase ASE 数据库 + dialectMap.put("sybase", "org.hibernate.dialect.SybaseDialect"); + dialectMap.put("oceanbase", "org.hibernate.dialect.PostgreSQLDialect"); dialectMap.put("Firebird", "org.hibernate.dialect.FirebirdDialect"); - dialectMap.put("highgo", "org.hibernate.dialect.HSQLDialect"); //瀚高数据库 + //瀚高数据库 + dialectMap.put("highgo", "org.hibernate.dialect.HSQLDialect"); dialectMap.put("other", "org.hibernate.dialect.PostgreSQLDialect"); } - public static boolean dbTypeIsMySQL(DbType dbType) { + public static boolean dbTypeIsMySql(DbType dbType) { return dbTypeIf(dbType, DbType.MYSQL, DbType.MARIADB, DbType.CLICK_HOUSE, DbType.SQLITE); } @@ -48,7 +68,7 @@ public class DbTypeUtils { return dbTypeIf(dbType, DbType.ORACLE, DbType.ORACLE_12C, DbType.DM); } - public static boolean dbTypeIsSQLServer(DbType dbType) { + public static boolean dbTypeIsSqlServer(DbType dbType) { return dbTypeIf(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005); } @@ -70,7 +90,7 @@ public class DbTypeUtils { return DataBaseConstant.DB_TYPE_HSQL; }else if(dbTypeIsOracle(dbType)){ return DataBaseConstant.DB_TYPE_ORACLE; - }else if(dbTypeIsSQLServer(dbType)){ + }else if(dbTypeIsSqlServer(dbType)){ return DataBaseConstant.DB_TYPE_SQLSERVER; }else if(dbTypeIsPostgre(dbType)){ return DataBaseConstant.DB_TYPE_POSTGRESQL; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java index f05822c4..38b172f9 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java @@ -274,7 +274,15 @@ public class DynamicDBUtil { return list; } - //此方法只能返回单列,不能返回实体类 + /** + * 此方法只能返回单列,不能返回实体类 + * @param dbKey 数据源的key + * @param sql sal + * @param clazz 类 + * @param param 参数 + * @param + * @return + */ public static List findList(final String dbKey, String sql, Class clazz, Object... param) { List list; JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java index 94df2145..85c77b5e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java @@ -6,6 +6,8 @@ import freemarker.template.Configuration; import freemarker.template.Template; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.jeecg.common.constant.DataBaseConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecgframework.codegenerate.generate.util.SimpleFormat; import java.io.StringWriter; @@ -31,26 +33,26 @@ public class FreemarkerParseFactory { /** * 文件缓存 */ - private static final Configuration _tplConfig = new Configuration(); + private static final Configuration TPL_CONFIG = new Configuration(); /** * SQL 缓存 */ - private static final Configuration _sqlConfig = new Configuration(); + private static final Configuration SQL_CONFIG = new Configuration(); private static StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); - // 使用内嵌的(?ms)打开单行和多行模式 - private final static Pattern p = Pattern + /**使用内嵌的(?ms)打开单行和多行模式*/ + private final static Pattern NOTES_PATTERN = Pattern .compile("(?ms)/\\*.*?\\*/|^\\s*//.*?$"); static { - _tplConfig.setClassForTemplateLoading( + TPL_CONFIG.setClassForTemplateLoading( new FreemarkerParseFactory().getClass(), "/"); - _tplConfig.setNumberFormat("0.#####################"); - _sqlConfig.setTemplateLoader(stringTemplateLoader); - _sqlConfig.setNumberFormat("0.#####################"); + TPL_CONFIG.setNumberFormat("0.#####################"); + SQL_CONFIG.setTemplateLoader(stringTemplateLoader); + SQL_CONFIG.setNumberFormat("0.#####################"); //classic_compatible设置,解决报空指针错误 - _sqlConfig.setClassicCompatible(true); + SQL_CONFIG.setClassicCompatible(true); } /** @@ -60,7 +62,7 @@ public class FreemarkerParseFactory { */ public static boolean isExistTemplate(String tplName) throws Exception { try { - Template mytpl = _tplConfig.getTemplate(tplName, "UTF-8"); + Template mytpl = TPL_CONFIG.getTemplate(tplName, "UTF-8"); if (mytpl == null) { return false; } @@ -88,7 +90,7 @@ public class FreemarkerParseFactory { try { log.debug(" minidao sql templdate : " + tplName); StringWriter swriter = new StringWriter(); - Template mytpl = _tplConfig.getTemplate(tplName, ENCODE); + Template mytpl = TPL_CONFIG.getTemplate(tplName, ENCODE); if (paras.containsKey(MINI_DAO_FORMAT)) { throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); } @@ -116,11 +118,12 @@ public class FreemarkerParseFactory { public static String parseTemplateContent(String tplContent, Map paras) { try { + String sqlUnderline="sql_"; StringWriter swriter = new StringWriter(); - if (stringTemplateLoader.findTemplateSource("sql_" + tplContent.hashCode()) == null) { - stringTemplateLoader.putTemplate("sql_" + tplContent.hashCode(), tplContent); + if (stringTemplateLoader.findTemplateSource(sqlUnderline + tplContent.hashCode()) == null) { + stringTemplateLoader.putTemplate(sqlUnderline + tplContent.hashCode(), tplContent); } - Template mytpl = _sqlConfig.getTemplate("sql_" + tplContent.hashCode(), ENCODE); + Template mytpl = SQL_CONFIG.getTemplate(sqlUnderline + tplContent.hashCode(), ENCODE); if (paras.containsKey(MINI_DAO_FORMAT)) { throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); } @@ -143,27 +146,35 @@ public class FreemarkerParseFactory { */ private static String getSqlText(String sql) { // 将注释替换成"" - sql = p.matcher(sql).replaceAll(""); + sql = NOTES_PATTERN.matcher(sql).replaceAll(""); sql = sql.replaceAll("\\n", " ").replaceAll("\\t", " ") .replaceAll("\\s{1,}", " ").trim(); // 去掉 最后是 where这样的问题 - if (sql.endsWith("where") || sql.endsWith("where ")) { + //where空格 "where " + String whereSpace = DataBaseConstant.SQL_WHERE+" "; + //"where and" + String whereAnd = DataBaseConstant.SQL_WHERE+" and"; + //", where" + String commaWhere = SymbolConstant.COMMA+" "+DataBaseConstant.SQL_WHERE; + //", " + String commaSpace = SymbolConstant.COMMA + " "; + if (sql.endsWith(DataBaseConstant.SQL_WHERE) || sql.endsWith(whereSpace)) { sql = sql.substring(0, sql.lastIndexOf("where")); } // 去掉where and 这样的问题 int index = 0; - while ((index = StringUtils.indexOfIgnoreCase(sql, "where and", index)) != -1) { + while ((index = StringUtils.indexOfIgnoreCase(sql, whereAnd, index)) != -1) { sql = sql.substring(0, index + 5) + sql.substring(index + 9, sql.length()); } // 去掉 , where 这样的问题 index = 0; - while ((index = StringUtils.indexOfIgnoreCase(sql, ", where", index)) != -1) { + while ((index = StringUtils.indexOfIgnoreCase(sql, commaWhere, index)) != -1) { sql = sql.substring(0, index) + sql.substring(index + 1, sql.length()); } // 去掉 最后是 ,这样的问题 - if (sql.endsWith(",") || sql.endsWith(", ")) { + if (sql.endsWith(SymbolConstant.COMMA) || sql.endsWith(commaSpace)) { sql = sql.substring(0, sql.lastIndexOf(",")); } return sql; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java index a2c4358b..ea628dd9 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java @@ -7,11 +7,15 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** - * AES 加密 + * @Description: AES 加密 + * @author: jeecg-boot + * @date: 2022/3/30 11:48 */ public class AesEncryptUtil { - //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! + /** + * 使用AES-128-CBC加密模式 key和iv可以相同 + */ private static String KEY = EncryptedString.key; private static String IV = EncryptedString.iv; @@ -26,7 +30,8 @@ public class AesEncryptUtil { public static String encrypt(String data, String key, String iv) throws Exception { try { - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding + //"算法/模式/补码方式"NoPadding PkcsPadding + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); byte[] dataBytes = data.getBytes(); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java index 5fea9297..adb7a8e0 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java @@ -3,10 +3,20 @@ package org.jeecg.common.util.encryption; import lombok.Data; +/** + * @Description: EncryptedString + * @author: jeecg-boot + */ @Data public class EncryptedString { - public static String key = "1234567890adbcde";//长度为16个字符 + /** + * 长度为16个字符 + */ + public static String key = "1234567890adbcde"; - public static String iv = "1234567890hjlkew";//长度为16个字符 + /** + * 长度为16个字符 + */ + public static String iv = "1234567890hjlkew"; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/FileTypeFilter.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/FileTypeFilter.java index fd36d7e8..68f8de91 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/FileTypeFilter.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/FileTypeFilter.java @@ -16,15 +16,15 @@ import java.util.regex.Pattern; */ public class FileTypeFilter { - //文件后缀 + /**文件后缀*/ private static String[] forbidType = {"jsp","php"}; - // 初始化文件头类型,不够的自行补充 - final static HashMap fileTypeMap = new HashMap<>(); + /**初始化文件头类型,不够的自行补充*/ + final static HashMap FILE_TYPE_MAP = new HashMap<>(); static { - fileTypeMap.put("3c25402070616765206c", "jsp"); - fileTypeMap.put("3c3f7068700a0a2f2a2a0a202a205048", "php"); + FILE_TYPE_MAP.put("3c25402070616765206c", "jsp"); + FILE_TYPE_MAP.put("3c3f7068700a0a2f2a2a0a202a205048", "php"); /* fileTypeMap.put("ffd8ffe000104a464946", "jpg"); fileTypeMap.put("89504e470d0a1a0a0000", "png"); fileTypeMap.put("47494638396126026f01", "gif"); @@ -120,13 +120,13 @@ public class FileTypeFilter { byte[] b = new byte[10]; is.read(b, 0, b.length); String fileTypeHex = String.valueOf(bytesToHexString(b)); - Iterator keyIter = fileTypeMap.keySet().iterator(); + Iterator keyIter = FILE_TYPE_MAP.keySet().iterator(); while (keyIter.hasNext()) { String key = keyIter.next(); // 验证前5个字符比较 if (key.toLowerCase().startsWith(fileTypeHex.toLowerCase().substring(0, 5)) || fileTypeHex.toLowerCase().substring(0, 5).startsWith(key.toLowerCase())) { - fileExtendName = fileTypeMap.get(key); + fileExtendName = FILE_TYPE_MAP.get(key); break; } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/StrAttackFilter.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/StrAttackFilter.java index 9197a7d6..0f522c2f 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/StrAttackFilter.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/StrAttackFilter.java @@ -6,6 +6,7 @@ import java.util.regex.PatternSyntaxException; /** * 文件上传字符串过滤特殊字符 + * @author: jeecg-boot */ public class StrAttackFilter { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java index 6192fc73..977ae500 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java @@ -2,6 +2,8 @@ package org.jeecg.common.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.SymbolConstant; import org.springframework.beans.BeanUtils; import javax.servlet.http.HttpServletRequest; @@ -34,14 +36,14 @@ public class oConvertUtils { if ("".equals(object)) { return (true); } - if ("null".equals(object)) { + if (CommonConstant.STRING_NULL.equals(object)) { return (true); } return (false); } public static boolean isNotEmpty(Object object) { - if (object != null && !object.equals("") && !object.equals("null")) { + if (object != null && !"".equals(object) && !object.equals(CommonConstant.STRING_NULL)) { return (true); } return (false); @@ -52,7 +54,8 @@ public class oConvertUtils { return temp; } - public static String StrToUTF(String strIn, String sourceCode, String targetCode) { + @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming") + public static String StrToUTF(String strIn, String sourceCode, String targetCode) { strIn = ""; try { strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK"); @@ -66,7 +69,7 @@ public class oConvertUtils { private static String code2code(String strIn, String sourceCode, String targetCode) { String strOut = null; - if (strIn == null || (strIn.trim()).equals("")) { + if (strIn == null || "".equals(strIn.trim())) { return strIn; } try { @@ -279,13 +282,13 @@ public class oConvertUtils { */ public static String getIpAddrByRequest(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; @@ -296,23 +299,28 @@ public class oConvertUtils { * @throws SocketException */ public static String getRealIp() throws SocketException { - String localip = null;// 本地IP,如果没有配置外网IP则返回它 - String netip = null;// 外网IP + // 本地IP,如果没有配置外网IP则返回它 + String localip = null; + // 外网IP + String netip = null; Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces(); InetAddress ip = null; - boolean finded = false;// 是否找到外网IP + // 是否找到外网IP + boolean finded = false; while (netInterfaces.hasMoreElements() && !finded) { NetworkInterface ni = netInterfaces.nextElement(); Enumeration address = ni.getInetAddresses(); while (address.hasMoreElements()) { ip = address.nextElement(); - if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IP + // 外网IP + if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) { netip = ip.getHostAddress(); finded = true; break; - } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 内网IP - localip = ip.getHostAddress(); + } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) { + // 内网IP + localip = ip.getHostAddress(); } } } @@ -333,7 +341,8 @@ public class oConvertUtils { public static String replaceBlank(String str) { String dest = ""; if (str != null) { - Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + String reg = "\\s*|\t|\r|\n"; + Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); dest = m.replaceAll(""); } @@ -365,7 +374,7 @@ public class oConvertUtils { * 获取Map对象 */ public static Map getHashMap() { - return new HashMap(); + return new HashMap<>(5); } /** @@ -374,7 +383,7 @@ public class oConvertUtils { * @param str * @return */ - public static Map SetToMap(Set setobj) { + public static Map setToMap(Set setobj) { Map map = getHashMap(); for (Iterator iterator = setobj.iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); @@ -384,7 +393,7 @@ public class oConvertUtils { } - public static boolean isInnerIP(String ipAddress) { + public static boolean isInnerIp(String ipAddress) { boolean isInnerIp = false; long ipNum = getIpNum(ipAddress); /** @@ -396,7 +405,8 @@ public class oConvertUtils { long bEnd = getIpNum("172.31.255.255"); long cBegin = getIpNum("192.168.0.0"); long cEnd = getIpNum("192.168.255.255"); - isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1"); + String localIp = "127.0.0.1"; + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || localIp.equals(ipAddress); return isInnerIp; } @@ -430,7 +440,7 @@ public class oConvertUtils { if (name == null || name.isEmpty()) { // 没必要转换 return ""; - } else if (!name.contains("_")) { + } else if (!name.contains(SymbolConstant.UNDERLINE)) { // 不含下划线,仅将首字母小写 //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 @@ -438,7 +448,7 @@ public class oConvertUtils { //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 } // 用下划线将原始字符串分割 - String camels[] = name.split("_"); + String[] camels = name.split("_"); for (String camel : camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线 if (camel.isEmpty()) { @@ -467,7 +477,7 @@ public class oConvertUtils { * @return 转换后的驼峰式命名的字符串 */ public static String camelNames(String names) { - if(names==null||names.equals("")){ + if(names==null||"".equals(names)){ return null; } StringBuffer sf = new StringBuffer(); @@ -496,12 +506,12 @@ public class oConvertUtils { if (name == null || name.isEmpty()) { // 没必要转换 return ""; - } else if (!name.contains("_")) { + } else if (!name.contains(SymbolConstant.UNDERLINE)) { // 不含下划线,仅将首字母小写 return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase(); } // 用下划线将原始字符串分割 - String camels[] = name.split("_"); + String[] camels = name.split("_"); for (String camel : camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线 if (camel.isEmpty()) { @@ -521,11 +531,13 @@ public class oConvertUtils { * @return */ public static String camelToUnderline(String para){ - if(para.length()<3){ + int length = 3; + if(para.length()> toLowerCasePageList(List> list){ List> select = new ArrayList<>(); for (Map row : list) { - Map resultMap = new HashMap<>(); + Map resultMap = new HashMap<>(5); Set keySet = row.keySet(); for (String key : keySet) { String newKey = key.toLowerCase(); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java index f57d00f5..92847974 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java @@ -8,6 +8,8 @@ import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.PutObjectResult; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.FileItemStream; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.CommonUtils; import org.jeecg.common.util.filter.FileTypeFilter; import org.jeecg.common.util.filter.StrAttackFilter; @@ -25,6 +27,7 @@ import java.util.UUID; /** * @Description: 阿里云 oss 上传工具类(高依赖版) * @Date: 2019/5/10 + * @author: jeecg-boot */ @Slf4j public class OssBootUtil { @@ -94,8 +97,8 @@ public class OssBootUtil { * @return oss 中的相对文件路径 */ public static String upload(MultipartFile file, String fileDir,String customBucket) { - String FILE_URL = null; - initOSS(endPoint, accessKeyId, accessKeySecret); + String filePath = null; + initOss(endPoint, accessKeyId, accessKeySecret); StringBuilder fileUrl = new StringBuilder(); String newBucket = bucketName; if(oConvertUtils.isNotEmpty(customBucket)){ @@ -118,18 +121,18 @@ public class OssBootUtil { String fileName = orgName.indexOf(".")==-1 ?orgName + "_" + System.currentTimeMillis() :orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")); - if (!fileDir.endsWith("/")) { - fileDir = fileDir.concat("/"); + if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH)) { + fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH); } //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 fileDir=StrAttackFilter.filter(fileDir); //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击 fileUrl = fileUrl.append(fileDir + fileName); - if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { - FILE_URL = staticDomain + "/" + fileUrl; + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) { + filePath = staticDomain + SymbolConstant.SINGLE_SLASH + fileUrl; } else { - FILE_URL = "https://" + newBucket + "." + endPoint + "/" + fileUrl; + filePath = "https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl; } PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream()); // 设置权限(公开读) @@ -144,7 +147,7 @@ public class OssBootUtil { e.printStackTrace(); return null; } - return FILE_URL; + return filePath; } /** @@ -180,21 +183,21 @@ public class OssBootUtil { * @return oss 中的相对文件路径 */ public static String upload(FileItemStream file, String fileDir) { - String FILE_URL = null; - initOSS(endPoint, accessKeyId, accessKeySecret); + String filePath = null; + initOss(endPoint, accessKeyId, accessKeySecret); StringBuilder fileUrl = new StringBuilder(); try { String suffix = file.getName().substring(file.getName().lastIndexOf('.')); String fileName = UUID.randomUUID().toString().replace("-", "") + suffix; - if (!fileDir.endsWith("/")) { - fileDir = fileDir.concat("/"); + if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH)) { + fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH); } fileDir = StrAttackFilter.filter(fileDir); fileUrl = fileUrl.append(fileDir + fileName); - if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { - FILE_URL = staticDomain + "/" + fileUrl; + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) { + filePath = staticDomain + SymbolConstant.SINGLE_SLASH + fileUrl; } else { - FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl; + filePath = "https://" + bucketName + "." + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl; } PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream()); // 设置权限(公开读) @@ -206,7 +209,7 @@ public class OssBootUtil { e.printStackTrace(); return null; } - return FILE_URL; + return filePath; } /** @@ -227,10 +230,10 @@ public class OssBootUtil { newBucket = bucket; } String bucketUrl = ""; - if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { - bucketUrl = staticDomain + "/" ; + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) { + bucketUrl = staticDomain + SymbolConstant.SINGLE_SLASH ; } else { - bucketUrl = "https://" + newBucket + "." + endPoint + "/"; + bucketUrl = "https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH; } url = url.replace(bucketUrl,""); ossClient.deleteObject(newBucket, url); @@ -257,7 +260,7 @@ public class OssBootUtil { if(oConvertUtils.isNotEmpty(bucket)){ newBucket = bucket; } - initOSS(endPoint, accessKeyId, accessKeySecret); + initOss(endPoint, accessKeyId, accessKeySecret); //update-begin---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件---- objectName = OssBootUtil.replacePrefix(objectName,bucket); //update-end---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件---- @@ -285,8 +288,8 @@ public class OssBootUtil { * @param expires * @return */ - public static String getObjectURL(String bucketName, String objectName, Date expires) { - initOSS(endPoint, accessKeyId, accessKeySecret); + public static String getObjectUrl(String bucketName, String objectName, Date expires) { + initOss(endPoint, accessKeyId, accessKeySecret); try{ //update-begin---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件---- objectName = OssBootUtil.replacePrefix(objectName,bucketName); @@ -306,7 +309,7 @@ public class OssBootUtil { * * @return */ - private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) { + private static OSSClient initOss(String endpoint, String accessKeyId, String accessKeySecret) { if (ossClient == null) { ossClient = new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), @@ -323,13 +326,13 @@ public class OssBootUtil { * @return */ public static String upload(InputStream stream, String relativePath) { - String FILE_URL = null; + String filePath = null; String fileUrl = relativePath; - initOSS(endPoint, accessKeyId, accessKeySecret); - if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) { - FILE_URL = staticDomain + "/" + relativePath; + initOss(endPoint, accessKeyId, accessKeySecret); + if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) { + filePath = staticDomain + SymbolConstant.SINGLE_SLASH + relativePath; } else { - FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl; + filePath = "https://" + bucketName + "." + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl; } PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream); // 设置权限(公开读) @@ -337,7 +340,7 @@ public class OssBootUtil { if (result != null) { log.info("------OSS文件上传成功------" + fileUrl); } - return FILE_URL; + return filePath; } /** @@ -351,13 +354,13 @@ public class OssBootUtil { private static String replacePrefix(String objectName,String customBucket){ log.info("------replacePrefix---替换前---objectName:{}",objectName); if(oConvertUtils.isNotEmpty(staticDomain)){ - objectName= objectName.replace(staticDomain+"/",""); + objectName= objectName.replace(staticDomain+SymbolConstant.SINGLE_SLASH,""); }else{ String newBucket = bucketName; if(oConvertUtils.isNotEmpty(customBucket)){ newBucket = customBucket; } - String path ="https://" + newBucket + "." + endPoint + "/"; + String path ="https://" + newBucket + "." + endPoint + SymbolConstant.SINGLE_SLASH; objectName = objectName.replace(path,""); } log.info("------replacePrefix---替换后---objectName:{}",objectName); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/AbstractQueryBlackListHandler.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/AbstractQueryBlackListHandler.java new file mode 100644 index 00000000..2806f31b --- /dev/null +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/AbstractQueryBlackListHandler.java @@ -0,0 +1,174 @@ +package org.jeecg.common.util.security; + +import lombok.extern.slf4j.Slf4j; + +import java.util.*; + +/** + * 查询表/字段 黑名单处理 + * @Author taoYan + * @Date 2022/3/17 11:21 + **/ +@Slf4j +public abstract class AbstractQueryBlackListHandler { + + /** + * key-表名 + * value-字段名,多个逗号隔开 + * 两种配置方式-- 全部配置成小写 + * ruleMap.put("sys_user", "*")sys_user所有的字段不支持查询 + * ruleMap.put("sys_user", "username,password")sys_user中的username和password不支持查询 + */ + public static Map ruleMap = new HashMap<>(); + + static { + ruleMap.put("sys_user", "password,salt"); + } + + + /** + * 根据 sql语句 获取表和字段信息,需要到具体的实现类重写此方法- + * 不同的场景 处理可能不太一样 需要自定义,但是返回值确定 + * @param sql + * @return + */ + protected abstract List getQueryTableInfo(String sql); + + + /** + * 校验sql语句 成功返回true + * @param sql + * @return + */ + public boolean isPass(String sql) { + List list = this.getQueryTableInfo(sql.toLowerCase()); + if(list==null){ + return true; + } + log.info("--获取sql信息--", list.toString()); + boolean flag = true; + for (QueryTable table : list) { + String name = table.getName(); + String fieldString = ruleMap.get(name); + // 有没有配置这张表 + if (fieldString != null) { + if ("*".equals(fieldString) || table.isAll()) { + flag = false; + log.warn("sql黑名单校验,表【"+name+"】禁止查询"); + break; + } else if (table.existSameField(fieldString)) { + flag = false; + break; + } + + } + } + return flag; + } + + /** + * 查询的表的信息 + */ + protected class QueryTable { + //表名 + private String name; + //表的别名 + private String alias; + // 字段名集合 + private Set fields; + // 是否查询所有字段 + private boolean all; + + public QueryTable() { + } + + public QueryTable(String name, String alias) { + this.name = name; + this.alias = alias; + this.all = false; + this.fields = new HashSet<>(); + } + + public void addField(String field) { + this.fields.add(field); + } + + public String getName() { + return name; + } + + public Set getFields() { + return new HashSet<>(fields); + } + + public void setName(String name) { + this.name = name; + } + + public void setFields(Set fields) { + this.fields = fields; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public boolean isAll() { + return all; + } + + public void setAll(boolean all) { + this.all = all; + } + + /** + * 判断是否有相同字段 + * + * @param fieldString + * @return + */ + public boolean existSameField(String fieldString) { + String[] arr = fieldString.split(","); + for (String exp : fields) { + for (String config : arr) { + if (exp.equals(config)) { + // 非常明确的列直接比较 + log.warn("sql黑名单校验,表【"+name+"】中字段【"+config+"】禁止查询"); + return true; + } else { + // 使用表达式的列 只能判读字符串包含了 + String aliasColumn = config; + if (alias != null && alias.length() > 0) { + aliasColumn = alias + "." + config; + } + if (exp.indexOf(aliasColumn) > 0) { + log.warn("sql黑名单校验,表【"+name+"】中字段【"+config+"】禁止查询"); + return true; + } + } + } + } + return false; + } + + @Override + public String toString() { + return "QueryTable{" + + "name='" + name + '\'' + + ", alias='" + alias + '\'' + + ", fields=" + fields + + ", all=" + all + + '}'; + } + } + + public String getError(){ + // TODO + return "sql黑名单校验不通过,请联系管理员!"; + } + +} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/SecurityTools.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/SecurityTools.java index dec223fb..9adc8bf1 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/SecurityTools.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/SecurityTools.java @@ -13,6 +13,10 @@ import com.alibaba.fastjson.JSONObject; import javax.crypto.SecretKey; import java.security.KeyPair; +/** + * @Description: SecurityTools + * @author: jeecg-boot + */ public class SecurityTools { public static final String ALGORITHM = "AES/ECB/PKCS5Padding"; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/MyKeyPair.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/MyKeyPair.java index afa945d9..d2cb849b 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/MyKeyPair.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/MyKeyPair.java @@ -2,6 +2,10 @@ package org.jeecg.common.util.security.entity; import lombok.Data; +/** + * @Description: MyKeyPair + * @author: jeecg-boot + */ @Data public class MyKeyPair { private String priKey; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityReq.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityReq.java index 32c92ba8..9714728d 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityReq.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityReq.java @@ -2,6 +2,10 @@ package org.jeecg.common.util.security.entity; import lombok.Data; +/** + * @Description: SecurityReq + * @author: jeecg-boot + */ @Data public class SecurityReq { private String data; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityResp.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityResp.java index d5415d08..a62034c8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityResp.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityResp.java @@ -3,6 +3,10 @@ package org.jeecg.common.util.security.entity; import com.alibaba.fastjson.JSONObject; import lombok.Data; +/** + * @Description: SecurityResp + * @author: jeecg-boot + */ @Data public class SecurityResp { private Boolean success; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignReq.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignReq.java index 92028cb8..9b43dcd9 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignReq.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignReq.java @@ -2,6 +2,10 @@ package org.jeecg.common.util.security.entity; import lombok.Data; +/** + * @Description: SecuritySignReq + * @author: jeecg-boot + */ @Data public class SecuritySignReq { private String data; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignResp.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignResp.java index af02b66a..ab618f4b 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignResp.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignResp.java @@ -2,6 +2,10 @@ package org.jeecg.common.util.security.entity; import lombok.Data; +/** + * @Description: SecuritySignResp + * @author: jeecg-boot + */ @Data public class SecuritySignResp { private String data; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java index 7b1311c3..5091e9cb 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java @@ -1,60 +1,60 @@ -package org.jeecg.common.util.superSearch; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; - -/** - * 判断类型,追加查询规则 - * - * @Author Scott - * @Date 2019年02月14日 - */ -public class ObjectParseUtil { - - /** - * - * @param queryWrapper QueryWrapper - * @param name 字段名字 - * @param rule 查询规则 - * @param value 查询条件值 - */ - public static void addCriteria(QueryWrapper queryWrapper, String name, QueryRuleEnum rule, Object value) { - if (value == null || rule == null) { - return; - } - switch (rule) { - case GT: - queryWrapper.gt(name, value); - break; - case GE: - queryWrapper.ge(name, value); - break; - case LT: - queryWrapper.lt(name, value); - break; - case LE: - queryWrapper.le(name, value); - break; - case EQ: - queryWrapper.eq(name, value); - break; - case NE: - queryWrapper.ne(name, value); - break; - case IN: - queryWrapper.in(name, (Object[]) value); - break; - case LIKE: - queryWrapper.like(name, value); - break; - case LEFT_LIKE: - queryWrapper.likeLeft(name, value); - break; - case RIGHT_LIKE: - queryWrapper.likeRight(name, value); - break; - default: - break; - } - } - -} +//package org.jeecg.common.util.superSearch; +// +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +// +///** +// * 判断类型,追加查询规则 +// * +// * @Author Scott +// * @Date 2019年02月14日 +// */ +//public class ObjectParseUtil { +// +// /** +// * +// * @param queryWrapper QueryWrapper +// * @param name 字段名字 +// * @param rule 查询规则 +// * @param value 查询条件值 +// */ +// public static void addCriteria(QueryWrapper queryWrapper, String name, QueryRuleEnum rule, Object value) { +// if (value == null || rule == null) { +// return; +// } +// switch (rule) { +// case GT: +// queryWrapper.gt(name, value); +// break; +// case GE: +// queryWrapper.ge(name, value); +// break; +// case LT: +// queryWrapper.lt(name, value); +// break; +// case LE: +// queryWrapper.le(name, value); +// break; +// case EQ: +// queryWrapper.eq(name, value); +// break; +// case NE: +// queryWrapper.ne(name, value); +// break; +// case IN: +// queryWrapper.in(name, (Object[]) value); +// break; +// case LIKE: +// queryWrapper.like(name, value); +// break; +// case LEFT_LIKE: +// queryWrapper.likeLeft(name, value); +// break; +// case RIGHT_LIKE: +// queryWrapper.likeRight(name, value); +// break; +// default: +// break; +// } +// } +// +//} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java index d89b4144..0bfb9d82 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java @@ -1,60 +1,71 @@ -package org.jeecg.common.util.superSearch; - -import org.jeecg.common.util.oConvertUtils; - -/** - * Query 规则 常量 - * @Author Scott - * @Date 2019年02月14日 - */ -public enum QueryRuleEnum { - - GT(">","大于"), - GE(">=","大于等于"), - LT("<","小于"), - LE("<=","小于等于"), - EQ("=","等于"), - NE("!=","不等于"), - IN("IN","包含"), - LIKE("LIKE","全模糊"), - LEFT_LIKE("LEFT_LIKE","左模糊"), - RIGHT_LIKE("RIGHT_LIKE","右模糊"), - SQL_RULES("EXTEND_SQL","自定义SQL片段"); - - private String value; - - private String msg; - - QueryRuleEnum(String value, String msg){ - this.value = value; - this.msg = msg; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public static QueryRuleEnum getByValue(String value){ - if(oConvertUtils.isEmpty(value)) { - return null; - } - for(QueryRuleEnum val :values()){ - if (val.getValue().equals(value)){ - return val; - } - } - return null; - } -} +//package org.jeecg.common.util.superSearch; +// +//import org.jeecg.common.util.oConvertUtils; +// +///** +// * Query 规则 常量 +// * @Author Scott +// * @Date 2019年02月14日 +// */ +//public enum QueryRuleEnum { +// +// /**查询规则 大于*/ +// GT(">","大于"), +// /**查询规则 大于等于*/ +// GE(">=","大于等于"), +// /**查询规则 小于*/ +// LT("<","小于"), +// /**查询规则 小于等于*/ +// LE("<=","小于等于"), +// /**查询规则 等于*/ +// EQ("=","等于"), +// /**查询规则 不等于*/ +// NE("!=","不等于"), +// /**查询规则 包含*/ +// IN("IN","包含"), +// /**查询规则 全模糊*/ +// LIKE("LIKE","全模糊"), +// /**查询规则 左模糊*/ +// LEFT_LIKE("LEFT_LIKE","左模糊"), +// /**查询规则 右模糊*/ +// RIGHT_LIKE("RIGHT_LIKE","右模糊"), +// /**查询规则 自定义SQL片段*/ +// SQL_RULES("EXTEND_SQL","自定义SQL片段"); +// +// private String value; +// +// private String msg; +// +// QueryRuleEnum(String value, String msg){ +// this.value = value; +// this.msg = msg; +// } +// +// public String getValue() { +// return value; +// } +// +// public void setValue(String value) { +// this.value = value; +// } +// +// public String getMsg() { +// return msg; +// } +// +// public void setMsg(String msg) { +// this.msg = msg; +// } +// +// public static QueryRuleEnum getByValue(String value){ +// if(oConvertUtils.isEmpty(value)) { +// return null; +// } +// for(QueryRuleEnum val :values()){ +// if (val.getValue().equals(value)){ +// return val; +// } +// } +// return null; +// } +//} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java index b3e33031..94d3408c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java @@ -1,11 +1,15 @@ -package org.jeecg.common.util.superSearch; - -import lombok.Data; - -@Data -public class QueryRuleVo { - - private String field; - private String rule; - private String val; -} +//package org.jeecg.common.util.superSearch; +// +//import lombok.Data; +// +///** +// * @Description: QueryRuleVo +// * @author: jeecg-boot +// */ +//@Data +//public class QueryRuleVo { +// +// private String field; +// private String rule; +// private String val; +//} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java index 14eaeb98..12c4fd86 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java @@ -32,7 +32,7 @@ public class AutoPoiDictConfig implements AutoPoiDictServiceI { @Lazy @Resource - private CommonAPI commonAPI; + private CommonAPI commonApi; /** * 通过字典查询easypoi,所需字典文本 @@ -47,15 +47,17 @@ public class AutoPoiDictConfig implements AutoPoiDictServiceI { List dictList = null; // step.1 如果没有字典表则使用系统字典表 if (oConvertUtils.isEmpty(dicTable)) { - dictList = commonAPI.queryDictItemsByCode(dicCode); + dictList = commonApi.queryDictItemsByCode(dicCode); } else { try { dicText = oConvertUtils.getString(dicText, dicCode); - dictList = commonAPI.queryTableDictItemsByCode(dicTable, dicText, dicCode); + dictList = commonApi.queryTableDictItemsByCode(dicTable, dicText, dicCode); } catch (Exception e) { log.error(e.getMessage(),e); } } + + for (DictModel t : dictList) { if(t!=null){ //update-begin---author:scott Date:20211220 for:[issues/I4MBB3]@Excel dicText字段的值有下划线时,导入功能不能正确解析--- diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java index 01d49bd4..b43cc8e4 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java @@ -7,6 +7,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata; /** * 跨域配置加载条件 + * @author: jeecg-boot */ public class CorsFilterCondition implements Condition { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java index d04c22f5..7659172b 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java @@ -15,6 +15,10 @@ import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; import com.alibaba.druid.util.Utils; +/** + * @Description: DruidConfig配置类 + * @author: jeecg-boot + */ @Configuration @AutoConfigureAfter(DruidDataSourceAutoConfigure.class) public class DruidConfig { @@ -67,8 +71,8 @@ public class DruidConfig { private final String newJs; - public RemoveAdFilter(String newJS) { - this.newJs = newJS; + public RemoveAdFilter(String newJs) { + this.newJs = newJs; } @Override diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeeccgBaseConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeeccgBaseConfig.java index adecdd3d..6f8a3450 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeeccgBaseConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeeccgBaseConfig.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; /** * 加载项目配置 + * @author: jeecg-boot */ @Component("jeeccgBaseConfig") @ConfigurationProperties(prefix = "jeecg") diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java index 701f8c2c..34b8e9aa 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java @@ -7,6 +7,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata; /** * 微服务环境加载条件 + * @author: jeecg-boot */ public class JeecgCloudCondition implements Condition { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/RestTemplateConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/RestTemplateConfig.java index 61b12856..860889af 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/RestTemplateConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/RestTemplateConfig.java @@ -8,6 +8,7 @@ import org.springframework.web.client.RestTemplate; /** * 优雅的http请求方式RestTemplate +* @author: jeecg-boot * @Return: */ @Configuration @@ -21,8 +22,10 @@ public class RestTemplateConfig { @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); - factory.setReadTimeout(5000);//ms - factory.setConnectTimeout(15000);//ms + //ms毫秒 + factory.setReadTimeout(5000); + //ms毫秒 + factory.setConnectTimeout(15000); return factory; } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/StaticConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/StaticConfig.java index b6e7b0c6..f5ecdf1c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/StaticConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/StaticConfig.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; /** * 设置静态参数初始化 + * @author: jeecg-boot */ @Component @Data diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java index bedc0963..a3cdcb47 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java @@ -3,38 +3,44 @@ package org.jeecg.config; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - import org.springframework.context.annotation.Import; +import org.springframework.util.ReflectionUtils; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; +import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; +import springfox.documentation.swagger2.annotations.EnableSwagger2; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * @Author scott */ @Configuration -@EnableSwagger2WebMvc -@EnableKnife4j +@EnableSwagger2 //开启 Swagger2 +@EnableKnife4j //开启 knife4j,可以不写 @Import(BeanValidatorPluginsConfiguration.class) public class Swagger2Config implements WebMvcConfigurer { @@ -137,4 +143,42 @@ public class Swagger2Config implements WebMvcConfigurer { Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); } + /** + * 解决springboot2.6 和springfox不兼容问题 + * @return + */ + @Bean + public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { + return new BeanPostProcessor() { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } + + private void customizeSpringfoxHandlerMappings(List mappings) { + List copy = mappings.stream() + .filter(mapping -> mapping.getPatternParser() == null) + .collect(Collectors.toList()); + mappings.clear(); + mappings.addAll(copy); + } + + @SuppressWarnings("unchecked") + private List getHandlerMappings(Object bean) { + try { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + field.setAccessible(true); + return (List) field.get(bean); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + }; + } + + } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java index b5b323bf..31106717 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -3,8 +3,14 @@ package org.jeecg.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -16,7 +22,8 @@ import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -65,7 +72,7 @@ public class WebMvcConfiguration implements WebMvcConfigurer { //是否允许请求带有验证信息 corsConfiguration.setAllowCredentials(true); // 允许访问的客户端域名 - corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.addAllowedOriginPattern("*"); // 允许服务端访问的客户端请求头 corsConfiguration.addAllowedHeader("*"); // 允许访问的方法名,GET POST等 @@ -90,6 +97,22 @@ public class WebMvcConfiguration implements WebMvcConfigurer { converters.add(jackson2HttpMessageConverter); } + /** + * 解决springboot2.6 + * 日期时间格式化 + * @return + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + return builder -> { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + //返回时间数据序列化 + builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + //接收时间数据反序列化 + builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + }; + } + /** * SpringBootAdmin的Httptrace不见了 * https://blog.csdn.net/u013810234/article/details/110097201 @@ -99,4 +122,14 @@ public class WebMvcConfiguration implements WebMvcConfigurer { return new InMemoryHttpTraceRepository(); } + + /** + * 解决springboot2.6 + * 解决metrics端点不显示jvm信息的问题(zyf) + */ + @Bean + InitializingBean forcePrometheusPostProcessor(BeanPostProcessor meterRegistryPostProcessor, PrometheusMeterRegistry registry) { + return () -> meterRegistryPostProcessor.postProcessAfterInitialization(registry, ""); + } + } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java index 27c10d74..52230f86 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java @@ -4,6 +4,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; +/** + * @Description: WebSocketConfig + * @author: jeecg-boot + */ @Configuration public class WebSocketConfig { /** diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java index f2c7f6d2..c9dc36f1 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java @@ -46,9 +46,9 @@ public class MybatisInterceptor implements Interceptor { try { if ("createBy".equals(field.getName())) { field.setAccessible(true); - Object local_createBy = field.get(parameter); + Object localCreateBy = field.get(parameter); field.setAccessible(false); - if (local_createBy == null || local_createBy.equals("")) { + if (localCreateBy == null || "".equals(localCreateBy)) { if (sysUser != null) { // 登录人账号 field.setAccessible(true); @@ -60,9 +60,9 @@ public class MybatisInterceptor implements Interceptor { // 注入创建时间 if ("createTime".equals(field.getName())) { field.setAccessible(true); - Object local_createDate = field.get(parameter); + Object localCreateDate = field.get(parameter); field.setAccessible(false); - if (local_createDate == null || local_createDate.equals("")) { + if (localCreateDate == null || "".equals(localCreateDate)) { field.setAccessible(true); field.set(parameter, new Date()); field.setAccessible(false); @@ -71,9 +71,9 @@ public class MybatisInterceptor implements Interceptor { //注入部门编码 if ("sysOrgCode".equals(field.getName())) { field.setAccessible(true); - Object local_sysOrgCode = field.get(parameter); + Object localSysOrgCode = field.get(parameter); field.setAccessible(false); - if (local_sysOrgCode == null || local_sysOrgCode.equals("")) { + if (localSysOrgCode == null || "".equals(localSysOrgCode)) { // 获取登录用户信息 if (sysUser != null) { field.setAccessible(true); @@ -92,8 +92,9 @@ public class MybatisInterceptor implements Interceptor { if (parameter instanceof ParamMap) { ParamMap p = (ParamMap) parameter; //update-begin-author:scott date:20190729 for:批量更新报错issues/IZA3Q-- - if (p.containsKey("et")) { - parameter = p.get("et"); + String et = "et"; + if (p.containsKey(et)) { + parameter = p.get(et); } else { parameter = p.get("param1"); } @@ -146,6 +147,10 @@ public class MybatisInterceptor implements Interceptor { } //update-begin--Author:scott Date:20191213 for:关于使用Quzrtz 开启线程任务, #465 + /** + * 获取登录用户 + * @return + */ private LoginUser getLoginUser() { LoginUser sysUser = null; try { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java index f0756c2d..99c075a5 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java @@ -31,10 +31,10 @@ public class MybatisPlusSaasConfig { /** * 哪些表需要做多租户 表需要添加一个字段 tenant_id */ - private static final List tenantTable = new ArrayList(); + private static final List TENANT_TABLE = new ArrayList(); static { - tenantTable.add("demo"); + TENANT_TABLE.add("demo"); // //角色、菜单、部门 // tenantTable.add("sys_role"); @@ -50,8 +50,8 @@ public class MybatisPlusSaasConfig { interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { @Override public Expression getTenantId() { - String tenant_id = oConvertUtils.getString(TenantContext.getTenant(),"0"); - return new LongValue(tenant_id); + String tenantId = oConvertUtils.getString(TenantContext.getTenant(),"0"); + return new LongValue(tenantId); } @Override @@ -62,7 +62,7 @@ public class MybatisPlusSaasConfig { // 返回 true 表示不走租户逻辑 @Override public boolean ignoreTable(String tableName) { - for(String temp: tenantTable){ + for(String temp: TENANT_TABLE){ if(temp.equalsIgnoreCase(tableName)){ return false; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/TenantContext.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/TenantContext.java index 23b42136..136c195a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/TenantContext.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/TenantContext.java @@ -4,10 +4,10 @@ import lombok.extern.slf4j.Slf4j; /** * 多租户 tenant_id存储器 + * @author: jeecg-boot */ @Slf4j public class TenantContext { - private static ThreadLocal currentTenant = new ThreadLocal<>(); public static void setTenant(String tenant) { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java index 0373e4a0..5f308bc8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java @@ -1,6 +1,8 @@ package org.jeecg.config.oss; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.MinioUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -8,6 +10,7 @@ import org.springframework.context.annotation.Configuration; /** * Minio文件上传配置文件 + * @author: jeecg-boot */ @Slf4j @Configuration @@ -23,11 +26,11 @@ public class MinioConfig { @Bean public void initMinio(){ - if(!minioUrl.startsWith("http")){ + if(!minioUrl.startsWith(CommonConstant.STR_HTTP)){ minioUrl = "http://" + minioUrl; } - if(!minioUrl.endsWith("/")){ - minioUrl = minioUrl.concat("/"); + if(!minioUrl.endsWith(SymbolConstant.SINGLE_SLASH)){ + minioUrl = minioUrl.concat(SymbolConstant.SINGLE_SLASH); } MinioUtil.setMinioUrl(minioUrl); MinioUtil.setMinioName(minioName); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java index 2dd0701a..efaa2e68 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; /** * 云存储 配置 + * @author: jeecg-boot */ @Configuration public class OssConfiguration { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index bcfb962b..f0fe2d23 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -1,4 +1,3 @@ - package org.jeecg.config.shiro; import lombok.extern.slf4j.Slf4j; @@ -144,6 +143,9 @@ public class ShiroConfig { //性能监控 TODO 存在安全漏洞泄露TOEKN(durid连接池也有) filterChainDefinitionMap.put("/actuator/**", "anon"); + //测试模块排除 + filterChainDefinitionMap.put("/test/seata/**", "anon"); + // 添加自己的过滤器并且取名为jwt Map filterMap = new HashMap(1); //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java index 6ae2094f..acf80f85 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java @@ -15,12 +15,14 @@ import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.TenantContext; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.Set; /** @@ -34,7 +36,7 @@ import java.util.Set; public class ShiroRealm extends AuthorizingRealm { @Lazy @Resource - private CommonAPI commonAPI; + private CommonAPI commonApi; @Lazy @Resource @@ -57,7 +59,7 @@ public class ShiroRealm extends AuthorizingRealm { */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { - log.info("===============Shiro权限认证开始============ [ roles、permissions]=========="); + log.debug("===============Shiro权限认证开始============ [ roles、permissions]=========="); String username = null; if (principals != null) { LoginUser sysUser = (LoginUser) principals.getPrimaryPrincipal(); @@ -66,12 +68,12 @@ public class ShiroRealm extends AuthorizingRealm { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 设置用户拥有的角色集合,比如“admin,test” - Set roleSet = commonAPI.queryUserRoles(username); + Set roleSet = commonApi.queryUserRoles(username); System.out.println(roleSet.toString()); info.setRoles(roleSet); // 设置用户拥有的权限集合,比如“sys:role:add,sys:user:add” - Set permissionSet = commonAPI.queryUserAuths(username); + Set permissionSet = commonApi.queryUserAuths(username); info.addStringPermissions(permissionSet); System.out.println(permissionSet); log.info("===============Shiro权限认证成功=============="); @@ -91,7 +93,8 @@ public class ShiroRealm extends AuthorizingRealm { log.debug("===============Shiro身份认证开始============doGetAuthenticationInfo=========="); String token = (String) auth.getCredentials(); if (token == null) { - log.info("————————身份认证失败——————————IP地址: "+ oConvertUtils.getIpAddrByRequest(SpringContextUtils.getHttpServletRequest())); + HttpServletRequest req = SpringContextUtils.getHttpServletRequest(); + log.info("————————身份认证失败——————————IP地址: "+ oConvertUtils.getIpAddrByRequest(req) +",URL:"+req.getRequestURI()); throw new AuthenticationException("token为空!"); } // 校验token有效性 @@ -120,7 +123,8 @@ public class ShiroRealm extends AuthorizingRealm { // 查询用户信息 log.debug("———校验token是否有效————checkUserTokenIsEffect——————— "+ token); - LoginUser loginUser = commonAPI.getUserByName(username); + LoginUser loginUser = TokenUtils.getLoginUser(username,commonApi,redisUtil); + //LoginUser loginUser = commonApi.getUserByName(username); if (loginUser == null) { throw new AuthenticationException("用户不存在!"); } @@ -136,7 +140,8 @@ public class ShiroRealm extends AuthorizingRealm { String userTenantIds = loginUser.getRelTenantIds(); if(oConvertUtils.isNotEmpty(userTenantIds)){ String contextTenantId = TenantContext.getTenant(); - if(oConvertUtils.isNotEmpty(contextTenantId) && !"0".equals(contextTenantId)){ + String str ="0"; + if(oConvertUtils.isNotEmpty(contextTenantId) && !str.equals(contextTenantId)){ //update-begin-author:taoyan date:20211227 for: /issues/I4O14W 用户租户信息变更判断漏洞 String[] arr = userTenantIds.split(","); if(!oConvertUtils.isIn(contextTenantId, arr)){ @@ -182,6 +187,8 @@ public class ShiroRealm extends AuthorizingRealm { //update-end--Author:scott Date:20191005 for:解决每次请求,都重写redis中 token缓存问题 return true; } + + //redis中不存在此TOEKN,说明token非法返回false return false; } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/CustomShiroFilterFactoryBean.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/CustomShiroFilterFactoryBean.java index 138cc49f..8668a44a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/CustomShiroFilterFactoryBean.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/CustomShiroFilterFactoryBean.java @@ -17,6 +17,7 @@ import java.util.Map; /** * 自定义ShiroFilterFactoryBean解决资源中文路径问题 + * @author: jeecg-boot */ @Slf4j public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java index 21f6c9b2..ded143f5 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java @@ -1,12 +1,14 @@ package org.jeecg.config.shiro.filters; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.TenantContext; import org.jeecg.config.shiro.JwtToken; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.RequestMethod; @@ -82,23 +84,27 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; if(allowOrigin){ - httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); - httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); - httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); - //update-begin-author:scott date:20200907 for:issues/I1TAAP 前后端分离,shiro过滤器配置引起的跨域问题 - // 是否允许发送Cookie,默认Cookie不包括在CORS请求之中。设为true时,表示服务器允许Cookie包含在请求中。 - httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); - //update-end-author:scott date:20200907 for:issues/I1TAAP 前后端分离,shiro过滤器配置引起的跨域问题 + httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, httpServletRequest.getHeader(HttpHeaders.ORIGIN)); + // 允许客户端请求方法 + httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,OPTIONS,PUT,DELETE"); + // 允许客户端提交的Header + String requestHeaders = httpServletRequest.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS); + if (StringUtils.isNotEmpty(requestHeaders)) { + httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders); + } + // 允许客户端携带凭证信息(是否允许发送Cookie) + httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); } // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 - if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + if (RequestMethod.OPTIONS.name().equalsIgnoreCase(httpServletRequest.getMethod())) { httpServletResponse.setStatus(HttpStatus.OK.value()); return false; } //update-begin-author:taoyan date:20200708 for:多租户用到 - String tenant_id = httpServletRequest.getHeader(CommonConstant.TENANT_ID); - TenantContext.setTenant(tenant_id); + String tenantId = httpServletRequest.getHeader(CommonConstant.TENANT_ID); + TenantContext.setTenant(tenantId); //update-end-author:taoyan date:20200708 for:多租户用到 + return super.preHandle(request, response); } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthConfiguration.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthConfiguration.java index aa231b15..e78fa35c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthConfiguration.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthConfiguration.java @@ -7,10 +7,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 签名 拦截器配置 + * @author: jeecg-boot */ @Configuration public class SignAuthConfiguration implements WebMvcConfigurer { - public static String[] urlList = new String[] {"/sys/dict/getDictItems/*", "/sys/dict/loadDict/*", + public static String[] SIGN_URL_LIST = new String[]{"/sys/dict/getDictItems/*", "/sys/dict/loadDict/*", "/sys/dict/loadDictOrderByValue/*", "/sys/dict/loadDictItem/*", "/sys/dict/loadTreeData", "/sys/api/queryTableDictItemsByCode", "/sys/api/queryFilterTableDictInfo", "/sys/api/queryTableDictByKeys", "/sys/api/translateDictFromTable", "/sys/api/translateDictFromTableByKeys"}; @@ -21,6 +22,6 @@ public class SignAuthConfiguration implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(signAuthInterceptor()).addPathPatterns(urlList); + registry.addInterceptor(signAuthInterceptor()).addPathPatterns(SIGN_URL_LIST); } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthInterceptor.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthInterceptor.java index 98c1814e..3cdbaea5 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthInterceptor.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthInterceptor.java @@ -38,18 +38,25 @@ public class SignAuthInterceptor implements HandlerInterceptor { SortedMap allParams = HttpUtils.getAllParams(requestWrapper); //对参数进行签名验证 String headerSign = request.getHeader(CommonConstant.X_SIGN); - String timesTamp = request.getHeader(CommonConstant.X_TIMESTAMP); + String xTimestamp = request.getHeader(CommonConstant.X_TIMESTAMP); + //客户端时间 + Long clientTimestamp = Long.parseLong(xTimestamp); - //1.校验时间有消息 - try { - DateUtils.parseDate(timesTamp, "yyyyMMddHHmmss"); - } catch (Exception e) { - throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP格式必须为:yyyyMMddHHmmss"); - } - Long clientTimestamp = Long.parseLong(timesTamp); - //判断时间戳 timestamp=201808091113 - if ((DateUtils.getCurrentTimestamp() - clientTimestamp) > MAX_EXPIRE) { - throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期"); + int length = 14; + int length1000 = 1000; + //1.校验签名时间(兼容X_TIMESTAMP的新老格式) + if (xTimestamp.length() == length) { + //a. X_TIMESTAMP格式是 yyyyMMddHHmmss (例子:20220308152143) + if ((DateUtils.getCurrentTimestamp() - clientTimestamp) > MAX_EXPIRE) { + log.error("签名验证失败:X-TIMESTAMP已过期,注意系统时间和服务器时间是否有误差!"); + throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期"); + } + } else { + //b. X_TIMESTAMP格式是 时间戳 (例子:1646552406000) + if ((System.currentTimeMillis() - clientTimestamp) > (MAX_EXPIRE * length1000)) { + log.error("签名验证失败:X-TIMESTAMP已过期,注意系统时间和服务器时间是否有误差!"); + throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期"); + } } //2.校验签名 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java index d90d3a07..94fe002c 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java @@ -13,6 +13,7 @@ import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.oConvertUtils; import org.springframework.http.HttpMethod; @@ -39,11 +40,11 @@ public class HttpUtils { SortedMap result = new TreeMap<>(); // 获取URL上最后带逗号的参数变量 sys/dict/getDictItems/sys_user,realname,username String pathVariable = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") + 1); - if (pathVariable.contains(",")) { + if (pathVariable.contains(SymbolConstant.COMMA)) { log.info(" pathVariable: {}",pathVariable); String deString = URLDecoder.decode(pathVariable, "UTF-8"); log.info(" pathVariable decode: {}",deString); - result.put(SignUtil.xPathVariable, deString); + result.put(SignUtil.X_PATH_VARIABLE, deString); } // 获取URL上的参数 Map urlParams = getUrlParams(request); @@ -77,11 +78,11 @@ public class HttpUtils { SortedMap result = new TreeMap<>(); // 获取URL上最后带逗号的参数变量 sys/dict/getDictItems/sys_user,realname,username String pathVariable = url.substring(url.lastIndexOf("/") + 1); - if (pathVariable.contains(",")) { + if (pathVariable.contains(SymbolConstant.COMMA)) { log.info(" pathVariable: {}",pathVariable); String deString = URLDecoder.decode(pathVariable, "UTF-8"); log.info(" pathVariable decode: {}",deString); - result.put(SignUtil.xPathVariable, deString); + result.put(SignUtil.X_PATH_VARIABLE, deString); } // 获取URL上的参数 Map urlParams = getUrlParams(queryString); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/SignUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/SignUtil.java index 16097d6e..3f82822e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/SignUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/SignUtil.java @@ -2,6 +2,7 @@ package org.jeecg.config.sign.util; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; @@ -19,7 +20,7 @@ import java.util.SortedMap; */ @Slf4j public class SignUtil { - public static final String xPathVariable = "x-path-variable"; + public static final String X_PATH_VARIABLE = "x-path-variable"; /** * @param params @@ -49,7 +50,8 @@ public class SignUtil { //设置签名秘钥 JeeccgBaseConfig jeeccgBaseConfig = SpringContextUtils.getBean(JeeccgBaseConfig.class); String signatureSecret = jeeccgBaseConfig.getSignatureSecret(); - if(oConvertUtils.isEmpty(signatureSecret) || signatureSecret.contains("${")){ + String curlyBracket = SymbolConstant.DOLLAR + SymbolConstant.LEFT_CURLY_BRACKET; + if(oConvertUtils.isEmpty(signatureSecret) || signatureSecret.contains(curlyBracket)){ throw new JeecgBootException("签名密钥 ${jeecg.signatureSecret} 缺少配置 !!"); } return DigestUtils.md5DigestAsHex((paramsJsonStr + signatureSecret).getBytes()).toUpperCase(); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppConfig.java index c1fe0ee1..79b8b9e7 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; /** * 第三方App对接配置 + * @author: jeecg-boot */ @Configuration public class ThirdAppConfig { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppTypeItemVo.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppTypeItemVo.java index 2476066b..06d98569 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppTypeItemVo.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/thirdapp/ThirdAppTypeItemVo.java @@ -4,6 +4,7 @@ import lombok.Data; /** * 第三方App对接 + * @author: jeecg-boot */ @Data public class ThirdAppTypeItemVo { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/BaseCommonMapper.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/BaseCommonMapper.java index bbc3b15e..6feb6d4e 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/BaseCommonMapper.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/BaseCommonMapper.java @@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import org.apache.ibatis.annotations.Param; import org.jeecg.common.api.dto.LogDTO; +/** + * @Description: BaseCommonMapper + * @author: jeecg-boot + */ public interface BaseCommonMapper { /** * 保存日志 * @param dto */ - //@SqlParser(filter=true) @InterceptorIgnore(illegalSql = "true", tenantLine = "true") void saveLog(@Param("dto")LogDTO dto); diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/BaseCommonService.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/BaseCommonService.java index e4e6559f..6c1de289 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/BaseCommonService.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/BaseCommonService.java @@ -5,6 +5,7 @@ import org.jeecg.common.system.vo.LoginUser; /** * common接口 + * @author: jeecg-boot */ public interface BaseCommonService { @@ -16,19 +17,19 @@ public interface BaseCommonService { /** * 保存日志 - * @param LogContent + * @param logContent * @param logType * @param operateType * @param user */ - void addLog(String LogContent, Integer logType, Integer operateType, LoginUser user); + void addLog(String logContent, Integer logType, Integer operateType, LoginUser user); /** * 保存日志 - * @param LogContent + * @param logContent * @param logType * @param operateType */ - void addLog(String LogContent, Integer logType, Integer operateType); + void addLog(String logContent, Integer logType, Integer operateType); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java index 7c105b7d..2c1919df 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java @@ -4,24 +4,22 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.LogDTO; -import org.jeecg.common.constant.CacheConstant; import org.jeecg.modules.base.mapper.BaseCommonMapper; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.common.system.vo.SysPermissionDataRuleModel; -import org.jeecg.common.system.vo.SysUserCacheInfo; -import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import org.springframework.util.AntPathMatcher; -import org.springframework.util.PathMatcher; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; +/** + * @Description: common实现类 + * @author: jeecg-boot + */ @Service @Slf4j public class BaseCommonServiceImpl implements BaseCommonService { @@ -55,7 +53,7 @@ public class BaseCommonServiceImpl implements BaseCommonService { //获取request HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); //设置IP地址 - sysLog.setIp(IPUtils.getIpAddr(request)); + sysLog.setIp(IpUtils.getIpAddr(request)); } catch (Exception e) { sysLog.setIp("127.0.0.1"); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/pom.xml b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/pom.xml index 446b2129..aa3c4e4a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/pom.xml +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-boot-base - 3.1.0 + 3.2.0 4.0.0 公共模块 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/base/BaseMap.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/base/BaseMap.java index c5fd47a6..644f2cf0 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/base/BaseMap.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/base/BaseMap.java @@ -13,8 +13,11 @@ import java.util.Optional; import java.util.stream.Collectors; /** - * 自定义Map - */ +* BaseMap +* +* @author: scott +* @date: 2020/01/01 16:17 +*/ public class BaseMap extends HashMap { private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/CommonConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/CommonConfig.java index 12b121d9..b9a3a71b 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/CommonConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/CommonConfig.java @@ -4,7 +4,12 @@ import org.jeecg.common.util.SpringContextHolder; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - +/** +* SpringContextHolder注册用 +* +* @author: scott +* @date: 2020/01/01 16:00 +*/ @Configuration public class CommonConfig { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/TransmitUserTokenFilter.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/TransmitUserTokenFilter.java index eaaef87b..77e3d153 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/TransmitUserTokenFilter.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/TransmitUserTokenFilter.java @@ -6,7 +6,9 @@ import javax.servlet.*; import javax.servlet.http.HttpServletRequest; /** - * 存放token到上下文供队列调用feign使用 + * 存放临时令牌Token到线程上下文 + * + * 供队列、定时任务 feign调用使用(解决无会话Token问题) * @author zyf */ public class TransmitUserTokenFilter implements Filter { @@ -30,10 +32,10 @@ public class TransmitUserTokenFilter implements Filter { String token = request.getHeader(X_ACCESS_TOKEN); if (token!=null) { try { - //将token放入上下文中 + //将Token放入当前线程上下文中 UserTokenContext.setToken(token); } catch (Exception e) { - + //e.printStackTrace(); } } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/UserTokenContext.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/UserTokenContext.java index 6017586c..eb8e99bb 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/UserTokenContext.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/config/mqtoken/UserTokenContext.java @@ -2,11 +2,16 @@ package org.jeecg.common.config.mqtoken; /** - * 用户token上下文 + * 用户Token线程上下文 + * + * 供队列、定时任务 feign调用使用(解决无会话Token问题) * @author zyf */ public class UserTokenContext { + /** + * 当前线程的TOKEN副本 + */ private static ThreadLocal userToken = new ThreadLocal(); public UserTokenContext() { @@ -19,4 +24,8 @@ public class UserTokenContext { public static void setToken(String token){ userToken.set(token); } + + public static void remove() { + userToken.remove(); + } } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/constant/GlobalConstants.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/constant/GlobalConstants.java index 6350b539..bcecdc73 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/constant/GlobalConstants.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/constant/GlobalConstants.java @@ -1,11 +1,20 @@ package org.jeecg.common.constant; +/** +* @Description: GlobalConstants +* @author: scott +* @date: 2020/01/01 16:01 +*/ public class GlobalConstants { /** * 业务处理器beanName传递参数 */ public static final String HANDLER_NAME = "handlerName"; + /** + * 路由刷新触发器 + */ + public static final String LODER_ROUDER_HANDLER = "loderRouderHandler"; /** * redis消息通道名称 diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/enums/SentinelErrorInfoEnum.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/enums/SentinelErrorInfoEnum.java new file mode 100644 index 00000000..91b86f2e --- /dev/null +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/enums/SentinelErrorInfoEnum.java @@ -0,0 +1,108 @@ +package org.jeecg.common.enums; + +/** + * @Description: 异常错误信息定义 + * @author: zyf + * @date: 2022/4/14 10:05 + */ +public enum SentinelErrorInfoEnum { + + /** + * 流控异常 + */ + FlowException("访问频繁,请稍候再试"), + + /** + * 热点参数异常 + */ + ParamFlowException("热点参数限流"), + + /** + * 系统规则限流或降级 + */ + SystemBlockException("系统规则限流或降级"), + + /** + * 授权规则不通过 + */ + AuthorityException("授权规则不通过"), + + /** + * 授权规则不通过 + */ + UnknownError("未知异常"), + + /** + * 服务降级 + */ + DegradeException("服务降级"); + + + /** + * 错误信息 + */ + String error; + + /** + * 错误代码 + */ + Integer code; + + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + /** + * 构造器 + * + * @param error 错误信息 + * @param code 错误代码 + */ + SentinelErrorInfoEnum(String error, Integer code) { + this.error = error; + this.code = code; + } + + /** + * 构造器 + * + * @param error 错误信息 + */ + SentinelErrorInfoEnum(String error) { + this.error = error; + this.code = 500; + } + + /** + * 根据异常名称匹配 + * + * @param throwable 异常 + * @return String 错误信息 + */ + public static SentinelErrorInfoEnum getErrorByException(Throwable throwable) { + if(throwable==null){ + return null; + } + + String exceptionClass=throwable.getClass().getSimpleName(); + for (SentinelErrorInfoEnum e : SentinelErrorInfoEnum.values()) { + if (exceptionClass.equals(e.name())) { + return e; + } + } + return null; + } +} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/client/JeecgRedisClient.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/client/JeecgRedisClient.java index 9c569823..8f1d84b3 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/client/JeecgRedisClient.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/client/JeecgRedisClient.java @@ -8,8 +8,10 @@ import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; /** - * redis客户端 - */ +* @Description: redis客户端 +* @author: scott +* @date: 2020/01/01 16:01 +*/ @Configuration public class JeecgRedisClient { diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/config/RedisConfig.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/config/RedisConfig.java index 31e6f64b..f72622b8 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/config/RedisConfig.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/config/RedisConfig.java @@ -46,26 +46,6 @@ public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; -// /** -// * @description 自定义的缓存key的生成策略 若想使用这个key -// * 只需要讲注解上keyGenerator的值设置为keyGenerator即可
-// * @return 自定义策略生成的key -// */ -// @Override -// @Bean -// public KeyGenerator keyGenerator() { -// return new KeyGenerator() { -// @Override -// public Object generate(Object target, Method method, Object... params) { -// StringBuilder sb = new StringBuilder(); -// sb.append(target.getClass().getName()); -// sb.append(method.getDeclaringClass().getName()); -// Arrays.stream(params).map(Object::toString).forEach(sb::append); -// return sb.toString(); -// } -// }; -// } - /** * RedisTemplate配置 * @param lettuceConnectionFactory @@ -113,7 +93,7 @@ public class RedisConfig extends CachingConfigurerSupport { // 创建默认缓存配置对象 /* 默认配置,设置缓存有效期 1小时*/ //RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)); - /* 自定义配置test:demo 的超时时间为 5分钟*/ + // 自定义配置test:demo 的超时时间为 5分钟 RedisCacheManager cacheManager = RedisCacheManager.builder(writer).cacheDefaults(redisCacheConfiguration) .withInitialCacheConfigurations(singletonMap(CacheConstant.SYS_DICT_TABLE_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)).disableCachingNullValues() diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListener.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListener.java new file mode 100644 index 00000000..400a96e1 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListener.java @@ -0,0 +1,18 @@ +package org.jeecg.common.modules.redis.listener; + +import org.jeecg.common.base.BaseMap; + +/** + * @Description: 自定义消息监听 + * @author: scott + * @date: 2020/01/01 16:02 + */ +public interface JeecgRedisListener { + /** + * 接受消息 + * + * @param message + */ + void onMessage(BaseMap message); + +} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListerer.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListerer.java deleted file mode 100644 index 1fa91b8a..00000000 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/listener/JeecgRedisListerer.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.jeecg.common.modules.redis.listener; - -import org.jeecg.common.base.BaseMap; - -/** - * 自定义消息监听 - */ -public interface JeecgRedisListerer { - - void onMessage(BaseMap message); - -} diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/receiver/RedisReceiver.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/receiver/RedisReceiver.java index a77c9862..b1632ca4 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/receiver/RedisReceiver.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/receiver/RedisReceiver.java @@ -5,7 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import lombok.Data; import org.jeecg.common.base.BaseMap; import org.jeecg.common.constant.GlobalConstants; -import org.jeecg.common.modules.redis.listener.JeecgRedisListerer; +import org.jeecg.common.modules.redis.listener.JeecgRedisListener; import org.jeecg.common.util.SpringContextHolder; import org.springframework.stereotype.Component; @@ -24,7 +24,7 @@ public class RedisReceiver { */ public void onMessage(BaseMap params) { Object handlerName = params.get(GlobalConstants.HANDLER_NAME); - JeecgRedisListerer messageListener = SpringContextHolder.getHandler(handlerName.toString(), JeecgRedisListerer.class); + JeecgRedisListener messageListener = SpringContextHolder.getHandler(handlerName.toString(), JeecgRedisListener.class); if (ObjectUtil.isNotEmpty(messageListener)) { messageListener.onMessage(params); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/writer/JeecgRedisCacheWriter.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/writer/JeecgRedisCacheWriter.java index 27821926..3c4b41ce 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/writer/JeecgRedisCacheWriter.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/modules/redis/writer/JeecgRedisCacheWriter.java @@ -11,6 +11,8 @@ import java.util.function.Function; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.PessimisticLockingFailureException; +import org.springframework.data.redis.cache.CacheStatistics; +import org.springframework.data.redis.cache.CacheStatisticsCollector; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -20,8 +22,11 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * 该类参照 DefaultRedisCacheWriter 重写了 remove 方法实现通配符*删除 - */ +* 该类参照 DefaultRedisCacheWriter 重写了 remove 方法实现通配符*删除 +* +* @author: scott +* @date: 2020/01/01 16:18 +*/ @Slf4j public class JeecgRedisCacheWriter implements RedisCacheWriter { @@ -39,6 +44,7 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { this.sleepTime = sleepTime; } + @Override public void put(String name, byte[] key, byte[] value, @Nullable Duration ttl) { Assert.notNull(name, "Name must not be null!"); Assert.notNull(key, "Key must not be null!"); @@ -54,6 +60,7 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { }); } + @Override public byte[] get(String name, byte[] key) { Assert.notNull(name, "Name must not be null!"); Assert.notNull(key, "Key must not be null!"); @@ -62,6 +69,7 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { }); } + @Override public byte[] putIfAbsent(String name, byte[] key, byte[] value, @Nullable Duration ttl) { Assert.notNull(name, "Name must not be null!"); Assert.notNull(key, "Key must not be null!"); @@ -97,12 +105,14 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { }); } + @Override public void remove(String name, byte[] key) { Assert.notNull(name, "Name must not be null!"); Assert.notNull(key, "Key must not be null!"); String keyString = new String(key); log.info("redis remove key:" + keyString); - if(keyString!=null && keyString.endsWith("*")){ + String keyIsAll = "*"; + if(keyString!=null && keyString.endsWith(keyIsAll)){ execute(name, connection -> { // 获取某个前缀所拥有的所有的键,某个前缀开头,后面肯定是* Set keys = connection.keys(key); @@ -119,6 +129,7 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { } } + @Override public void clean(String name, byte[] pattern) { Assert.notNull(name, "Name must not be null!"); Assert.notNull(pattern, "Pattern must not be null!"); @@ -218,4 +229,22 @@ public class JeecgRedisCacheWriter implements RedisCacheWriter { private static byte[] createCacheLockKey(String name) { return (name + "~lock").getBytes(StandardCharsets.UTF_8); } + + //update-begin-author:zyf date:20220216 for:升级springboot版本到2.4.0+以后需要实现的方法* + private final CacheStatisticsCollector statistics = CacheStatisticsCollector.create(); + @Override + public CacheStatistics getCacheStatistics(String cacheName) { + return statistics.getCacheStatistics(cacheName); + } + + @Override + public void clearStatistics(String name) { + + } + + @Override + public RedisCacheWriter withStatisticsCollector(CacheStatisticsCollector cacheStatisticsCollector) { + return null; + } + //update-begin-author:zyf date:20220216 for:升级springboot版本到2.4.0+以后需要实现的方法* } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/RedisUtil.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/RedisUtil.java index dbe2ef2e..9f82be8a 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/RedisUtil.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/RedisUtil.java @@ -1,15 +1,14 @@ package org.jeecg.common.util; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; /** * redis 工具类 @@ -21,8 +20,6 @@ public class RedisUtil { @Autowired private RedisTemplate redisTemplate; - @Autowired - private StringRedisTemplate stringRedisTemplate; /** * 指定缓存失效时间 @@ -79,7 +76,8 @@ public class RedisUtil { if (key.length == 1) { redisTemplate.delete(key[0]); } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); + //springboot2.4后用法 + redisTemplate.delete(Arrays.asList(key)); } } } @@ -585,7 +583,8 @@ public class RedisUtil { try { return redisTemplate.execute((RedisCallback>) connection -> { Set binaryKeys = new HashSet<>(); - Cursor cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build()); + //springboot2.4后用法 + Cursor cursor = connection.scan(ScanOptions.scanOptions().match(realKey).count(Integer.MAX_VALUE).build()); while (cursor.hasNext()) { binaryKeys.add(new String(cursor.next())); } diff --git a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/SpringContextHolder.java b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/SpringContextHolder.java index 4c2eeb9e..15140f84 100644 --- a/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/SpringContextHolder.java +++ b/jeecg-boot/jeecg-boot-base/jeecg-boot-base-tools/src/main/java/org/jeecg/common/util/SpringContextHolder.java @@ -50,7 +50,7 @@ public class SpringContextHolder implements ApplicationContextAware { try { t = applicationContext.getBean(name, cls); } catch (Exception e) { - log.error("####################" + name + "未定义"); + log.warn("Customize redis listener handle [ " + name + " ], does not exist!"); } } return t; diff --git a/jeecg-boot/jeecg-boot-base/pom.xml b/jeecg-boot/jeecg-boot-base/pom.xml index 5768ee1a..c0ce6d97 100644 --- a/jeecg-boot/jeecg-boot-base/pom.xml +++ b/jeecg-boot/jeecg-boot-base/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-parent org.jeecgframework.boot - 3.1.0 + 3.2.0 4.0.0 diff --git a/jeecg-boot/jeecg-boot-module-demo/pom.xml b/jeecg-boot/jeecg-boot-module-demo/pom.xml index 68135f8a..0ec758d2 100644 --- a/jeecg-boot/jeecg-boot-module-demo/pom.xml +++ b/jeecg-boot/jeecg-boot-module-demo/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-parent org.jeecgframework.boot - 3.1.0 + 3.2.0 4.0.0 @@ -27,6 +27,10 @@ org.jeecgframework.boot jeecg-boot-starter-cloud + + org.jeecgframework.boot + jeecg-boot-starter-job + diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/JeecgDemoCloudApplication.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/JeecgDemoCloudApplication.java index bd018520..696db878 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/JeecgDemoCloudApplication.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/JeecgDemoCloudApplication.java @@ -1,14 +1,35 @@ //package org.jeecg; // +//import org.jeecg.common.base.BaseMap; +//import org.jeecg.common.constant.GlobalConstants; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.CommandLineRunner; //import org.springframework.boot.SpringApplication; //import org.springframework.boot.autoconfigure.SpringBootApplication; //import org.springframework.cloud.openfeign.EnableFeignClients; +//import org.springframework.data.redis.core.RedisTemplate; // //@SpringBootApplication //@EnableFeignClients -//public class JeecgDemoCloudApplication { +//public class JeecgDemoCloudApplication implements CommandLineRunner { +// @Autowired +// private RedisTemplate redisTemplate; // // public static void main(String[] args) { // SpringApplication.run(JeecgDemoCloudApplication.class, args); // } +// +// /** +// * 启动的时候,触发下gateway网关刷新 +// * +// * 解决: 先启动gateway后启动服务,Swagger接口文档访问不通的问题 +// * @param args +// */ +// @Override +// public void run(String... args) { +// BaseMap params = new BaseMap(); +// params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER); +// //刷新网关 +// redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params); +// } //} diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoController.java deleted file mode 100644 index 3dc3169e..00000000 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoController.java +++ /dev/null @@ -1,48 +0,0 @@ -//package org.jeecg.modules.demo.cloud.controller; -// -//import io.swagger.annotations.Api; -//import io.swagger.annotations.ApiOperation; -//import lombok.extern.slf4j.Slf4j; -//import org.jeecg.common.api.vo.Result; -//import org.jeecg.common.system.api.ISysBaseAPI; -//import org.jeecg.common.system.vo.DictModel; -//import org.springframework.web.bind.annotation.GetMapping; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//import javax.annotation.Resource; -//import java.util.List; -// -///** -// * -// */ -//@Slf4j -//@Api(tags = "Cloud示例") -//@RestController -//@RequestMapping("/test") -//public class JcloudDemoController { -// -// -// @Resource -// private ISysBaseAPI sysBaseAPI; -// -// /** -// * 测试 -// * -// * @return -// */ -// @GetMapping("/remote") -// @ApiOperation(value = "测试feign", notes = "测试feign") -// public Result remoteDict() { -//// try{ -//// //睡5秒,网关Hystrix3秒超时,会触发熔断降级操作 -//// Thread.sleep(5000); -//// }catch (Exception e){ -//// e.printStackTrace(); -//// } -// List list = sysBaseAPI.queryAllDict(); -// return Result.OK(list); -// } -// -// -//} diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoFeignController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoFeignController.java new file mode 100644 index 00000000..76a82667 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoFeignController.java @@ -0,0 +1,68 @@ +//package org.jeecg.modules.demo.cloud.controller; +// +//import com.alibaba.csp.sentinel.annotation.SentinelResource; +//import io.swagger.annotations.Api; +//import io.swagger.annotations.ApiOperation; +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.api.vo.Result; +//import org.jeecg.common.system.api.ISysBaseAPI; +//import org.jeecg.common.system.vo.DictModel; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +//import javax.annotation.Resource; +//import java.util.List; +// +///** +// * +// */ +//@Slf4j +//@Api(tags = "【微服务】单元测试") +//@RestController +//@RequestMapping("/test") +//public class JcloudDemoFeignController { +// @Resource +// private ISysBaseAPI sysBaseApi; +//// @Autowired +//// private ErpHelloApi erpHelloApi; +// +// /** +// * 测试 +// * +// * @return +// */ +// @GetMapping("/callSystem") +// //@SentinelResource(value = "remoteDict",fallback = "getDefaultHandler") +// @ApiOperation(value = "通过feign调用system服务", notes = "测试jeecg-demo服务,是否通过fegin调用system服务接口") +// public Result getRemoteDict() { +// List list = sysBaseApi.queryAllDict(); +// return Result.OK(list); +// } +// +// +//// /** +//// * 测试调用 erp 微服务接口 +//// * 【如何测试:通过archetype生成微服务模块,快速集成测试】 +//// * http://doc.jeecg.com/2194069 +//// * @return +//// */ +//// @GetMapping("/callErp") +//// @ApiOperation(value = "测试feign erp", notes = "测试feign erp") +//// public Result callErp() { +//// log.info("call erp 服务"); +//// String res = erpHelloApi.callHello(); +//// return Result.OK(res); +//// } +// +// /** +// * 熔断,默认回调函数 +// * +// * @return +// */ +// public Result getDefaultHandler() { +// log.info("测试JcloudDemoController-remoteDict 熔断降级"); +// return Result.error("测试JcloudDemoController-remoteDict 熔断降级"); +// } +// +//} diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/provider/JcloudDemoProvider.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java similarity index 54% rename from jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/provider/JcloudDemoProvider.java rename to jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java index 760d710c..4688694c 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/provider/JcloudDemoProvider.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java @@ -1,5 +1,6 @@ -package org.jeecg.modules.demo.cloud.provider; +package org.jeecg.modules.demo.cloud.controller; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.demo.cloud.service.JcloudDemoService; import org.springframework.web.bind.annotation.GetMapping; @@ -10,18 +11,23 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** - * feign服务端接口 + * 服务端提供方——feign接口 + * 【提供给system-start调用测试,看feign是否畅通】 + * @author: jeecg-boot */ +@Slf4j @RestController @RequestMapping("/test") -public class JcloudDemoProvider { +public class JcloudDemoProviderController { @Resource private JcloudDemoService jcloudDemoService; @GetMapping("/getMessage") - public Result getMessage(@RequestParam String name) { - return jcloudDemoService.getMessage(name); + public String getMessage(@RequestParam String name) { + String msg = jcloudDemoService.getMessage(name); + log.info(" 微服务被调用:{} ",msg); + return msg; } } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/JcloudDemoService.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/JcloudDemoService.java index cb8227ee..ba731eb4 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/JcloudDemoService.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/JcloudDemoService.java @@ -2,6 +2,16 @@ package org.jeecg.modules.demo.cloud.service; import org.jeecg.common.api.vo.Result; +/** + * @Description: JcloudDemoService接口 + * @author: jeecg-boot + */ public interface JcloudDemoService { - Result getMessage(String name); + + /** + * 获取信息(测试) + * @param name 姓名 + * @return "Hello," + name + */ + String getMessage(String name); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/impl/JcloudDemoServiceImpl.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/impl/JcloudDemoServiceImpl.java index fd09950b..8d66d4f4 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/impl/JcloudDemoServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/impl/JcloudDemoServiceImpl.java @@ -4,10 +4,15 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.modules.demo.cloud.service.JcloudDemoService; import org.springframework.stereotype.Service; +/** + * @Description: JcloudDemoServiceImpl实现类 + * @author: jeecg-boot + */ @Service public class JcloudDemoServiceImpl implements JcloudDemoService { @Override - public Result getMessage(String name) { - return Result.OK("Hello," + name); + public String getMessage(String name) { + String resMsg = "Hello,我是jeecg-demo服务节点,收到你的消息:【 "+ name +" 】"; + return resMsg; } } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/xxljob/TestJobHandler.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/xxljob/TestJobHandler.java new file mode 100644 index 00000000..a3bd8050 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/cloud/xxljob/TestJobHandler.java @@ -0,0 +1,74 @@ +// +//package org.jeecg.modules.demo.cloud.xxljob; +// +//import com.xxl.job.core.biz.model.ReturnT; +//import com.xxl.job.core.handler.annotation.XxlJob; +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.config.mqtoken.UserTokenContext; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.system.api.ISysBaseAPI; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.util.RedisUtil; +//import org.jeecg.common.util.SpringContextUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +// +///** +// * xxl-job定时任务测试 +// */ +//@Slf4j +//@Component +//public class TestJobHandler { +// @Autowired +// ISysBaseAPI sysBaseApi; +// +// /** +// * 简单任务 +// * +// * 测试:无token调用feign接口 +// * +// * @param params +// * @return +// */ +// +// @XxlJob(value = "testJob") +// public ReturnT demoJobHandler(String params) { +// //1.生成临时令牌Token到线程中 +// UserTokenContext.setToken(getTemporaryToken()); +// +// log.info("我是 jeecg-demo 服务里的定时任务 testJob , 我执行了..............................."); +// log.info("我调用 jeecg-system 服务的字典接口:{}",sysBaseApi.queryAllDict()); +// //。。。此处可以写多个feign接口调用 +// +// //2.使用完,删除临时令牌Token +// UserTokenContext.remove(); +// return ReturnT.SUCCESS; +// } +// +// public void init() { +// log.info("init"); +// } +// +// public void destroy() { +// log.info("destory"); +// } +// +// /** +// * 获取临时令牌 +// * +// * 模拟登陆接口,获取模拟 Token +// * @return +// */ +// public static String getTemporaryToken() { +// RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class); +// // 模拟登录生成Token +// String token = JwtUtil.sign("??", "??"); +// // 设置Token缓存有效时间为 5 分钟 +// redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); +// redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000); +// return token; +// } +// +//} +// diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java index 668b49f1..40513731 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java @@ -17,6 +17,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * @Description: MockController + * @author: jeecg-boot + */ @RestController @RequestMapping("/mock/api") @Slf4j @@ -72,7 +76,7 @@ public class MockController { } @GetMapping(value = "/permission/no-pager") - public String permission_no_page() { + public String permissionNoPage() { return readJson("classpath:org/jeecg/modules/demo/mock/json/permission_no_page.json"); } @@ -129,7 +133,7 @@ public class MockController { if(fs[i].getTotalSpace()==0) { continue; } - Map map = new HashMap<>(); + Map map = new HashMap<>(5); map.put("name", fsv.getSystemDisplayName(fs[i])); map.put("max", fs[i].getTotalSpace()); map.put("rest", fs[i].getFreeSpace()); @@ -177,13 +181,19 @@ public class MockController { //------------------------------------------------------------------------------------------- //author:lvdandan-----date:20190315---for:添加数据日志json---- + /** + * 数据日志 + */ public String sysDataLogJson() { return readJson("classpath:org/jeecg/modules/demo/mock/json/sysdatalog.json"); } //author:lvdandan-----date:20190315---for:添加数据日志json---- //--update-begin--author:wangshuai-----date:20201023---for:返回用户信息json数据---- - @GetMapping(value = "/getUserInfo") + /** + * 用户信息 + */ + @GetMapping(value = "/getUserInfo") public String getUserInfo(){ return readJson("classpath:org/jeecg/modules/demo/mock/json/userinfo.json"); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java index 0e5fb1cb..e51b0578 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java @@ -10,12 +10,12 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.constant.VXESocketConst; +import org.jeecg.common.constant.VxeSocketConst; import org.jeecg.common.system.query.MatchTypeEnum; import org.jeecg.common.system.query.QueryCondition; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.demo.mock.vxe.entity.MockEntity; -import org.jeecg.modules.demo.mock.vxe.websocket.VXESocket; +import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -24,6 +24,10 @@ import java.io.InputStream; import java.net.URLDecoder; import java.util.*; +/** + * @Description: VxeMockController + * @author: jeecg-boot + */ @RestController @RequestMapping("/mock/vxe") @Slf4j @@ -59,8 +63,9 @@ public class VxeMockController { * @param tug_status * @return */ + @Deprecated @GetMapping("/change2") - public Result mockChange2(@RequestParam("id") String id, @RequestParam("tug_status") String tug_status) { + public Result mockChange2(@RequestParam("id") String id,@RequestParam("tug_status") String tugStatus) { /* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */ // 封装行数据 @@ -68,8 +73,8 @@ public class VxeMockController { // 这个字段就是要更改的行数据ID rowData.put("id", id); // 这个字段就是要更改的列的key和具体的值 - JSONObject tugStatus = JSON.parseObject(tug_status); - rowData.put("tug_status", tugStatus); + JSONObject status = JSON.parseObject(tugStatus); + rowData.put("tug_status", status); // 模拟更改数据 this.mockChange(rowData); @@ -108,9 +113,9 @@ public class VxeMockController { socketData.put("args", new Object[]{rowData, ""}); // 封装消息字符串,这里的 // type 必须是 VXESocketConst.TYPE_UVT - String message = VXESocket.packageMessage(VXESocketConst.TYPE_UVT, socketData); + String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, socketData); // 调用 sendMessageToAll 发送给所有在线的用户 - VXESocket.sendMessageToAll(message); + VxeSocket.sendMessageToAll(message); } /** @@ -129,9 +134,9 @@ public class VxeMockController { socketData.put("args", new Object[]{status}); // 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT - String message = VXESocket.packageMessage(VXESocketConst.TYPE_CSD, socketData); + String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_CSD, socketData); // 调用 sendMessageToAll 发送给所有在线的用户 - VXESocket.sendMessageToAll(message); + VxeSocket.sendMessageToAll(message); return Result.ok(); } @@ -260,7 +265,8 @@ public class VxeMockController { // 模拟JSON数据路径 String path = "classpath:org/jeecg/modules/demo/mock/vxe/json/ddjh.json"; - if ("8".equals(status)) { + String statusValue = "8"; + if (statusValue.equals(status)) { path = "classpath:org/jeecg/modules/demo/mock/vxe/json/ddjh_s8.json"; } // 读取JSON数据 @@ -273,7 +279,7 @@ public class VxeMockController { // 逐行查询子表数据,用于计算拖轮状态 List records = page.getRecords(); for (JSONObject record : records) { - Map tugStatusMap = new HashMap<>(); + Map tugStatusMap = new HashMap<>(5); String id = record.getString("id"); // 查询出主表的拖轮 String tugMain = record.getString("tug"); @@ -340,12 +346,12 @@ public class VxeMockController { */ private IPage queryDataPage(JSONArray dataList, String parentId, Integer pageNo, Integer pageSize) { // 根据父级id查询子级 - JSONArray dataDB = dataList; + JSONArray dataDb = dataList; if (StringUtils.isNotBlank(parentId)) { JSONArray results = new JSONArray(); List parentIds = Arrays.asList(parentId.split(",")); - this.queryByParentId(dataDB, parentIds, results); - dataDB = results; + this.queryByParentId(dataDb, parentIds, results); + dataDb = results; } // 模拟分页(实际中应用SQL自带的分页) List records = new ArrayList<>(); @@ -353,23 +359,23 @@ public class VxeMockController { long beginIndex, endIndex; // 如果任意一个参数为null,则不分页 if (pageNo == null || pageSize == null) { - page = new Page<>(0, dataDB.size()); + page = new Page<>(0, dataDb.size()); beginIndex = 0; - endIndex = dataDB.size(); + endIndex = dataDb.size(); } else { page = new Page<>(pageNo, pageSize); beginIndex = page.offset(); endIndex = page.offset() + page.getSize(); } - for (long i = beginIndex; (i < endIndex && i < dataDB.size()); i++) { - JSONObject data = dataDB.getJSONObject((int) i); + for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) { + JSONObject data = dataDb.getJSONObject((int) i); data = JSON.parseObject(data.toJSONString()); // 不返回 children data.remove("children"); records.add(data); } page.setRecords(records); - page.setTotal(dataDB.size()); + page.setTotal(dataDb.size()); return page; } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/entity/MockEntity.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/entity/MockEntity.java index b4b0efff..dc41cdcb 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/entity/MockEntity.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/entity/MockEntity.java @@ -4,15 +4,22 @@ import lombok.Data; /** * 模拟实体 + * @author: jeecg-boot */ @Data public class MockEntity { - // id + /** + * id + */ private String id; - // 父级ID + /** + * 父级ID + */ private String parentId; - // 状态 + /** + * 状态 + */ private String status; /* -- 省略其他字段 -- */ diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VXESocket.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VXESocket.java index 59c5dcc5..24d4eb31 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VXESocket.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VXESocket.java @@ -3,7 +3,7 @@ package org.jeecg.modules.demo.mock.vxe.websocket; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.constant.VXESocketConst; +import org.jeecg.common.constant.VxeSocketConst; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -18,11 +18,12 @@ import java.util.Map; /** * vxe WebSocket,用于实现实时无痕刷新的功能 + * @author: jeecg-boot */ @Slf4j @Component @ServerEndpoint("/vxeSocket/{userId}/{pageId}") -public class VXESocket { +public class VxeSocket { /** * 当前 session @@ -46,18 +47,18 @@ public class VXESocket { * 因为一个用户可能打开多个页面,多个页面就会有多个连接; * key是userId,value是Map对象;子Map的key是pageId,value是VXESocket对象 */ - private static Map> userPool = new HashMap<>(); + private static Map> userPool = new HashMap<>(); /** * 连接池,包含所有WebSocket连接; * key是socketId,value是VXESocket对象 */ - private static Map socketPool = new HashMap<>(); + private static Map socketPool = new HashMap<>(); /** * 获取某个用户所有的页面 */ - public static Map getUserPool(String userId) { - return userPool.computeIfAbsent(userId, k -> new HashMap<>()); + public static Map getUserPool(String userId) { + return userPool.computeIfAbsent(userId, k -> new HashMap<>(5)); } /** @@ -80,8 +81,8 @@ public class VXESocket { */ public static String packageMessage(String type, Object data) { JSONObject message = new JSONObject(); - message.put(VXESocketConst.TYPE, type); - message.put(VXESocketConst.DATA, data); + message.put(VxeSocketConst.TYPE, type); + message.put(VxeSocketConst.DATA, data); return message.toJSONString(); } @@ -92,9 +93,9 @@ public class VXESocket { * @param message 消息内容 */ public static void sendMessageTo(String userId, String message) { - Collection values = getUserPool(userId).values(); + Collection values = getUserPool(userId).values(); if (values.size() > 0) { - for (VXESocket socketItem : values) { + for (VxeSocket socketItem : values) { socketItem.sendMessage(message); } } else { @@ -109,7 +110,7 @@ public class VXESocket { * @param message 消息内容 */ public static void sendMessageTo(String userId, String pageId, String message) { - VXESocket socketItem = getUserPool(userId).get(pageId); + VxeSocket socketItem = getUserPool(userId).get(pageId); if (socketItem != null) { socketItem.sendMessage(message); } else { @@ -125,7 +126,7 @@ public class VXESocket { */ public static void sendMessageTo(String[] userIds, String message) { for (String userId : userIds) { - VXESocket.sendMessageTo(userId, message); + VxeSocket.sendMessageTo(userId, message); } } @@ -135,7 +136,7 @@ public class VXESocket { * @param message 消息内容 */ public static void sendMessageToAll(String message) { - for (VXESocket socketItem : socketPool.values()) { + for (VxeSocket socketItem : socketPool.values()) { socketItem.sendMessage(message); } } @@ -186,14 +187,14 @@ public class VXESocket { log.warn("【vxeSocket】收到不合法的消息:" + message); return; } - String type = json.getString(VXESocketConst.TYPE); + String type = json.getString(VxeSocketConst.TYPE); switch (type) { // 心跳检测 - case VXESocketConst.TYPE_HB: - this.sendMessage(VXESocket.packageMessage(type, true)); + case VxeSocketConst.TYPE_HB: + this.sendMessage(VxeSocket.packageMessage(type, true)); break; // 更新form数据 - case VXESocketConst.TYPE_UVT: + case VxeSocketConst.TYPE_UVT: this.handleUpdateForm(json); break; default: @@ -209,8 +210,8 @@ public class VXESocket { */ private void handleUpdateForm(JSONObject json) { // 将事件转发给所有人 - JSONObject data = json.getJSONObject(VXESocketConst.DATA); - VXESocket.sendMessageToAll(VXESocket.packageMessage(VXESocketConst.TYPE_UVT, data)); + JSONObject data = json.getJSONObject(VxeSocketConst.DATA); + VxeSocket.sendMessageToAll(VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, data)); } } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java index 8e5e19e8..19d97f3c 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java @@ -59,7 +59,7 @@ public class JeecgDemoController extends JeecgController> list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + public Result list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, req.getParameterMap()); queryWrapper.orderByDesc("create_time"); @@ -136,7 +136,7 @@ public class JeecgDemoController extends JeecgController queryById(@ApiParam(name = "id", value = "示例id", required = true) @RequestParam(name = "id", required = true) String id) { + public Result queryById(@ApiParam(name = "id", value = "示例id", required = true) @RequestParam(name = "id", required = true) String id) { JeecgDemo jeecgDemo = jeecgDemoService.getById(id); return Result.OK(jeecgDemo); } @@ -239,6 +239,9 @@ public class JeecgDemoController extends JeecgController testOnlineAdd(@RequestBody JSONObject json) { log.info(json.toJSONString()); diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java index 129115e0..bfb9ea53 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java @@ -224,7 +224,8 @@ public class JeecgOrderMainController extends JeecgController fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(2); diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java index 7482e4b3..c375ebc9 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java @@ -216,7 +216,8 @@ public class JoaDemoController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java index 8430ef31..87145017 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java @@ -71,10 +71,12 @@ public class JeecgDemo extends JeecgEntity implements Serializable { /** 个人简介 */ @ApiModelProperty(value = "个人简介") private java.lang.String content; - @ApiModelProperty(value = "租户ID") - private java.lang.Integer tenantId; /** 部门编码 */ @Excel(name="部门编码",width=25) @ApiModelProperty(value = "部门编码") private java.lang.String sysOrgCode; + + @ApiModelProperty(value = "租户ID") + private java.lang.Integer tenantId; + } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java index 7a003c5a..8ae998dd 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java @@ -17,6 +17,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; */ public interface JeecgDemoMapper extends BaseMapper { + /** + * 根据姓名查询demo列表数据 + * @param name 姓名 + * @return demo集合 + */ public List getDemoByName(@Param("name") String name); /** diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java index c454ef74..a1ff5212 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java @@ -23,7 +23,12 @@ public interface JeecgOrderCustomerMapper extends BaseMapper */ @Delete("DELETE FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}") public boolean deleteCustomersByMainId(String mainId); - + + /** + * 通过主表订单外键查询客户 + * @param mainId 订单id + * @return 订单客户集合 + */ @Select("SELECT * FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}") public List selectCustomersByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java index cee579d8..6604cc80 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java @@ -22,8 +22,12 @@ public interface JeecgOrderTicketMapper extends BaseMapper { */ @Delete("DELETE FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") public boolean deleteTicketsByMainId(String mainId); - - + + /** + * 通过主表订单外键查询订单机票 + * @param mainId 订单id + * @return 返回订单机票集合 + */ @Select("SELECT * FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") public List selectTicketsByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java index 7f3ed269..a504fa75 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java @@ -12,9 +12,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage; * @Version: V1.0 */ public interface IJeecgDemoService extends JeecgService { - + + /** + * 测试事务 + */ public void testTran(); - + + /** + * 通过id过去demo数据,先读缓存,在读数据库 + * @param id 数据库id + * @return demo对象 + */ public JeecgDemo getByIdCacheable(String id); /** diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java index 7248f7f1..45f0fd8d 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java @@ -13,6 +13,11 @@ import com.baomidou.mybatisplus.extension.service.IService; * @Version: V1.0 */ public interface IJeecgOrderCustomerService extends IService { - + + /** + * 根据订单id获取订单客户数据 + * @param mainId 订单id + * @return 订单顾客集合 + */ public List selectCustomersByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java index 7c797ec8..a7111b7b 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java @@ -20,27 +20,37 @@ public interface IJeecgOrderMainService extends IService { /** * 添加一对多 - * + * @param jeecgOrderMain 订单实体类 + * @param jeecgOrderCustomerList 订单客户集合 + * @param jeecgOrderTicketList 订单机票集合 */ public void saveMain(JeecgOrderMain jeecgOrderMain,List jeecgOrderCustomerList,List jeecgOrderTicketList) ; /** * 修改一对多 - * + * @param jeecgOrderMain 订单实体类 + * @param jeecgOrderCustomerList 订单客户集合 + * @param jeecgOrderTicketList 订单机票集合 */ public void updateMain(JeecgOrderMain jeecgOrderMain,List jeecgOrderCustomerList,List jeecgOrderTicketList); /** * 删除一对多 - * @param jformOrderMain + * @param id 订单id */ public void delMain (String id); /** * 批量删除一对多 - * @param jformOrderMain + * @param idList 订单id集合 */ public void delBatchMain (Collection idList); + /** + * 修改一对多 + * @param jeecgOrderMain 订单实体类 + * @param jeecgOrderCustomerList 订单客户集合 + * @param jeecgOrderTicketList 订单机票集合 + */ public void updateCopyMain(JeecgOrderMain jeecgOrderMain, List jeecgOrderCustomerList, List jeecgOrderTicketList); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java index c40a2141..7f2aa420 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java @@ -13,6 +13,11 @@ import com.baomidou.mybatisplus.extension.service.IService; * @Version: V1.0 */ public interface IJeecgOrderTicketService extends IService { - + + /** + * 通过订单id查询订单机票 + * @param mainId 订单id + * @return 订单机票集合 + */ public List selectTicketsByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java index 86760e65..1406f7de 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java @@ -36,7 +36,7 @@ public class JeecgDemoServiceImpl extends ServiceImpl jeecgOrderCustomerList, List jeecgOrderTicketList) { jeecgOrderMainMapper.insert(jeecgOrderMain); if (jeecgOrderCustomerList != null) { @@ -53,7 +53,7 @@ public class JeecgOrderMainServiceImpl extends ServiceImpl jeecgOrderCustomerList, List jeecgOrderTicketList) { jeecgOrderMainMapper.updateById(jeecgOrderMain); @@ -83,7 +83,7 @@ public class JeecgOrderMainServiceImpl extends ServiceImpl jeecgOrderCustomerList, List jeecgOrderTicketList) { jeecgOrderMainMapper.updateById(jeecgOrderMain); @@ -142,7 +142,7 @@ public class JeecgOrderMainServiceImpl extends ServiceImpl idList) { for(Serializable id:idList) { jeecgOrderMainMapper.deleteById(id); diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java index eb309ed9..8a76bc24 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java @@ -9,6 +9,10 @@ import org.jeecgframework.poi.excel.annotation.ExcelCollection; import lombok.Data; +/** + * @Description: 一对多示例 + * @author: jeecg-boot + */ @Data public class JeecgOrderMainPage { diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/xxljob/TestJobHandler.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/xxljob/TestJobHandler.java deleted file mode 100644 index 766e0f61..00000000 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/demo/xxljob/TestJobHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -// -//package org.jeecg.modules.demo.xxljob; -// -//import com.xxl.job.core.biz.model.ReturnT; -//import com.xxl.job.core.handler.annotation.XxlJob; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.stereotype.Component; -// -// -///** -// * xxl-job定时任务测试 -// */ -//@Component -//@Slf4j -//public class TestJobHandler { -// -// -// /** -// * 简单任务 -// * -// * @param params -// * @return -// */ -// -// @XxlJob(value = "testJob") -// public ReturnT demoJobHandler(String params) { -// log.info("我是demo服务里的定时任务testJob,我执行了..............................."); -// return ReturnT.SUCCESS; -// } -// -// public void init() { -// log.info("init"); -// } -// -// public void destroy() { -// log.info("destory"); -// } -// -//} -// diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java index 64d5041e..e3f99a38 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java @@ -13,8 +13,8 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.MatchTypeEnum; import org.jeecg.common.system.query.QueryCondition; import org.jeecg.common.system.query.QueryGenerator; -import org.jeecg.common.constant.VXESocketConst; -import org.jeecg.modules.demo.mock.vxe.websocket.VXESocket; +import org.jeecg.common.constant.VxeSocketConst; +import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket; import org.jeecg.modules.dlglong.entity.MockEntity; import org.springframework.web.bind.annotation.*; @@ -24,6 +24,10 @@ import java.io.InputStream; import java.net.URLDecoder; import java.util.*; +/** + * @Description: DlMockController + * @author: jeecg-boot + */ @Slf4j @RestController @RequestMapping("/mock/dlglong") @@ -56,11 +60,11 @@ public class DlMockController { * 模拟更改拖轮状态 * * @param id - * @param tug_status + * @param tugStatus * @return */ @GetMapping("/change2") - public Result mockChange2(@RequestParam("id") String id, @RequestParam("tug_status") String tug_status) { + public Result mockChange2(@RequestParam("id") String id, @RequestParam("tug_status") String tugStatus) { /* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */ // 封装行数据 @@ -68,8 +72,8 @@ public class DlMockController { // 这个字段就是要更改的行数据ID rowData.put("id", id); // 这个字段就是要更改的列的key和具体的值 - JSONObject tugStatus = JSON.parseObject(tug_status); - rowData.put("tug_status", tugStatus); + JSONObject status = JSON.parseObject(tugStatus); + rowData.put("tug_status", status); // 模拟更改数据 this.mockChange(rowData); @@ -107,9 +111,9 @@ public class DlMockController { // 这里的 args 必须得是一个数组,下标0是行数据,下标1是caseId,一般不用传 socketData.put("args", new Object[]{rowData, ""}); // 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT - String message = VXESocket.packageMessage(VXESocketConst.TYPE_UVT, socketData); + String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, socketData); // 调用 sendMessageToAll 发送给所有在线的用户 - VXESocket.sendMessageToAll(message); + VxeSocket.sendMessageToAll(message); } /** @@ -128,9 +132,9 @@ public class DlMockController { socketData.put("args", new Object[]{status}); // 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT - String message = VXESocket.packageMessage(VXESocketConst.TYPE_CSD, socketData); + String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_CSD, socketData); // 调用 sendMessageToAll 发送给所有在线的用户 - VXESocket.sendMessageToAll(message); + VxeSocket.sendMessageToAll(message); return Result.ok(); } @@ -259,7 +263,8 @@ public class DlMockController { // 模拟JSON数据路径 String path = "classpath:org/jeecg/modules/dlglong/json/ddjh.json"; - if ("8".equals(status)) { + String statusValue = "8"; + if (statusValue.equals(status)) { path = "classpath:org/jeecg/modules/dlglong/json/ddjh_s8.json"; } // 读取JSON数据 @@ -272,7 +277,7 @@ public class DlMockController { // 逐行查询子表数据,用于计算拖轮状态 List records = page.getRecords(); for (JSONObject record : records) { - Map tugStatusMap = new HashMap<>(); + Map tugStatusMap = new HashMap<>(5); String id = record.getString("id"); // 查询出主表的拖轮 String tugMain = record.getString("tug"); @@ -339,12 +344,12 @@ public class DlMockController { */ private IPage queryDataPage(JSONArray dataList, String parentId, Integer pageNo, Integer pageSize) { // 根据父级id查询子级 - JSONArray dataDB = dataList; + JSONArray dataDb = dataList; if (StringUtils.isNotBlank(parentId)) { JSONArray results = new JSONArray(); List parentIds = Arrays.asList(parentId.split(",")); - this.queryByParentId(dataDB, parentIds, results); - dataDB = results; + this.queryByParentId(dataDb, parentIds, results); + dataDb = results; } // 模拟分页(实际中应用SQL自带的分页) List records = new ArrayList<>(); @@ -352,23 +357,23 @@ public class DlMockController { long beginIndex, endIndex; // 如果任意一个参数为null,则不分页 if (pageNo == null || pageSize == null) { - page = new Page<>(0, dataDB.size()); + page = new Page<>(0, dataDb.size()); beginIndex = 0; - endIndex = dataDB.size(); + endIndex = dataDb.size(); } else { page = new Page<>(pageNo, pageSize); beginIndex = page.offset(); endIndex = page.offset() + page.getSize(); } - for (long i = beginIndex; (i < endIndex && i < dataDB.size()); i++) { - JSONObject data = dataDB.getJSONObject((int) i); + for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) { + JSONObject data = dataDb.getJSONObject((int) i); data = JSON.parseObject(data.toJSONString()); // 不返回 children data.remove("children"); records.add(data); } page.setRecords(records); - page.setTotal(dataDB.size()); + page.setTotal(dataDb.size()); return page; } diff --git a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/entity/MockEntity.java b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/entity/MockEntity.java index acadf91b..45a7fccb 100644 --- a/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/entity/MockEntity.java +++ b/jeecg-boot/jeecg-boot-module-demo/src/main/java/org/jeecg/modules/dlglong/entity/MockEntity.java @@ -4,15 +4,22 @@ import lombok.Data; /** * 模拟实体 + * @author: jeecg-boot */ @Data public class MockEntity { - // id + /** + * id + */ private String id; - // 父级ID + /** + * 父级ID + */ private String parentId; - // 状态 + /** + * 状态 + */ private String status; /* -- 省略其他字段 -- */ diff --git a/jeecg-boot/jeecg-boot-module-system/Dockerfile b/jeecg-boot/jeecg-boot-module-system/Dockerfile index 5fa43c39..e7803b02 100644 --- a/jeecg-boot/jeecg-boot-module-system/Dockerfile +++ b/jeecg-boot/jeecg-boot-module-system/Dockerfile @@ -11,6 +11,6 @@ WORKDIR /jeecg-boot EXPOSE 8080 ADD ./src/main/resources/jeecg ./config/jeecg -ADD ./target/jeecg-boot-module-system-3.1.0.jar ./ +ADD ./target/jeecg-boot-module-system-3.2.0.jar ./ -CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jeecg-boot-module-system-3.1.0.jar \ No newline at end of file +CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jeecg-boot-module-system-3.2.0.jar \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module-system/pom.xml b/jeecg-boot/jeecg-boot-module-system/pom.xml index 5b43eeff..7cc14459 100644 --- a/jeecg-boot/jeecg-boot-module-system/pom.xml +++ b/jeecg-boot/jeecg-boot-module-system/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-boot-parent - 3.1.0 + 3.2.0 4.0.0 @@ -34,35 +34,23 @@ org.jeecgframework.boot jeecg-system-local-api - + org.jeecgframework jeewx-api - 1.4.7 - - - commons-beanutils - commons-beanutils - - - commons-lang - commons-lang - - org.jeecgframework.jimureport jimureport-spring-boot-starter - 1.4.4-beta + 1.5.0-beta - - + org.jeecgframework.boot jeecg-boot-module-demo - 3.1.0 + ${jeecgboot.version} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java index 7546ca9d..1e493a9f 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java @@ -22,19 +22,27 @@ public class JeecgOneToMainUtil { public static void main(String[] args) { //第一步:设置主表配置 MainTableVo mainTable = new MainTableVo(); - mainTable.setTableName("jeecg_order_main");//表名 - mainTable.setEntityName("GuiTestOrderMain"); //实体名 - mainTable.setEntityPackage("gui"); //包名 - mainTable.setFtlDescription("GUI订单管理"); //描述 + //表名 + mainTable.setTableName("jeecg_order_main"); + //实体名 + mainTable.setEntityName("GuiTestOrderMain"); + //包名 + mainTable.setEntityPackage("gui"); + //描述 + mainTable.setFtlDescription("GUI订单管理"); //第二步:设置子表集合配置 List subTables = new ArrayList(); //[1].子表一 SubTableVo po = new SubTableVo(); - po.setTableName("jeecg_order_customer");//表名 - po.setEntityName("GuiTestOrderCustom"); //实体名 - po.setEntityPackage("gui"); //包名 - po.setFtlDescription("客户明细"); //描述 + //表名 + po.setTableName("jeecg_order_customer"); + //实体名 + po.setEntityName("GuiTestOrderCustom"); + //包名 + po.setEntityPackage("gui"); + //描述 + po.setFtlDescription("客户明细"); //子表外键参数配置 /*说明: * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾; @@ -45,10 +53,14 @@ public class JeecgOneToMainUtil { subTables.add(po); //[2].子表二 SubTableVo po2 = new SubTableVo(); - po2.setTableName("jeecg_order_ticket"); //表名 - po2.setEntityName("GuiTestOrderTicket"); //实体名 - po2.setEntityPackage("gui"); //包名 - po2.setFtlDescription("产品明细"); //描述 + //表名 + po2.setTableName("jeecg_order_ticket"); + //实体名 + po2.setEntityName("GuiTestOrderTicket"); + //包名 + po2.setEntityPackage("gui"); + //描述 + po2.setFtlDescription("产品明细"); //子表外键参数配置 /*说明: * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgSystemApplication.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgSystemApplication.java index f7099119..84a253d6 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgSystemApplication.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/JeecgSystemApplication.java @@ -1,19 +1,14 @@ package org.jeecg; import lombok.extern.slf4j.Slf4j; -import org.apache.catalina.Context; -import org.apache.tomcat.util.scan.StandardJarScanner; import org.jeecg.common.util.oConvertUtils; import org.springframework.boot.SpringApplication; -//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; import java.net.InetAddress; @@ -21,6 +16,7 @@ import java.net.UnknownHostException; /** * 单体启动类(采用此类启动为单体模式) +* 提醒: 需要集成mogodb请删除 exclude={MongoAutoConfiguration.class} */ @Slf4j @SpringBootApplication diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java index be63002a..6f8a77d4 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java @@ -43,7 +43,7 @@ public class CodeGenerateDbConfig { } } CodegenDatasourceConfig.initDbConfig(driverClassName,url, username, password); - log.info(" 代码生成器数据库连接,使用application.yml的DB配置 ###################"); + log.info(" Init CodeGenerate Config [ Get Db Config From application.yml ] "); } return null; } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java index 4d9f0e4b..de0fdba7 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java @@ -1,12 +1,12 @@ package org.jeecg.config.jimureport; import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.SysUserCacheInfo; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.TokenUtils; import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -19,6 +19,7 @@ import java.util.Map; * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制) * * 1.自定义获取登录token * * 2.自定义获取登录用户 + * @author: jeecg-boot */ @@ -26,7 +27,7 @@ import java.util.Map; @Component public class JimuReportTokenService implements JmReportTokenServiceI { @Autowired - private ISysBaseAPI sysBaseAPI; + private SysBaseApiImpl sysBaseApi; @Autowired @Lazy private RedisUtil redisUtil; @@ -43,17 +44,17 @@ public class JimuReportTokenService implements JmReportTokenServiceI { @Override public Boolean verifyToken(String token) { - return TokenUtils.verifyToken(token, sysBaseAPI, redisUtil); + return TokenUtils.verifyToken(token, sysBaseApi, redisUtil); } @Override public Map getUserInfo(String token) { - Map map = new HashMap(); + Map map = new HashMap(5); String username = JwtUtil.getUsername(token); //此处通过token只能拿到一个信息 用户账号 后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义 SysUserCacheInfo userInfo = null; try { - userInfo = sysBaseAPI.getCacheUser(username); + userInfo = sysBaseApi.getCacheUser(username); } catch (Exception e) { log.error("获取用户信息异常:"+ e.getMessage()); return map; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/controller/SystemAPIController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/controller/SystemAPIController.java index e5cc51fb..b3790be1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/controller/SystemAPIController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/controller/SystemAPIController.java @@ -1,11 +1,12 @@ package org.jeecg.modules.api.controller; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.dto.OnlineAuthDTO; import org.jeecg.common.api.dto.message.*; -import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.*; import org.jeecg.modules.system.service.ISysUserService; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -16,14 +17,15 @@ import java.util.Set; /** * 服务化 system模块 对外接口请求类 + * @author: jeecg-boot */ +@Slf4j @RestController @RequestMapping("/sys/api") public class SystemAPIController { @Autowired - private ISysBaseAPI sysBaseAPI; - + private SysBaseApiImpl sysBaseApi; @Autowired private ISysUserService sysUserService; @@ -34,7 +36,7 @@ public class SystemAPIController { */ @PostMapping("/sendSysAnnouncement") public void sendSysAnnouncement(@RequestBody MessageDTO message){ - sysBaseAPI.sendSysAnnouncement(message); + sysBaseApi.sendSysAnnouncement(message); } /** @@ -43,7 +45,7 @@ public class SystemAPIController { */ @PostMapping("/sendBusAnnouncement") public void sendBusAnnouncement(@RequestBody BusMessageDTO message){ - sysBaseAPI.sendBusAnnouncement(message); + sysBaseApi.sendBusAnnouncement(message); } /** @@ -52,7 +54,7 @@ public class SystemAPIController { */ @PostMapping("/sendTemplateAnnouncement") public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message){ - sysBaseAPI.sendTemplateAnnouncement(message); + sysBaseApi.sendTemplateAnnouncement(message); } /** @@ -61,7 +63,7 @@ public class SystemAPIController { */ @PostMapping("/sendBusTemplateAnnouncement") public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message){ - sysBaseAPI.sendBusTemplateAnnouncement(message); + sysBaseApi.sendBusTemplateAnnouncement(message); } /** @@ -71,7 +73,7 @@ public class SystemAPIController { */ @PostMapping("/parseTemplateByCode") public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO){ - return sysBaseAPI.parseTemplateByCode(templateDTO); + return sysBaseApi.parseTemplateByCode(templateDTO); } /** @@ -79,7 +81,7 @@ public class SystemAPIController { */ @GetMapping("/updateSysAnnounReadFlag") public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId){ - sysBaseAPI.updateSysAnnounReadFlag(busType, busId); + sysBaseApi.updateSysAnnounReadFlag(busType, busId); } /** @@ -89,7 +91,7 @@ public class SystemAPIController { */ @GetMapping("/getUserByName") public LoginUser getUserByName(@RequestParam("username") String username){ - return sysBaseAPI.getUserByName(username); + return sysBaseApi.getUserByName(username); } /** @@ -99,7 +101,7 @@ public class SystemAPIController { */ @GetMapping("/getUserById") LoginUser getUserById(@RequestParam("id") String id){ - return sysBaseAPI.getUserById(id); + return sysBaseApi.getUserById(id); } /** @@ -109,7 +111,7 @@ public class SystemAPIController { */ @GetMapping("/getRolesByUsername") List getRolesByUsername(@RequestParam("username") String username){ - return sysBaseAPI.getRolesByUsername(username); + return sysBaseApi.getRolesByUsername(username); } /** @@ -119,7 +121,7 @@ public class SystemAPIController { */ @GetMapping("/getDepartIdsByUsername") List getDepartIdsByUsername(@RequestParam("username") String username){ - return sysBaseAPI.getDepartIdsByUsername(username); + return sysBaseApi.getDepartIdsByUsername(username); } /** @@ -129,7 +131,7 @@ public class SystemAPIController { */ @GetMapping("/getDepartNamesByUsername") List getDepartNamesByUsername(@RequestParam("username") String username){ - return sysBaseAPI.getDepartNamesByUsername(username); + return sysBaseApi.getDepartNamesByUsername(username); } @@ -140,7 +142,7 @@ public class SystemAPIController { */ @GetMapping("/queryDictItemsByCode") List queryDictItemsByCode(@RequestParam("code") String code){ - return sysBaseAPI.queryDictItemsByCode(code); + return sysBaseApi.queryDictItemsByCode(code); } /** @@ -150,23 +152,31 @@ public class SystemAPIController { */ @GetMapping("/queryEnableDictItemsByCode") List queryEnableDictItemsByCode(@RequestParam("code") String code){ - return sysBaseAPI.queryEnableDictItemsByCode(code); + return sysBaseApi.queryEnableDictItemsByCode(code); } /** 查询所有的父级字典,按照create_time排序 */ @GetMapping("/queryAllDict") List queryAllDict(){ - return sysBaseAPI.queryAllDict(); +// try{ +// //睡10秒,gateway网关5秒超时,会触发熔断降级操作 +// Thread.sleep(10000); +// }catch (Exception e){ +// e.printStackTrace(); +// } + + log.info("--我是jeecg-system服务节点,微服务接口queryAllDict被调用--"); + return sysBaseApi.queryAllDict(); } /** * 查询所有分类字典 * @return */ - @GetMapping("/queryAllDSysCategory") - List queryAllDSysCategory(){ - return sysBaseAPI.queryAllDSysCategory(); + @GetMapping("/queryAllSysCategory") + List queryAllSysCategory(){ + return sysBaseApi.queryAllSysCategory(); } @@ -176,7 +186,7 @@ public class SystemAPIController { */ @GetMapping("/queryAllDepartBackDictModel") List queryAllDepartBackDictModel(){ - return sysBaseAPI.queryAllDepartBackDictModel(); + return sysBaseApi.queryAllDepartBackDictModel(); } /** @@ -187,9 +197,9 @@ public class SystemAPIController { @GetMapping("/queryAllRole") public List queryAllRole(@RequestParam(name = "roleIds",required = false)String[] roleIds){ if(roleIds==null || roleIds.length==0){ - return sysBaseAPI.queryAllRole(); + return sysBaseApi.queryAllRole(); }else{ - return sysBaseAPI.queryAllRole(roleIds); + return sysBaseApi.queryAllRole(roleIds); } } @@ -200,7 +210,7 @@ public class SystemAPIController { */ @GetMapping("/getRoleIdsByUsername") public List getRoleIdsByUsername(@RequestParam("username")String username){ - return sysBaseAPI.getRoleIdsByUsername(username); + return sysBaseApi.getRoleIdsByUsername(username); } /** @@ -210,7 +220,7 @@ public class SystemAPIController { */ @GetMapping("/getDepartIdsByOrgCode") public String getDepartIdsByOrgCode(@RequestParam("orgCode")String orgCode){ - return sysBaseAPI.getDepartIdsByOrgCode(orgCode); + return sysBaseApi.getDepartIdsByOrgCode(orgCode); } /** @@ -219,7 +229,7 @@ public class SystemAPIController { */ @GetMapping("/getAllSysDepart") public List getAllSysDepart(){ - return sysBaseAPI.getAllSysDepart(); + return sysBaseApi.getAllSysDepart(); } /** @@ -230,7 +240,7 @@ public class SystemAPIController { */ @GetMapping("/getDynamicDbSourceById") DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId")String dbSourceId){ - return sysBaseAPI.getDynamicDbSourceById(dbSourceId); + return sysBaseApi.getDynamicDbSourceById(dbSourceId); } @@ -242,7 +252,7 @@ public class SystemAPIController { */ @GetMapping("/getDeptHeadByDepId") public List getDeptHeadByDepId(@RequestParam("deptId") String deptId){ - return sysBaseAPI.getDeptHeadByDepId(deptId); + return sysBaseApi.getDeptHeadByDepId(deptId); } /** @@ -252,7 +262,7 @@ public class SystemAPIController { */ @GetMapping("/getParentDepartId") public DictModel getParentDepartId(@RequestParam("departId")String departId){ - return sysBaseAPI.getParentDepartId(departId); + return sysBaseApi.getParentDepartId(departId); } /** @@ -263,7 +273,7 @@ public class SystemAPIController { */ @GetMapping("/getDynamicDbSourceByCode") public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode){ - return sysBaseAPI.getDynamicDbSourceByCode(dbSourceCode); + return sysBaseApi.getDynamicDbSourceByCode(dbSourceCode); } /** @@ -273,7 +283,7 @@ public class SystemAPIController { */ @GetMapping("/sendWebSocketMsg") public void sendWebSocketMsg(String[] userIds, String cmd){ - sysBaseAPI.sendWebSocketMsg(userIds, cmd); + sysBaseApi.sendWebSocketMsg(userIds, cmd); } @@ -284,7 +294,7 @@ public class SystemAPIController { */ @GetMapping("/queryAllUserByIds") public List queryAllUserByIds(@RequestParam("userIds") String[] userIds){ - return sysBaseAPI.queryAllUserByIds(userIds); + return sysBaseApi.queryAllUserByIds(userIds); } /** @@ -293,7 +303,7 @@ public class SystemAPIController { */ @GetMapping("/queryAllUserBackCombo") public List queryAllUserBackCombo(){ - return sysBaseAPI.queryAllUserBackCombo(); + return sysBaseApi.queryAllUserBackCombo(); } /** @@ -302,7 +312,7 @@ public class SystemAPIController { */ @GetMapping("/queryAllUser") public JSONObject queryAllUser(@RequestParam(name="userIds",required=false)String userIds, @RequestParam(name="pageNo",required=false) Integer pageNo,@RequestParam(name="pageSize",required=false) int pageSize){ - return sysBaseAPI.queryAllUser(userIds, pageNo, pageSize); + return sysBaseApi.queryAllUser(userIds, pageNo, pageSize); } @@ -315,7 +325,7 @@ public class SystemAPIController { */ @GetMapping("/meetingSignWebsocket") public void meetingSignWebsocket(@RequestParam("userId")String userId){ - sysBaseAPI.meetingSignWebsocket(userId); + sysBaseApi.meetingSignWebsocket(userId); } /** @@ -325,7 +335,7 @@ public class SystemAPIController { */ @GetMapping("/queryUserByNames") public List queryUserByNames(@RequestParam("userNames")String[] userNames){ - return sysBaseAPI.queryUserByNames(userNames); + return sysBaseApi.queryUserByNames(userNames); } /** @@ -335,7 +345,7 @@ public class SystemAPIController { */ @GetMapping("/getUserRoleSet") public Set getUserRoleSet(@RequestParam("username")String username){ - return sysBaseAPI.getUserRoleSet(username); + return sysBaseApi.getUserRoleSet(username); } /** @@ -345,7 +355,7 @@ public class SystemAPIController { */ @GetMapping("/getUserPermissionSet") public Set getUserPermissionSet(@RequestParam("username") String username){ - return sysBaseAPI.getUserPermissionSet(username); + return sysBaseApi.getUserPermissionSet(username); } //----- @@ -357,7 +367,7 @@ public class SystemAPIController { */ @PostMapping("/hasOnlineAuth") public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO){ - return sysBaseAPI.hasOnlineAuth(onlineAuthDTO); + return sysBaseApi.hasOnlineAuth(onlineAuthDTO); } /** @@ -386,7 +396,7 @@ public class SystemAPIController { */ @GetMapping("/selectAllById") public SysDepartModel selectAllById(@RequestParam("id") String id){ - return sysBaseAPI.selectAllById(id); + return sysBaseApi.selectAllById(id); } /** @@ -396,7 +406,7 @@ public class SystemAPIController { */ @GetMapping("/queryDeptUsersByUserId") public List queryDeptUsersByUserId(@RequestParam("userId") String userId){ - return sysBaseAPI.queryDeptUsersByUserId(userId); + return sysBaseApi.queryDeptUsersByUserId(userId); } @@ -406,7 +416,7 @@ public class SystemAPIController { */ @GetMapping("/queryPermissionDataRule") public List queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username){ - return sysBaseAPI.queryPermissionDataRule(component, requestPath, username); + return sysBaseApi.queryPermissionDataRule(component, requestPath, username); } /** @@ -416,7 +426,7 @@ public class SystemAPIController { */ @GetMapping("/getCacheUser") public SysUserCacheInfo getCacheUser(@RequestParam("username") String username){ - return sysBaseAPI.getCacheUser(username); + return sysBaseApi.getCacheUser(username); } /** @@ -427,7 +437,7 @@ public class SystemAPIController { */ @GetMapping("/translateDict") public String translateDict(@RequestParam("code") String code, @RequestParam("key") String key){ - return sysBaseAPI.translateDict(code, key); + return sysBaseApi.translateDict(code, key); } @@ -438,7 +448,7 @@ public class SystemAPIController { */ @RequestMapping("/queryUsersByUsernames") List queryUsersByUsernames(@RequestParam("usernames") String usernames){ - return this.sysBaseAPI.queryUsersByUsernames(usernames); + return this.sysBaseApi.queryUsersByUsernames(usernames); } /** @@ -448,7 +458,7 @@ public class SystemAPIController { */ @RequestMapping("/queryUsersByIds") List queryUsersByIds(@RequestParam("ids") String ids){ - return this.sysBaseAPI.queryUsersByIds(ids); + return this.sysBaseApi.queryUsersByIds(ids); } /** @@ -458,7 +468,7 @@ public class SystemAPIController { */ @GetMapping("/queryDepartsByOrgcodes") List queryDepartsByOrgcodes(@RequestParam("orgCodes") String orgCodes){ - return this.sysBaseAPI.queryDepartsByOrgcodes(orgCodes); + return this.sysBaseApi.queryDepartsByOrgcodes(orgCodes); } /** @@ -468,7 +478,7 @@ public class SystemAPIController { */ @GetMapping("/queryDepartsByIds") List queryDepartsByIds(@RequestParam("ids") String ids){ - return this.sysBaseAPI.queryDepartsByIds(ids); + return this.sysBaseApi.queryDepartsByIds(ids); } /** @@ -479,7 +489,7 @@ public class SystemAPIController { */ @GetMapping("/sendEmailMsg") public void sendEmailMsg(@RequestParam("email")String email,@RequestParam("title")String title,@RequestParam("content")String content){ - this.sysBaseAPI.sendEmailMsg(email,title,content); + this.sysBaseApi.sendEmailMsg(email,title,content); }; /** * 41 获取公司下级部门和公司下所有用户信息 @@ -487,7 +497,7 @@ public class SystemAPIController { */ @GetMapping("/getDeptUserByOrgCode") List getDeptUserByOrgCode(@RequestParam("orgCode")String orgCode){ - return this.sysBaseAPI.getDeptUserByOrgCode(orgCode); + return this.sysBaseApi.getDeptUserByOrgCode(orgCode); } /** @@ -498,7 +508,7 @@ public class SystemAPIController { */ @GetMapping("/loadCategoryDictItem") public List loadCategoryDictItem(@RequestParam("ids") String ids) { - return sysBaseAPI.loadCategoryDictItem(ids); + return sysBaseApi.loadCategoryDictItem(ids); } /** @@ -510,7 +520,7 @@ public class SystemAPIController { */ @GetMapping("/loadDictItem") public List loadDictItem(@RequestParam("dictCode") String dictCode, @RequestParam("keys") String keys) { - return sysBaseAPI.loadDictItem(dictCode, keys); + return sysBaseApi.loadDictItem(dictCode, keys); } /** @@ -522,7 +532,7 @@ public class SystemAPIController { */ @GetMapping("/getDictItems") public List getDictItems(@RequestParam("dictCode") String dictCode) { - return sysBaseAPI.getDictItems(dictCode); + return sysBaseApi.getDictItems(dictCode); } /** @@ -533,7 +543,7 @@ public class SystemAPIController { */ @RequestMapping("/getManyDictItems") public Map> getManyDictItems(@RequestParam("dictCodeList") List dictCodeList) { - return sysBaseAPI.getManyDictItems(dictCodeList); + return sysBaseApi.getManyDictItems(dictCodeList); } /** @@ -546,7 +556,7 @@ public class SystemAPIController { */ @GetMapping("/loadDictItemByKeyword") public List loadDictItemByKeyword(@RequestParam("dictCode") String dictCode, @RequestParam("keyword") String keyword, @RequestParam(value = "pageSize", required = false) Integer pageSize) { - return sysBaseAPI.loadDictItemByKeyword(dictCode, keyword, pageSize); + return sysBaseApi.loadDictItemByKeyword(dictCode, keyword, pageSize); } /** @@ -557,7 +567,7 @@ public class SystemAPIController { */ @GetMapping("/translateManyDict") public Map> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys){ - return this.sysBaseAPI.translateManyDict(dictCodes, keys); + return this.sysBaseApi.translateManyDict(dictCodes, keys); } @@ -570,7 +580,7 @@ public class SystemAPIController { */ @GetMapping("/queryTableDictItemsByCode") List queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code){ - return sysBaseAPI.queryTableDictItemsByCode(table, text, code); + return sysBaseApi.queryTableDictItemsByCode(table, text, code); } /** @@ -583,7 +593,7 @@ public class SystemAPIController { */ @GetMapping("/queryFilterTableDictInfo") List queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql){ - return sysBaseAPI.queryFilterTableDictInfo(table, text, code, filterSql); + return sysBaseApi.queryFilterTableDictInfo(table, text, code, filterSql); } /** @@ -598,7 +608,7 @@ public class SystemAPIController { @Deprecated @GetMapping("/queryTableDictByKeys") public List queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray){ - return sysBaseAPI.queryTableDictByKeys(table, text, code, keyArray); + return sysBaseApi.queryTableDictByKeys(table, text, code, keyArray); } @@ -612,7 +622,7 @@ public class SystemAPIController { */ @GetMapping("/translateDictFromTable") public String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key){ - return sysBaseAPI.translateDictFromTable(table, text, code, key); + return sysBaseApi.translateDictFromTable(table, text, code, key); } @@ -628,7 +638,7 @@ public class SystemAPIController { */ @GetMapping("/translateDictFromTableByKeys") public List translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys) { - return this.sysBaseAPI.translateDictFromTableByKeys(table, text, code, keys); + return this.sysBaseApi.translateDictFromTableByKeys(table, text, code, keys); } } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/CASServiceUtil.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/CASServiceUtil.java index 5db70286..1b609f65 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/CASServiceUtil.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/CASServiceUtil.java @@ -16,6 +16,10 @@ import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; +/** + * @Description: CASServiceUtil + * @author: jeecg-boot + */ public class CASServiceUtil { public static void main(String[] args) { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java index 98213eab..bcd7d648 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java @@ -25,7 +25,7 @@ import lombok.extern.slf4j.Slf4j; /** * 解析cas,ST验证后的xml - * + * @author: jeecg-boot */ @Slf4j public final class XmlUtils { @@ -39,7 +39,7 @@ public final class XmlUtils { */ public static Document newDocument(final String xml) { final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - final Map features = new HashMap(); + final Map features = new HashMap(5); features.put(XMLConstants.FEATURE_SECURE_PROCESSING, true); features.put("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); for (final Map.Entry entry : features.entrySet()) { @@ -94,13 +94,15 @@ public final class XmlUtils { private StringBuilder buffer = new StringBuilder(); + @Override public void startElement(final String uri, final String localName, final String qName, - final Attributes attributes) throws SAXException { + final Attributes attributes) throws SAXException { if (localName.equals(element)) { this.foundElement = true; } } + @Override public void endElement(final String uri, final String localName, final String qName) throws SAXException { if (localName.equals(element)) { this.foundElement = false; @@ -109,6 +111,7 @@ public final class XmlUtils { } } + @Override public void characters(char[] ch, int start, int length) throws SAXException { if (this.foundElement) { this.buffer.append(ch, start, length); @@ -145,19 +148,22 @@ public final class XmlUtils { private boolean foundElement = false; + @Override public void startElement(final String uri, final String localName, final String qName, - final Attributes attributes) throws SAXException { + final Attributes attributes) throws SAXException { if (localName.equals(element)) { this.foundElement = true; } } + @Override public void endElement(final String uri, final String localName, final String qName) throws SAXException { if (localName.equals(element)) { this.foundElement = false; } } + @Override public void characters(char[] ch, int start, int length) throws SAXException { if (this.foundElement) { builder.append(ch, start, length); @@ -208,7 +214,7 @@ public final class XmlUtils { @Override public void startDocument() throws SAXException { - this.attributes = new HashMap(); + this.attributes = new HashMap(5); } @Override diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/MsgParams.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/MsgParams.java index a6407423..7bb63676 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/MsgParams.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/MsgParams.java @@ -6,18 +6,30 @@ import lombok.Data; /** * 发送消息实体 + * @author: jeecg-boot */ @Data public class MsgParams implements Serializable { private static final long serialVersionUID = 1L; - /*消息类型*/ + /** + * 消息类型 + */ private String msgType; - /*消息接收方*/ + + /** + * 消息接收方 + */ private String receiver; - /*消息模板码*/ + + /** + * 消息模板码 + */ private String templateCode; - /*测试数据*/ + + /** + * 测试数据 + */ private String testData; } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java index 87a2e185..1be82744 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java @@ -1,6 +1,16 @@ package org.jeecg.modules.message.handle; +/** + * @Description: 发送信息接口 + * @author: jeecg-boot + */ public interface ISendMsgHandle { + /** + * 发送信息 + * @param es_receiver 发送人 + * @param es_title 标题 + * @param es_content 内容 + */ void SendMsg(String es_receiver, String es_title, String es_content); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java index 5b062b12..bfdf0751 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java @@ -2,6 +2,7 @@ package org.jeecg.modules.message.handle.enums; /** * 推送状态枚举 + * @author: jeecg-boot */ public enum SendMsgStatusEnum { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java index bf86d5fe..a47b7e27 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java @@ -4,13 +4,26 @@ import org.jeecg.common.util.oConvertUtils; /** * 发送消息类型枚举 + * @author: jeecg-boot */ public enum SendMsgTypeEnum { -//推送方式:1短信 2邮件 3微信 + /** + * 短信 + */ SMS("1", "org.jeecg.modules.message.handle.impl.SmsSendMsgHandle"), + /** + * 邮件 + */ EMAIL("2", "org.jeecg.modules.message.handle.impl.EmailSendMsgHandle"), - WX("3","org.jeecg.modules.message.handle.impl.WxSendMsgHandle"); + /** + * 微信 + */ + WX("3","org.jeecg.modules.message.handle.impl.WxSendMsgHandle"), + /** + * 系统消息 + */ + SYSTEM_MESSAGE("4","org.jeecg.modules.message.handle.impl.SystemSendMsgHandle"); private String type; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java index 6ed35708..92addb1f 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java @@ -11,6 +11,10 @@ import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; +/** + * @Description: 邮箱发送信息 + * @author: jeecg-boot + */ public class EmailSendMsgHandle implements ISendMsgHandle { static String emailFrom; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java index 0691bf1f..c08ac2d4 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java @@ -3,6 +3,10 @@ package org.jeecg.modules.message.handle.impl; import lombok.extern.slf4j.Slf4j; import org.jeecg.modules.message.handle.ISendMsgHandle; +/** + * @Description: 短信发送 + * @author: jeecg-boot + */ @Slf4j public class SmsSendMsgHandle implements ISendMsgHandle { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java new file mode 100644 index 00000000..0ad50070 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java @@ -0,0 +1,28 @@ +package org.jeecg.modules.message.handle.impl; + +import org.jeecg.common.api.dto.message.MessageDTO; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.message.handle.ISendMsgHandle; + +/** +* @Description: 发送系统消息 +* @Author: wangshuai +* @Date: 2022年3月22日 18:48:20 +*/ +public class SystemSendMsgHandle implements ISendMsgHandle { + + public static final String FROM_USER="system"; + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + if(oConvertUtils.isEmpty(es_receiver)){ + throw new JeecgBootException("被发送人不能为空"); + } + ISysBaseAPI sysBaseAPI = SpringContextUtils.getBean(ISysBaseAPI.class); + MessageDTO messageDTO = new MessageDTO(FROM_USER,es_receiver,es_title,es_content); + sysBaseAPI.sendSysAnnouncement(messageDTO); + } +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java index 26e807af..a1d76f74 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java @@ -2,6 +2,11 @@ package org.jeecg.modules.message.handle.impl; import lombok.extern.slf4j.Slf4j; import org.jeecg.modules.message.handle.ISendMsgHandle; + +/** + * @Description: 发微信消息模板 + * @author: jeecg-boot + */ @Slf4j public class WxSendMsgHandle implements ISendMsgHandle { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java index 7408be38..62300745 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java @@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; /** * 发送消息任务 + * @author: jeecg-boot */ @Slf4j @@ -48,16 +49,24 @@ public class SendMsgJob implements Job { sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SMS.getImplClass()).newInstance(); } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.WX.getType())) { sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.WX.getImplClass()).newInstance(); + } else if(sysMessage.getEsType().equals(SendMsgTypeEnum.SYSTEM_MESSAGE.getType())){ + //update-begin---author:wangshuai ---date:20220323 for:[issues/I4X698]根据模板发送系统消息,发送失败------------ + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SYSTEM_MESSAGE.getImplClass()).newInstance(); + //update-end---author:wangshuai ---date:20220323 for:[issues/I4X698]根据模板发送系统消息,发送失败------------ } } catch (Exception e) { log.error(e.getMessage(),e); } Integer sendNum = sysMessage.getEsSendNum(); try { - sendMsgHandle.SendMsg(sysMessage.getEsReceiver(), sysMessage.getEsTitle(), - sysMessage.getEsContent().toString()); - // 发送消息成功 - sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode()); + //update-begin---author:wangshuai ---date:20220323 for:[issues/I4X698]模板管理发送消息出现NullPointerException 錯誤------------ + if(null != sendMsgHandle){ + sendMsgHandle.SendMsg(sysMessage.getEsReceiver(), sysMessage.getEsTitle(), + sysMessage.getEsContent().toString()); + //发送消息成功 + sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode()); + } + //update-end---author:wangshuai ---date:20220323 for:[issues/I4X698]模板管理发送消息出现NullPointerException 錯誤------------ } catch (Exception e) { e.printStackTrace(); // 发送消息出现异常 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java index fd0c6509..98de4bdc 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java @@ -13,6 +13,12 @@ import java.util.List; * @Version: V1.0 */ public interface SysMessageTemplateMapper extends BaseMapper { + + /** + * 通过模板CODE查询消息模板 + * @param code 模板CODE + * @return List + */ @Select("SELECT * FROM SYS_SMS_TEMPLATE WHERE TEMPLATE_CODE = #{code}") List selectByCode(String code); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java index d81c5e64..da3e78e8 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java @@ -12,5 +12,11 @@ import org.jeecg.modules.message.entity.SysMessageTemplate; * @Version: V1.0 */ public interface ISysMessageTemplateService extends JeecgService { + + /** + * 通过模板CODE查询消息模板 + * @param code 模板CODE + * @return + */ List selectByCode(String code); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java index f04acca8..84f6f04d 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java @@ -21,6 +21,7 @@ import java.util.Map; /** * 消息生成工具 + * @author: jeecg-boot */ @Component diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/SocketHandler.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/SocketHandler.java index 266ab6c1..53eb9dc1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/SocketHandler.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/SocketHandler.java @@ -4,16 +4,17 @@ import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.base.BaseMap; import org.jeecg.common.constant.CommonSendStatus; -import org.jeecg.common.modules.redis.listener.JeecgRedisListerer; +import org.jeecg.common.modules.redis.listener.JeecgRedisListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 监听消息(采用redis发布订阅方式发送消息) + * @author: jeecg-boot */ @Slf4j @Component -public class SocketHandler implements JeecgRedisListerer { +public class SocketHandler implements JeecgRedisListener { @Autowired private WebSocket webSocket; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/TestSocketController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/TestSocketController.java index cd8a9342..fe70566e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/TestSocketController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/TestSocketController.java @@ -10,6 +10,10 @@ import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; +/** + * @Description: TestSocketController + * @author: jeecg-boot + */ @RestController @RequestMapping("/sys/socketTest") public class TestSocketController { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java index 3bb06c3e..f5c2de5b 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java @@ -2,6 +2,7 @@ package org.jeecg.modules.message.websocket; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; import javax.annotation.Resource; @@ -28,11 +29,14 @@ import lombok.extern.slf4j.Slf4j; */ @Component @Slf4j -@ServerEndpoint("/websocket/{userId}") //此注解相当于设置访问URL +@ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; + /** + * 用户ID + */ private String userId; private static final String REDIS_TOPIC_NAME = "socketHandler"; @@ -44,12 +48,15 @@ public class WebSocket { * 缓存 webSocket连接到单机服务class中(整体方案支持集群) */ private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); - + /** + * 线程安全Map + */ + private static ConcurrentHashMap sessionPool = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { try { + //TODO 通过header中获取token,进行check this.session = session; this.userId = userId; webSockets.add(this); @@ -113,9 +120,11 @@ public class WebSocket { obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK); //消息内容 obj.put(WebsocketConst.MSG_TXT, "心跳响应"); + //update-begin-author:taoyan date:20220308 for: 消息通知长连接启动心跳机制,后端代码小bug #3473 for (WebSocket webSocket : webSockets) { - webSocket.pushMessage(message); + webSocket.pushMessage(obj.toJSONString()); } + //update-end-author:taoyan date:20220308 for: 消息通知长连接启动心跳机制,后端代码小bug #3473 } /** diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java index c9835815..383eb1a8 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java @@ -19,6 +19,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * @Description: ActuatorRedisController + * @author: jeecg-boot + */ @Slf4j @RestController @RequestMapping("/sys/actuator/redis") @@ -100,7 +104,7 @@ public class ActuatorRedisController { if(fs[i].getTotalSpace()==0) { continue; } - Map map = new HashMap<>(); + Map map = new HashMap(5); map.put("name", fsv.getSystemDisplayName(fs[i])); map.put("max", fs[i].getTotalSpace()); map.put("rest", fs[i].getFreeSpace()); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java index e605f9a6..22492215 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java @@ -3,9 +3,13 @@ package org.jeecg.modules.monitor.domain; import java.util.HashMap; import java.util.Map; +/** + * @Description: redis信息 + * @author: jeecg-boot + */ public class RedisInfo { - private static Map map = new HashMap<>(); + private static Map map = new HashMap(5); static { map.put("redis_version", "Redis 服务器版本"); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java index 0391c2a1..0cc67b2c 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java @@ -2,6 +2,7 @@ package org.jeecg.modules.monitor.exception; /** * Redis 连接异常 + * @author: jeecg-boot */ public class RedisConnectException extends Exception { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/RedisService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/RedisService.java index 4e6b41ca..ebb67552 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/RedisService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/RedisService.java @@ -8,12 +8,17 @@ import com.alibaba.fastjson.JSONArray; import org.jeecg.modules.monitor.domain.RedisInfo; import org.jeecg.modules.monitor.exception.RedisConnectException; +/** + * @Description: redis信息service接口 + * @author: jeecg-boot + */ public interface RedisService { /** * 获取 redis 的详细信息 * * @return List + * @throws RedisConnectException */ List getRedisInfo() throws RedisConnectException; @@ -21,6 +26,7 @@ public interface RedisService { * 获取 redis key 数量 * * @return Map + * @throws RedisConnectException */ Map getKeysSize() throws RedisConnectException; @@ -28,12 +34,14 @@ public interface RedisService { * 获取 redis 内存信息 * * @return Map + * @throws RedisConnectException */ Map getMemoryInfo() throws RedisConnectException; /** * 获取 报表需要个redis信息 - * + * @param type * @return Map + * @throws RedisConnectException */ Map getMapForReport(String type) throws RedisConnectException ; } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java index 5211ab8e..5ab7213e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java @@ -54,11 +54,11 @@ public class RedisServiceImpl implements RedisService { @Override public Map getKeysSize() throws RedisConnectException { Long dbSize = redisConnectionFactory.getConnection().dbSize(); - Map map = new HashMap<>(); + Map map = new HashMap(5); map.put("create_time", System.currentTimeMillis()); map.put("dbSize", dbSize); - log.info("--getKeysSize--: " + map.toString()); + log.debug("--getKeysSize--: " + map.toString()); return map; } @@ -69,12 +69,12 @@ public class RedisServiceImpl implements RedisService { for (Map.Entry entry : info.entrySet()) { String key = oConvertUtils.getString(entry.getKey()); if ("used_memory".equals(key)) { - map = new HashMap<>(); + map = new HashMap(5); map.put("used_memory", entry.getValue()); map.put("create_time", System.currentTimeMillis()); } } - log.info("--getMemoryInfo--: " + map.toString()); + log.debug("--getMemoryInfo--: " + map.toString()); return map; } @@ -86,7 +86,7 @@ public class RedisServiceImpl implements RedisService { */ @Override public Map getMapForReport(String type) throws RedisConnectException { - Map mapJson=new HashMap (); + Map mapJson=new HashMap(5); JSONArray json = new JSONArray(); if("3".equals(type)){ List redisInfo = getRedisInfo(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java index dd450cda..85d605d0 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java @@ -5,8 +5,33 @@ import com.alibaba.fastjson.JSONArray; import java.util.List; import java.util.Map; +/** + * @Description: NgAlainService接口 + * @author: jeecg-boot + */ public interface NgAlainService { + /** + * 菜单 + * @param id + * @return JSONArray + * @throws Exception + */ public JSONArray getMenu(String id) throws Exception; + + /** + * jeecg菜单 + * @param id + * @return JSONArray + * @throws Exception + */ public JSONArray getJeecgMenu(String id) throws Exception; + + /** + * 获取字典值 + * @param table + * @param key + * @param value + * @return List> + */ public List> getDictByTable(String table, String key, String value); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java index d2786b5e..6e93496d 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java @@ -15,6 +15,10 @@ import java.util.Base64; import java.util.List; import java.util.Map; +/** + * @Description: NgAlainServiceImpl 实现类 + * @author: jeecg-boot + */ @Service("ngAlainService") public class NgAlainServiceImpl implements NgAlainService { @Autowired diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/controller/OSSFileController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/controller/OSSFileController.java index 5ae7166c..12995a4e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/controller/OSSFileController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/controller/OSSFileController.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; /** * 云存储示例 DEMO + * @author: jeecg-boot */ @Slf4j @Controller diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/entity/OSSFile.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/entity/OSSFile.java index c62e5276..92a187db 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/entity/OSSFile.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/entity/OSSFile.java @@ -7,6 +7,10 @@ import lombok.experimental.Accessors; import org.jeecg.common.system.base.entity.JeecgEntity; import org.jeecgframework.poi.excel.annotation.Excel; +/** + * @Description: oss云存储实体类 + * @author: jeecg-boot + */ @Data @TableName("oss_file") @EqualsAndHashCode(callSuper = false) diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/mapper/OSSFileMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/mapper/OSSFileMapper.java index 3baebefe..2290c45c 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/mapper/OSSFileMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/mapper/OSSFileMapper.java @@ -3,6 +3,10 @@ package org.jeecg.modules.oss.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.oss.entity.OSSFile; +/** + * @Description: oss云存储Mapper + * @author: jeecg-boot + */ public interface OSSFileMapper extends BaseMapper { } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/IOSSFileService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/IOSSFileService.java index e50d8df1..d3abd577 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/IOSSFileService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/IOSSFileService.java @@ -6,10 +6,24 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.oss.entity.OSSFile; import org.springframework.web.multipart.MultipartFile; +/** + * @Description: OOS云存储service接口 + * @author: jeecg-boot + */ public interface IOSSFileService extends IService { + /** + * oss文件上传 + * @param multipartFile + * @throws IOException + */ void upload(MultipartFile multipartFile) throws IOException; + /** + * oss文件删除 + * @param ossFile OSSFile对象 + * @return + */ boolean delete(OSSFile ossFile); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/impl/OSSFileServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/impl/OSSFileServiceImpl.java index 98fc0a0d..a5e70994 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/impl/OSSFileServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/impl/OSSFileServiceImpl.java @@ -11,6 +11,10 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +/** + * @Description: OSS云存储实现类 + * @author: jeecg-boot + */ @Service("ossFileService") public class OSSFileServiceImpl extends ServiceImpl implements IOSSFileService { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java index d2e6d542..881e8ae6 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java @@ -228,7 +228,8 @@ public class QuartzJobController { List errorMessage = new ArrayList<>(); int successLines = 0, errorLines = 0; for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java index 764019e4..a84c3c61 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java @@ -15,6 +15,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface QuartzJobMapper extends BaseMapper { + /** + * 根据jobClassName查询 + * @param jobClassName 任务类名 + * @return + */ public List findByJobClassName(@Param("jobClassName") String jobClassName); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java index a2250bbe..cf90d13c 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java @@ -15,19 +15,46 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IQuartzJobService extends IService { + /** + * 通过类名寻找定时任务 + * @param jobClassName 类名 + * @return List + */ List findByJobClassName(String jobClassName); + /** + * 保存定时任务 + * @param quartzJob + * @return boolean + */ boolean saveAndScheduleJob(QuartzJob quartzJob); + /** + * 编辑定时任务 + * @param quartzJob + * @return boolean + * @throws SchedulerException + */ boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException; + /** + * 删除定时任务 + * @param quartzJob + * @return boolean + */ boolean deleteAndStopJob(QuartzJob quartzJob); + /** + * 恢复定时任务 + * @param quartzJob + * @return + */ boolean resumeJob(QuartzJob quartzJob); /** * 执行定时任务 * @param quartzJob + * @throws Exception */ void execute(QuartzJob quartzJob) throws Exception; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/CommonController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/CommonController.java index 796a938d..760efa28 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/CommonController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/CommonController.java @@ -11,7 +11,6 @@ import org.jeecg.common.util.CommonUtils; import org.jeecg.common.util.RestUtil; import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -42,9 +41,6 @@ import java.net.URLDecoder; @RequestMapping("/sys/common") public class CommonController { - @Autowired - private ISysBaseAPI sysBaseAPI; - @Value(value = "${jeecg.path.upload}") private String uploadpath; @@ -81,7 +77,8 @@ public class CommonController { } MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = multipartRequest.getFile("file"); if(oConvertUtils.isEmpty(bizPath)){ if(CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)){ //未指定目录,则用阿里云默认目录 upload @@ -135,9 +132,11 @@ public class CommonController { String fileName = null; File file = new File(ctxPath + File.separator + bizPath + File.separator ); if (!file.exists()) { - file.mkdirs();// 创建文件根目录 + // 创建文件根目录 + file.mkdirs(); } - String orgName = mf.getOriginalFilename();// 获取文件名 + // 获取文件名 + String orgName = mf.getOriginalFilename(); orgName = CommonUtils.getFileName(orgName); if(orgName.indexOf(".")!=-1){ fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")); @@ -228,7 +227,8 @@ public class CommonController { response.setStatus(404); throw new RuntimeException("文件["+imgPath+"]不存在.."); } - response.setContentType("application/force-download");// 设置强制下载不打开 + // 设置强制下载不打开 + response.setContentType("application/force-download"); response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1")); inputStream = new BufferedInputStream(new FileInputStream(filePath)); outputStream = response.getOutputStream(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java index e08b4422..04960c87 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java @@ -4,9 +4,11 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.util.SqlInjectionUtil; import org.jeecg.modules.system.mapper.SysDictMapper; import org.jeecg.modules.system.model.DuplicateCheckVo; +import org.jeecg.modules.system.security.DictQueryBlackListHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -32,6 +34,9 @@ public class DuplicateCheckController { @Autowired SysDictMapper sysDictMapper; + @Autowired + DictQueryBlackListHandler dictQueryBlackListHandler; + /** * 校验数据是否在系统中是否存在 * @@ -55,6 +60,12 @@ public class DuplicateCheckController { rs.setMessage("数据为空,不作处理!"); return rs; } + //update-begin-author:taoyan date:20220329 for: VUEN-223【安全漏洞】当前被攻击的接口 + String checkSql = duplicateCheckVo.getTableName() + SymbolConstant.COMMA + duplicateCheckVo.getFieldName() + SymbolConstant.COMMA; + if(!dictQueryBlackListHandler.isPass(checkSql)){ + return Result.error(dictQueryBlackListHandler.getError()); + } + //update-end-author:taoyan date:20220329 for: VUEN-223【安全漏洞】当前被攻击的接口 // update-end-author:taoyan date:20211227 for: JTC-25 【online报表】oracle 操作问题 录入弹框啥都不填直接保存 ①编码不是应该提示必填么?②报错也应该是具体文字提示,不是后台错误日志 if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { // [2].编辑页面校验 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java index 67e7f0ab..b8490ec6 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -12,7 +12,6 @@ import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.*; @@ -23,6 +22,7 @@ import org.jeecg.modules.system.entity.SysTenant; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.SysLoginModel; import org.jeecg.modules.system.service.*; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.jeecg.modules.system.util.RandImageUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -45,7 +45,7 @@ public class LoginController { @Autowired private ISysUserService sysUserService; @Autowired - private ISysBaseAPI sysBaseAPI; + private SysBaseApiImpl sysBaseApi; @Autowired private ISysLogService logService; @Autowired @@ -77,7 +77,7 @@ public class LoginController { return result; } String lowerCaseCaptcha = captcha.toLowerCase(); - String realKey = MD5Util.MD5Encode(lowerCaseCaptcha+sysLoginModel.getCheckKey(), "utf-8"); + String realKey = Md5Util.md5Encode(lowerCaseCaptcha+sysLoginModel.getCheckKey(), "utf-8"); Object checkCode = redisUtil.get(realKey); //当进入登录页时,有一定几率出现验证码错误 #1714 if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { @@ -129,11 +129,8 @@ public class LoginController { if(oConvertUtils.isNotEmpty(username)) { // 根据用户名查询用户信息 SysUser sysUser = sysUserService.getUserByName(username); - //用户登录信息 - Result resultObj=userInfo(sysUser, result); - JSONObject jsonObject=resultObj.getResult(); JSONObject obj=new JSONObject(); - obj.put("userInfo",jsonObject.get("userInfo")); + obj.put("userInfo",sysUser); obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); result.setResult(obj); result.success(""); @@ -156,7 +153,7 @@ public class LoginController { return Result.error("退出登录失败!"); } String username = JwtUtil.getUsername(token); - LoginUser sysUser = sysBaseAPI.getUserByName(username); + LoginUser sysUser = sysBaseApi.getUserByName(username); if(sysUser!=null) { //update-begin--Author:wangshuai Date:20200714 for:登出日志没有记录人员 baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser); @@ -436,7 +433,7 @@ public class LoginController { @GetMapping(value = "/getEncryptedString") public Result> getEncryptedString(){ Result> result = new Result>(); - Map map = new HashMap(); + Map map = new HashMap(5); map.put("key", EncryptedString.key); map.put("iv",EncryptedString.iv); result.setResult(map); @@ -450,7 +447,7 @@ public class LoginController { */ @ApiOperation("获取验证码") @GetMapping(value = "/randomImage/{key}") - public Result randomImage(HttpServletResponse response,@PathVariable String key){ + public Result randomImage(HttpServletResponse response,@PathVariable("key") String key){ Result res = new Result(); try { //生成验证码 @@ -459,7 +456,7 @@ public class LoginController { //存到redis中 String lowerCaseCode = code.toLowerCase(); - String realKey = MD5Util.MD5Encode(lowerCaseCode+key, "utf-8"); + String realKey = Md5Util.md5Encode(lowerCaseCode+key, "utf-8"); log.info("获取验证码,Redis checkCode = {},key = {}", code, key); redisUtil.set(realKey, lowerCaseCode, 60); @@ -548,7 +545,7 @@ public class LoginController { return Result.error("验证码无效"); } String lowerCaseCaptcha = captcha.toLowerCase(); - String realKey = MD5Util.MD5Encode(lowerCaseCaptcha+checkKey, "utf-8"); + String realKey = Md5Util.md5Encode(lowerCaseCaptcha+checkKey, "utf-8"); Object checkCode = redisUtil.get(realKey); if(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) { return Result.error("验证码错误"); @@ -593,7 +590,7 @@ public class LoginController { @GetMapping("/getQrcodeToken") public Result getQrcodeToken(@RequestParam String qrcodeId) { Object token = redisUtil.get(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId); - Map result = new HashMap(); + Map result = new HashMap(5); Object qrcodeIdExpire = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId); if (oConvertUtils.isEmpty(qrcodeIdExpire)) { //二维码过期通知前台刷新 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java index 08911018..e3f78e15 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java @@ -13,7 +13,6 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.CommonSendStatus; import org.jeecg.common.constant.WebsocketConst; -import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; @@ -25,6 +24,7 @@ import org.jeecg.modules.system.entity.SysAnnouncement; import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.service.ISysAnnouncementSendService; import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; import org.jeecg.modules.system.util.XSSUtils; @@ -74,7 +74,7 @@ public class SysAnnouncementController { @Autowired ThirdAppDingtalkServiceImpl dingtalkService; @Autowired - private ISysBaseAPI sysBaseAPI; + private SysBaseApiImpl sysBaseApi; @Autowired @Lazy private RedisUtil redisUtil; @@ -129,7 +129,8 @@ public class SysAnnouncementController { sysAnnouncement.setTitile(title); // update-end-author:liusq date:20210804 for:标题处理xss攻击的问题 sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); - sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);//未发布 + //未发布 + sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0); sysAnnouncementService.saveAnnouncement(sysAnnouncement); result.success("添加成功!"); } catch (Exception e) { @@ -239,7 +240,8 @@ public class SysAnnouncementController { if(sysAnnouncement==null) { result.error500("未找到对应实体"); }else { - sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);//发布中 + //发布中 + sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1); sysAnnouncement.setSendTime(new Date()); String currentUserName = JwtUtil.getUserNameByToken(request); sysAnnouncement.setSender(currentUserName); @@ -295,7 +297,8 @@ public class SysAnnouncementController { if(sysAnnouncement==null) { result.error500("未找到对应实体"); }else { - sysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2);//撤销发布 + //撤销发布 + sysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2); sysAnnouncement.setCancelTime(new Date()); boolean ok = sysAnnouncementService.updateById(sysAnnouncement); if(ok) { @@ -324,10 +327,14 @@ public class SysAnnouncementController { String userId = sysUser.getId(); // 1.将系统消息补充到用户通告阅读标记表中 LambdaQueryWrapper querySaWrapper = new LambdaQueryWrapper(); - querySaWrapper.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL); // 全部人员 - querySaWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0.toString()); // 未删除 - querySaWrapper.eq(SysAnnouncement::getSendStatus, CommonConstant.HAS_SEND); //已发布 - querySaWrapper.ge(SysAnnouncement::getEndTime, sysUser.getCreateTime()); //新注册用户不看结束通知 + //全部人员 + querySaWrapper.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL); + //未删除 + querySaWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0.toString()); + //已发布 + querySaWrapper.eq(SysAnnouncement::getSendStatus, CommonConstant.HAS_SEND); + //新注册用户不看结束通知 + querySaWrapper.ge(SysAnnouncement::getEndTime, sysUser.getCreateTime()); //update-begin--Author:liusq Date:20210108 for:[JT-424] 【开源issue】bug处理-------------------- querySaWrapper.notInSql(SysAnnouncement::getId,"select annt_id from sys_announcement_send where user_id='"+userId+"'"); //update-begin--Author:liusq Date:20210108 for: [JT-424] 【开源issue】bug处理-------------------- @@ -354,10 +361,12 @@ public class SysAnnouncementController { } // 2.查询用户未读的系统消息 Page anntMsgList = new Page(0, pageSize); - anntMsgList = sysAnnouncementService.querySysCementPageByUserId(anntMsgList,userId,"1");//通知公告消息 + //通知公告消息 + anntMsgList = sysAnnouncementService.querySysCementPageByUserId(anntMsgList,userId,"1"); Page sysMsgList = new Page(0, pageSize); - sysMsgList = sysAnnouncementService.querySysCementPageByUserId(sysMsgList,userId,"2");//系统消息 - Map sysMsgMap = new HashMap(); + //系统消息 + sysMsgList = sysAnnouncementService.querySysCementPageByUserId(sysMsgList,userId,"2"); + Map sysMsgMap = new HashMap(5); sysMsgMap.put("sysMsgList", sysMsgList.getRecords()); sysMsgMap.put("sysMsgTotal", sysMsgList.getTotal()); sysMsgMap.put("anntMsgList", anntMsgList.getRecords()); @@ -402,7 +411,8 @@ public class SysAnnouncementController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); @@ -481,7 +491,7 @@ public class SysAnnouncementController { boolean tokenOK = false; try { // 验证Token有效性 - tokenOK = TokenUtils.verifyToken(request, sysBaseAPI, redisUtil); + tokenOK = TokenUtils.verifyToken(request, sysBaseApi, redisUtil); } catch (Exception ignored) { } // 判断是否传递了Token,并且Token有效,如果传了就不做查看限制,直接返回 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java index 60bada80..719adcc1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java @@ -230,7 +230,8 @@ public class SysCategoryController { List errorMessage = new ArrayList<>(); int successLines = 0, errorLines = 0; for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java index 14a56eb2..bcba5d7a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java @@ -22,6 +22,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +/** + * @Description: 系统数据日志 + * @author: jeecg-boot + */ @RestController @RequestMapping("/sys/dataLog") @Slf4j diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index 3df03e75..378ae6da 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -379,14 +379,15 @@ public class SysDepartController { List listSysDeparts = null; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); params.setNeedSave(true); try { // orgCode编码长度 - int codeLength = YouBianCodeUtil.zhanweiLength; + int codeLength = YouBianCodeUtil.ZHANWEI_LENGTH; listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params); //按长度排序 Collections.sort(listSysDeparts, new Comparator() { @@ -476,7 +477,7 @@ public class SysDepartController { public Result> queryTreeByKeyWord(@RequestParam(name = "keyWord", required = false) String keyWord) { Result> result = new Result<>(); try { - Map map=new HashMap(); + Map map=new HashMap(5); List list = sysDepartService.queryTreeByKeyWord(keyWord); //根据keyWord获取用户信息 LambdaQueryWrapper queryUser = new LambdaQueryWrapper(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java index 7ca751fd..74a765aa 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java @@ -2,16 +2,20 @@ package org.jeecg.modules.system.controller; import java.util.*; import java.util.stream.Collectors; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.SysDepartPermission; import org.jeecg.modules.system.entity.SysDepartRolePermission; import org.jeecg.modules.system.entity.SysPermission; @@ -56,6 +60,9 @@ public class SysDepartPermissionController extends JeecgController map = new HashMap<>(); + Map map = new HashMap(5); map.put("datarule", list); LambdaQueryWrapper query = new LambdaQueryWrapper() .eq(SysDepartPermission::getPermissionId, permissionId) @@ -253,7 +260,11 @@ public class SysDepartPermissionController extends JeecgController treeList = new ArrayList<>(); getTreeModelList(treeList, list, null); - Map resMap = new HashMap(); - resMap.put("treeList", treeList); //全部树节点数据 - resMap.put("ids", ids);//全部树ids + Map resMap = new HashMap(5); + //全部树节点数据 + resMap.put("treeList", treeList); + //全部树ids + resMap.put("ids", ids); result.setResult(resMap); result.setSuccess(true); } catch (Exception e) { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java index 383d0272..e140dd91 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java @@ -2,6 +2,7 @@ package org.jeecg.modules.system.controller; import java.util.*; import java.util.stream.Collectors; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -15,6 +16,7 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.service.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -54,7 +56,10 @@ public class SysDepartRoleController extends JeecgController map = new HashMap<>(); + Map map = new HashMap(5); map.put("datarule", list); LambdaQueryWrapper query = new LambdaQueryWrapper() .eq(SysDepartRolePermission::getPermissionId, permissionId) diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java index 5e211308..121bf32e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java @@ -23,6 +23,7 @@ import org.jeecg.modules.system.entity.SysDict; import org.jeecg.modules.system.entity.SysDictItem; import org.jeecg.modules.system.model.SysDictTree; import org.jeecg.modules.system.model.TreeSelectModel; +import org.jeecg.modules.system.security.DictQueryBlackListHandler; import org.jeecg.modules.system.service.ISysDictItemService; import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.system.vo.SysDictPage; @@ -64,6 +65,8 @@ public class SysDictController { private ISysDictItemService sysDictItemService; @Autowired public RedisTemplate redisTemplate; + @Autowired + private DictQueryBlackListHandler dictQueryBlackListHandler; @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> queryPageList(SysDict sysDict,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -118,7 +121,7 @@ public class SysDictController { */ @RequestMapping(value = "/queryAllDictItems", method = RequestMethod.GET) public Result queryAllDictItems(HttpServletRequest request) { - Map> res = new HashMap>(); + Map> res = new HashMap(5); res = sysDictService.queryAllDictItems(); return Result.ok(res); } @@ -153,9 +156,14 @@ public class SysDictController { * @return */ @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) - public Result> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign,HttpServletRequest request) { + public Result> getDictItems(@PathVariable("dictCode") String dictCode, @RequestParam(value = "sign",required = false) String sign,HttpServletRequest request) { log.info(" dictCode : "+ dictCode); Result> result = new Result>(); + //update-begin-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 + if(!dictQueryBlackListHandler.isPass(dictCode)){ + return result.error500(dictQueryBlackListHandler.getError()); + } + //update-end-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 try { List ls = sysDictService.getDictItems(dictCode); if (ls == null) { @@ -181,12 +189,17 @@ public class SysDictController { * @return */ @RequestMapping(value = "/loadDict/{dictCode}", method = RequestMethod.GET) - public Result> loadDict(@PathVariable String dictCode, - @RequestParam(name="keyword") String keyword, + public Result> loadDict(@PathVariable("dictCode") String dictCode, + @RequestParam(name="keyword",required = false) String keyword, @RequestParam(value = "sign",required = false) String sign, @RequestParam(value = "pageSize", required = false) Integer pageSize) { log.info(" 加载字典表数据,加载关键字: "+ keyword); Result> result = new Result>(); + //update-begin-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 + if(!dictQueryBlackListHandler.isPass(dictCode)){ + return result.error500(dictQueryBlackListHandler.getError()); + } + //update-end-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 try { List ls = sysDictService.loadDict(dictCode, keyword, pageSize); if (ls == null) { @@ -215,7 +228,7 @@ public class SysDictController { */ @RequestMapping(value = "/loadDictOrderByValue/{dictCode}", method = RequestMethod.GET) public Result> loadDictOrderByValue( - @PathVariable String dictCode, + @PathVariable("dictCode") String dictCode, @RequestParam(name = "keyword") String keyword, @RequestParam(value = "sign", required = false) String sign, @RequestParam(value = "pageSize", required = false) Integer pageSize) { @@ -256,8 +269,13 @@ public class SysDictController { * @return */ @RequestMapping(value = "/loadDictItem/{dictCode}", method = RequestMethod.GET) - public Result> loadDictItem(@PathVariable String dictCode,@RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign,@RequestParam(value = "delNotExist",required = false,defaultValue = "true") boolean delNotExist,HttpServletRequest request) { + public Result> loadDictItem(@PathVariable("dictCode") String dictCode,@RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign,@RequestParam(value = "delNotExist",required = false,defaultValue = "true") boolean delNotExist,HttpServletRequest request) { Result> result = new Result<>(); + //update-begin-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 + if(!dictQueryBlackListHandler.isPass(dictCode)){ + return result.error500(dictQueryBlackListHandler.getError()); + } + //update-end-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 try { if(dictCode.indexOf(",")!=-1) { String[] params = dictCode.split(","); @@ -488,7 +506,8 @@ public class SysDictController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(2); @@ -568,7 +587,7 @@ public class SysDictController { * @return */ @RequestMapping(value = "/deletePhysic/{id}", method = RequestMethod.DELETE) - public Result deletePhysic(@PathVariable String id) { + public Result deletePhysic(@PathVariable("id") String id) { try { sysDictService.deleteOneDictPhysically(id); return Result.ok("删除成功!"); @@ -584,7 +603,7 @@ public class SysDictController { * @return */ @RequestMapping(value = "/back/{id}", method = RequestMethod.PUT) - public Result back(@PathVariable String id) { + public Result back(@PathVariable("id") String id) { try { sysDictService.updateDictDelFlag(0,id); return Result.ok("操作成功!"); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java index 611927e5..64b4ff2a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java @@ -7,6 +7,7 @@ import java.util.Date; import javax.servlet.http.HttpServletRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang.StringUtils; import org.apache.shiro.authz.annotation.RequiresRoles; @@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; * @Author zhangweijian * @since 2018-12-28 */ +@Api(tags = "数据字典") @RestController @RequestMapping("/sys/dictItem") @Slf4j @@ -161,7 +163,7 @@ public class SysDictItemController { @RequestMapping(value = "/dictItemCheck", method = RequestMethod.GET) @ApiOperation("字典重复校验接口") public Result doDictItemCheck(SysDictItem sysDictItem, HttpServletRequest request) { - int num = 0; + Long num = Long.valueOf(0); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(SysDictItem::getItemValue,sysDictItem.getItemValue()); queryWrapper.eq(SysDictItem::getDictId,sysDictItem.getDictId()); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java index e4d5b4e8..8471b6b1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java @@ -12,9 +12,10 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.enums.RoleIndexConfigEnum; import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.common.util.MD5Util; +import org.jeecg.common.util.Md5Util; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.JeeccgBaseConfig; +import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.model.SysPermissionTree; import org.jeecg.modules.system.model.TreeModel; @@ -23,6 +24,7 @@ import org.jeecg.modules.system.util.PermissionDataUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -57,6 +59,12 @@ public class SysPermissionController { @Autowired private JeeccgBaseConfig jeeccgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + @Autowired + private ISysRoleIndexService sysRoleIndexService; + /** * 加载数据节点 * @@ -156,7 +164,7 @@ public class SysPermissionController { query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); query.orderByAsc(SysPermission::getSortNo); List list = sysPermissionService.list(query); - Map> listMap = new HashMap<>(); + Map> listMap = new HashMap(5); for (SysPermission item : list) { String pid = item.getParentId(); if (parentIdList.contains(pid)) { @@ -204,7 +212,7 @@ public class SysPermissionController { * @return */ @RequestMapping(value = "/getUserPermissionByToken", method = RequestMethod.GET) - public Result getUserPermissionByToken() { + public Result getUserPermissionByToken(HttpServletRequest request) { Result result = new Result(); try { //直接获取当前用户不适用前端token @@ -411,8 +419,10 @@ public class SysPermissionController { getTreeModelList(treeList, list, null); Map resMap = new HashMap(); - resMap.put("treeList", treeList); // 全部树节点数据 - resMap.put("ids", ids);// 全部树ids + // 全部树节点数据 + resMap.put("treeList", treeList); + // 全部树ids + resMap.put("ids", ids); result.setResult(resMap); result.setSuccess(true); } catch (Exception e) { @@ -477,6 +487,10 @@ public class SysPermissionController { String permissionIds = json.getString("permissionIds"); String lastPermissionIds = json.getString("lastpermissionIds"); this.sysRolePermissionService.saveRolePermission(roleId, permissionIds, lastPermissionIds); + //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]用户管理角色授权添加敏感日志------------ + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + baseCommonService.addLog("修改角色ID: "+roleId+" 的权限配置,操作人: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); + //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]用户管理角色授权添加敏感日志------------ result.success("保存成功!"); log.info("======角色授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); } catch (Exception e) { @@ -654,13 +668,15 @@ public class SysPermissionController { } else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_0) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_1)) { json.put("id", permission.getId()); if (permission.isRoute()) { - json.put("route", "1");// 表示生成路由 + //表示生成路由 + json.put("route", "1"); } else { - json.put("route", "0");// 表示不生成路由 + //表示不生成路由 + json.put("route", "0"); } if (isWWWHttpUrl(permission.getUrl())) { - json.put("path", MD5Util.MD5Encode(permission.getUrl(), "utf-8")); + json.put("path", Md5Util.md5Encode(permission.getUrl(), "utf-8")); } else { json.put("path", permission.getUrl()); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java index 83154235..bdefe44d 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java @@ -234,7 +234,8 @@ public class SysPositionController { List errorMessage = new ArrayList<>(); int successLines = 0, errorLines = 0; for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java index 13c69c82..55012e19 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java @@ -214,7 +214,8 @@ public class SysRoleController { @RequestMapping(value = "/checkRoleCode", method = RequestMethod.GET) public Result checkUsername(String id,String roleCode) { Result result = new Result<>(); - result.setResult(true);//如果此参数为false则程序发生异常 + //如果此参数为false则程序发生异常 + result.setResult(true); log.info("--验证角色编码是否唯一---id:"+id+"--roleCode:"+roleCode); try { SysRole role = null; @@ -277,7 +278,8 @@ public class SysRoleController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); @@ -307,7 +309,7 @@ public class SysRoleController { if(list==null || list.size()==0) { return Result.error("未找到权限配置信息"); }else { - Map map = new HashMap<>(); + Map map = new HashMap(5); map.put("datarule", list); LambdaQueryWrapper query = new LambdaQueryWrapper() .eq(SysRolePermission::getPermissionId, permissionId) @@ -375,9 +377,11 @@ public class SysRoleController { } List treeList = new ArrayList<>(); getTreeModelList(treeList, list, null); - Map resMap = new HashMap(); - resMap.put("treeList", treeList); //全部树节点数据 - resMap.put("ids", ids);//全部树ids + Map resMap = new HashMap(5); + //全部树节点数据 + resMap.put("treeList", treeList); + //全部树ids + resMap.put("ids", ids); result.setResult(resMap); result.setSuccess(true); } catch (Exception e) { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java new file mode 100644 index 00000000..fb15615d --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java @@ -0,0 +1,168 @@ +package org.jeecg.modules.system.controller; + +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.modules.system.entity.SysRoleIndex; +import org.jeecg.modules.system.service.ISysRoleIndexService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + * @Description: 角色首页配置 + * @Author: jeecg-boot + * @Date: 2022-03-25 + * @Version: V1.0 + */ +@Slf4j +@Api(tags = "角色首页配置") +@RestController +@RequestMapping("/sys/sysRoleIndex") +public class SysRoleIndexController extends JeecgController { + @Autowired + private ISysRoleIndexService sysRoleIndexService; + + /** + * 分页列表查询 + * + * @param sysRoleIndex + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "角色首页配置-分页列表查询") + @ApiOperation(value = "角色首页配置-分页列表查询", notes = "角色首页配置-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(SysRoleIndex sysRoleIndex, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysRoleIndex, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = sysRoleIndexService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param sysRoleIndex + * @return + */ + @AutoLog(value = "角色首页配置-添加") + @ApiOperation(value = "角色首页配置-添加", notes = "角色首页配置-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody SysRoleIndex sysRoleIndex) { + sysRoleIndexService.save(sysRoleIndex); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param sysRoleIndex + * @return + */ + @AutoLog(value = "角色首页配置-编辑") + @ApiOperation(value = "角色首页配置-编辑", notes = "角色首页配置-编辑") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) + public Result edit(@RequestBody SysRoleIndex sysRoleIndex) { + sysRoleIndexService.updateById(sysRoleIndex); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "角色首页配置-通过id删除") + @ApiOperation(value = "角色首页配置-通过id删除", notes = "角色首页配置-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + sysRoleIndexService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "角色首页配置-批量删除") + @ApiOperation(value = "角色首页配置-批量删除", notes = "角色首页配置-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.sysRoleIndexService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "角色首页配置-通过id查询") + @ApiOperation(value = "角色首页配置-通过id查询", notes = "角色首页配置-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + SysRoleIndex sysRoleIndex = sysRoleIndexService.getById(id); + return Result.OK(sysRoleIndex); + } + + /** + * 导出excel + * + * @param request + * @param sysRoleIndex + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, SysRoleIndex sysRoleIndex) { + return super.exportXls(request, sysRoleIndex, SysRoleIndex.class, "角色首页配置"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, SysRoleIndex.class); + } + + /** + * 通过code查询 + * + * @param roleCode + * @return + */ + @AutoLog(value = "角色首页配置-通过code查询") + @ApiOperation(value = "角色首页配置-通过code查询", notes = "角色首页配置-通过code查询") + @GetMapping(value = "/queryByCode") + public Result queryByCode(@RequestParam(name = "roleCode", required = true) String roleCode) { + SysRoleIndex sysRoleIndex = sysRoleIndexService.getOne(new LambdaQueryWrapper().eq(SysRoleIndex::getRoleCode, roleCode)); + return Result.OK(sysRoleIndex); + } +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java index 82b73b78..6001b944 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java @@ -22,6 +22,7 @@ import java.util.*; /** * 租户配置信息 + * @author: jeecg-boot */ @Slf4j @RestController @@ -134,7 +135,7 @@ public class SysTenantController { // 过滤掉已被引用的租户 List idList = new ArrayList<>(); for (String id : ls) { - int userCount = sysTenantService.countUserLinkTenant(id); + Long userCount = sysTenantService.countUserLinkTenant(id); if (userCount == 0) { idList.add(Integer.parseInt(id)); } @@ -200,7 +201,7 @@ public class SysTenantController { try { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String tenantIds = sysUser.getRelTenantIds(); - Map map = new HashMap(); + Map map = new HashMap(5); if (oConvertUtils.isNotEmpty(tenantIds)) { List tenantIdList = new ArrayList<>(); for(String id: tenantIds.split(",")){ diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java index 300f9037..45d69342 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java @@ -19,6 +19,7 @@ import javax.servlet.http.HttpServletRequest; /** * minio文件上传示例 + * @author: jeecg-boot */ @Slf4j @RestController @@ -45,8 +46,10 @@ public class SysUploadController { bizPath = ""; } MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 - String orgName = file.getOriginalFilename();// 获取文件名 + // 获取上传文件对象 + MultipartFile file = multipartRequest.getFile("file"); + // 获取文件名 + String orgName = file.getOriginalFilename(); orgName = CommonUtils.getFileName(orgName); String file_url = MinioUtil.upload(file,bizPath); if(oConvertUtils.isEmpty(file_url)){ diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java index 998b61ea..cd6daeed 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java @@ -236,7 +236,8 @@ public class SysUserAgentController { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 + // 获取上传文件对象 + MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(1); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java index a6a12de3..1b2e2d37 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java @@ -42,7 +42,6 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -61,9 +60,7 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/sys/user") public class SysUserController { - @Autowired - private ISysBaseAPI sysBaseAPI; - + @Autowired private ISysUserService sysUserService; @@ -91,7 +88,7 @@ public class SysUserController { @Value("${jeecg.path.upload}") private String upLoadPath; - @Resource + @Autowired private BaseCommonService baseCommonService; /** @@ -117,7 +114,13 @@ public class SysUserController { query.eq(SysUserDepart::getDepId,departId); List list = sysUserDepartService.list(query); List userIds = list.stream().map(SysUserDepart::getUserId).collect(Collectors.toList()); - queryWrapper.in("id",userIds); + //update-begin---author:wangshuai ---date:20220322 for:[issues/I4XTYB]查询用户时,当部门id 下没有分配用户时接口报错------------ + if(oConvertUtils.listIsNotEmpty(userIds)){ + queryWrapper.in("id",userIds); + }else{ + return Result.OK(); + } + //update-end---author:wangshuai ---date:20220322 for:[issues/I4XTYB]查询用户时,当部门id 下没有分配用户时接口报错------------ } //用户ID String code = req.getParameter("code"); @@ -173,6 +176,7 @@ public class SysUserController { user.setDelFlag(CommonConstant.DEL_FLAG_0); // 保存用户走一个service 保证事务 sysUserService.saveUser(user, selectedRoles, selectedDeparts); + baseCommonService.addLog("添加用户,username: " +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2); result.success("添加成功!"); } catch (Exception e) { log.error(e.getMessage(), e); @@ -188,7 +192,7 @@ public class SysUserController { Result result = new Result(); try { SysUser sysUser = sysUserService.getById(jsonObject.getString("id")); - baseCommonService.addLog("编辑用户,id: " +jsonObject.getString("id") ,CommonConstant.LOG_TYPE_2, 2); + baseCommonService.addLog("编辑用户,username: " +sysUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); if(sysUser==null) { result.error500("未找到对应实体"); }else { @@ -336,6 +340,10 @@ public class SysUserController { return Result.error("用户不存在!"); } sysUser.setId(u.getId()); + //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + baseCommonService.addLog("修改用户 "+sysUser.getUsername()+" 的密码,操作人: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); + //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ return sysUserService.changePassword(sysUser); } @@ -586,6 +594,10 @@ public class SysUserController { if(user==null) { return Result.error("用户不存在!"); } + //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + baseCommonService.addLog("修改密码,username: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); + //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ return sysUserService.resetPassword(username,oldpassword,password,confirmpassword); } @@ -882,7 +894,7 @@ public class SysUserController { try { LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); List list = this.sysDepartService.queryUserDeparts(sysUser.getId()); - Map map = new HashMap(); + Map map = new HashMap(5); map.put("list", list); map.put("orgCode", sysUser.getOrgCode()); result.setSuccess(true); @@ -1030,7 +1042,7 @@ public class SysUserController { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysUser::getPhone,phone); SysUser user = sysUserService.getOne(query); - Map map = new HashMap<>(); + Map map = new HashMap(5); map.put("smscode",smscode); map.put("username",user.getUsername()); result.setResult(map); @@ -1076,6 +1088,9 @@ public class SysUserController { String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); sysUser.setPassword(passwordEncode); this.sysUserService.updateById(sysUser); + //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]密码重置添加敏感日志------------ + baseCommonService.addLog("重置 "+username+" 的密码,操作人: " +sysUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); + //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]密码重置添加敏感日志------------ result.setSuccess(true); result.setMessage("密码重置完成!"); return result; @@ -1297,7 +1312,7 @@ public class SysUserController { @GetMapping("/queryChildrenByUsername") public Result queryChildrenByUsername(@RequestParam("userId") String userId) { //获取用户信息 - Map map=new HashMap(); + Map map=new HashMap(5); SysUser sysUser = sysUserService.getById(userId); String username = sysUser.getUsername(); Integer identity = sysUser.getUserIdentity(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java index 576c9fd1..3222bf68 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java @@ -7,13 +7,13 @@ import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.service.ISysUserService; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.jeecg.modules.system.vo.SysUserOnlineVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,15 +39,12 @@ public class SysUserOnlineController { @Autowired private RedisUtil redisUtil; - @Autowired public RedisTemplate redisTemplate; - @Autowired public ISysUserService userService; - @Autowired - private ISysBaseAPI sysBaseAPI; + private SysBaseApiImpl sysBaseApi; @Resource private BaseCommonService baseCommonService; @@ -63,7 +60,7 @@ public class SysUserOnlineController { SysUserOnlineVO online = new SysUserOnlineVO(); online.setToken(token); //TODO 改成一次性查询 - LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token)); + LoginUser loginUser = sysBaseApi.getUserByName(JwtUtil.getUsername(token)); if (loginUser != null) { //update-begin---author:wangshuai ---date:20220104 for:[JTC-382]在线用户查询无效------------ //验证用户名是否与传过来的用户名相同 @@ -113,7 +110,7 @@ public class SysUserOnlineController { return Result.error("退出登录失败!"); } String username = JwtUtil.getUsername(online.getToken()); - LoginUser sysUser = sysBaseAPI.getUserByName(username); + LoginUser sysUser = sysBaseApi.getUserByName(username); if(sysUser!=null) { baseCommonService.addLog("强制: "+sysUser.getRealname()+"退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser); log.info(" 强制 "+sysUser.getRealname()+"退出成功! "); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java index 7363d55e..4c93b1e6 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java @@ -19,6 +19,7 @@ import java.util.Map; /** * 第三方App对接 + * @author: jeecg-boot */ @Slf4j @RestController("thirdAppController") @@ -38,7 +39,7 @@ public class ThirdAppController { */ @GetMapping("/getEnabledType") public Result getEnabledType() { - Map enabledMap = new HashMap<>(); + Map enabledMap = new HashMap(5); enabledMap.put("wechatEnterprise", thirdAppConfig.isWechatEnterpriseEnabled()); enabledMap.put("dingtalk", thirdAppConfig.isDingtalkEnabled()); return Result.OK(enabledMap); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java index 65aca763..d7e7c067 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java @@ -198,10 +198,17 @@ public class ThirdLoginController { String token = JwtUtil.sign(user.getUsername(), user.getPassword()); redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); // 设置超时时间 - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); return token; } + /** + * 第三方登录回调接口 + * @param token + * @param thirdType + * @return + * @throws Exception + */ @SuppressWarnings("unchecked") @RequestMapping(value = "/getLoginUser/{token}/{thirdType}", method = RequestMethod.GET) @ResponseBody @@ -251,20 +258,21 @@ public class ThirdLoginController { Result result = new Result(); String phone = jsonObject.getString("mobile"); String thirdUserUuid = jsonObject.getString("thirdUserUuid"); + // 校验验证码 + String captcha = jsonObject.getString("captcha"); + Object captchaCache = redisUtil.get(phone); + if (oConvertUtils.isEmpty(captcha) || !captcha.equals(captchaCache)) { + result.setMessage("验证码错误"); + result.setSuccess(false); + return result; + } //校验用户有效性 SysUser sysUser = sysUserService.getUserByPhone(phone); if(sysUser != null){ + // 存在用户,直接绑定 sysThirdAccountService.updateThirdUserId(sysUser,thirdUserUuid); }else{ // 不存在手机号,创建用户 - String smscode = jsonObject.getString("captcha"); - Object code = redisUtil.get(phone); - if (!smscode.equals(code)) { - result.setMessage("手机验证码错误"); - result.setSuccess(false); - return result; - } - //创建用户 sysUser = sysThirdAccountService.createUser(phone,thirdUserUuid); } String token = saveToken(sysUser); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java index 6dd039d6..2d885c5b 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java @@ -13,6 +13,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +/** + * @Description: 系统数据日志 + * @author: jeecg-boot + */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @@ -20,17 +24,52 @@ public class SysDataLog implements Serializable { private static final long serialVersionUID = 1L; @TableId(type = IdType.ASSIGN_ID) - private String id; //id' - private String createBy; //创建人登录名称 + /** + * id + */ + private String id; + + /** + * 创建人登录名称 + */ + private String createBy; + + /** + * 创建日期 + */ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") - private Date createTime; //创建日期 - private String updateBy; //更新人登录名称 + private Date createTime; + + /** + * 更新人登录名称 + */ + private String updateBy; @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") - private Date updateTime; //更新日期 - private String dataTable; //表名 - private String dataId; //数据ID - private String dataContent; //数据内容 - private String dataVersion; //版本号 + + /** + * 更新日期 + */ + private Date updateTime; + + /** + * 表名 + */ + private String dataTable; + + /** + * 数据ID + */ + private String dataId; + + /** + * 数据内容 + */ + private String dataContent; + + /** + * 版本号 + */ + private String dataVersion; } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDepart.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDepart.java index c0a94819..b4fdad5e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDepart.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysDepart.java @@ -1,6 +1,7 @@ package org.jeecg.modules.system.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -85,6 +86,15 @@ public class SysDepart implements Serializable { @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; + + //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段负责人ids和旧的负责人ids + /**部门负责人的ids*/ + @TableField(exist = false) + private String directorUserIds; + /**旧的部门负责人的ids(用于比较删除和新增)*/ + @TableField(exist = false) + private String oldDirectorUserIds; + //update-end---author:wangshuai ---date:20200308 for:[JTC-119]新增字段负责人ids和旧的负责人ids /** * 重写equals方法 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysRoleIndex.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysRoleIndex.java new file mode 100644 index 00000000..1c744bfa --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysRoleIndex.java @@ -0,0 +1,75 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 角色首页配置 + * @Author: liusq + * @Date: 2022-03-25 + * @Version: V1.0 + */ +@Data +@TableName("sys_role_index") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_role_index对象", description="角色首页配置") +public class SysRoleIndex { + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.String id; + /**角色编码*/ + @Excel(name = "角色编码", width = 15) + @ApiModelProperty(value = "角色编码") + private java.lang.String roleCode; + /**路由地址*/ + @Excel(name = "路由地址", width = 15) + @ApiModelProperty(value = "路由地址") + private java.lang.String url; + /**优先级*/ + @Excel(name = "优先级", width = 15) + @ApiModelProperty(value = "优先级") + private java.lang.Integer priority; + /**路由地址*/ + @Excel(name = "状态", width = 15) + @ApiModelProperty(value = "状态") + private java.lang.String status; + /**创建人登录名称*/ + @Excel(name = "创建人登录名称", width = 15) + @ApiModelProperty(value = "创建人登录名称") + private java.lang.String createBy; + /**创建日期*/ + @Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + /**更新人登录名称*/ + @Excel(name = "更新人登录名称", width = 15) + @ApiModelProperty(value = "更新人登录名称") + private java.lang.String updateBy; + /**更新日期*/ + @Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Excel(name = "所属部门", width = 15) + @ApiModelProperty(value = "所属部门") + private java.lang.String sysOrgCode; +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysTenant.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysTenant.java index a11a2958..8489b0f7 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysTenant.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysTenant.java @@ -11,6 +11,7 @@ import java.util.Date; /** * 租户信息 + * @author: jeecg-boot */ @Data @TableName("sys_tenant") diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java index 446d558b..d370ddde 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java @@ -7,6 +7,11 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; + +/** + * @Description: 用户部门 + * @author: jeecg-boot + */ @Data @TableName("sys_user_depart") public class SysUserDepart implements Serializable { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java index 9c6f3cea..e7a6343d 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java @@ -16,7 +16,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; */ public interface SysAnnouncementMapper extends BaseMapper { - + /** + * 通过消息类型和用户id获取系统通告 + * @param page + * @param userId 用户id + * @param msgCategory 消息类型 + * @return + */ List querySysCementListByUserId(Page page, @Param("userId")String userId,@Param("msgCategory")String msgCategory); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java index 56b25c65..65812210 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java @@ -17,13 +17,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; */ public interface SysAnnouncementSendMapper extends BaseMapper { + /** + * 通过用户id查询 用户通告阅读标记表 + * @param userId 用户id + * @return + */ public List queryByUserId(@Param("userId") String userId); /** - * @功能:获取我的消息 + * 获取我的消息 * @param announcementSendModel - * @param pageSize - * @param pageNo + * @param page * @return */ public List getMyAnnouncementSendList(Page page,@Param("announcementSendModel") AnnouncementSendModel announcementSendModel); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java index c5f2fd76..3abefa62 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java @@ -19,12 +19,18 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface SysCategoryMapper extends BaseMapper { /** - * 根据父级ID查询树节点数据 + * 根据父级ID查询树节点数据 * @param pid + * @param query * @return */ public List queryListByPid(@Param("pid") String pid,@Param("query") Map query); + /** + * 通过code查询分类字典表 + * @param code + * @return + */ @Select("SELECT ID FROM sys_category WHERE CODE = #{code,jdbcType=VARCHAR}") public String queryIdByCode(@Param("code") String code); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java index e6abc3b7..4bdcffd5 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java @@ -5,6 +5,10 @@ import org.jeecg.modules.system.entity.SysDataLog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +/** + * @Description: 系统数据日志Mapper接口 + * @author: jeecg-boot + */ public interface SysDataLogMapper extends BaseMapper{ /** * 通过表名及数据Id获取最大版本 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java index f5a32b4f..5d5c8fbf 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java @@ -21,6 +21,8 @@ public interface SysDepartMapper extends BaseMapper { /** * 根据用户ID查询部门集合 + * @param userId 用户id + * @return List */ public List queryUserDeparts(@Param("userId") String userId); @@ -32,9 +34,19 @@ public interface SysDepartMapper extends BaseMapper { */ public List queryDepartsByUsername(@Param("username") String username); + /** + * 通过部门编码获取部门id + * @param orgCode 部门编码 + * @return String + */ @Select("select id from sys_depart where org_code=#{orgCode}") public String queryDepartIdByOrgCode(@Param("orgCode") String orgCode); + /** + * 通过部门id 查询部门id,父id + * @param departId 部门id + * @return + */ @Select("select id,parent_id from sys_depart where id=#{departId}") public SysDepart getParentDepartId(@Param("departId") String departId); @@ -52,6 +64,11 @@ public interface SysDepartMapper extends BaseMapper { */ List getSubDepIdsByOrgCodes(@org.apache.ibatis.annotations.Param("orgCodes") String[] orgCodes); + /** + * 根据parent_id查询下级部门 + * @param parentId 父id + * @return List + */ List queryTreeListByPid(@Param("parentId") String parentId); /** * 根据id下级部门数量 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java index 0502f988..d53093e5 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java @@ -15,6 +15,12 @@ import java.util.List; * @since 2018-12-28 */ public interface SysDictItemMapper extends BaseMapper { + + /** + * 通过字典id查询字典项 + * @param mainId 字典id + * @return + */ @Select("SELECT * FROM sys_dict_item WHERE DICT_ID = #{mainId} order by sort_order asc, item_value asc") public List selectItemsByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java index d5698576..135b0bfc 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java @@ -27,14 +27,26 @@ import java.util.Map; public interface SysDictMapper extends BaseMapper { /** - * 重复检查SQL + * 重复检查SQL + * @param duplicateCheckVo * @return */ @Deprecated public Long duplicateCheckCountSql(DuplicateCheckVo duplicateCheckVo); + + /** + * 重复校验 sql语句 + * @param duplicateCheckVo + * @return + */ @Deprecated public Long duplicateCheckCountSqlNoDataId(DuplicateCheckVo duplicateCheckVo); - + + /** + * 通过字典code获取字典数据 + * @param code 字典code + * @return List + */ public List queryDictItemsByCode(@Param("code") String code); /** @@ -53,16 +65,44 @@ public interface SysDictMapper extends BaseMapper { */ public List queryDictItemsByCodeList(@Param("dictCodeList") List dictCodeList); + /** + * 通过查询指定table的 text code 获取字典 + * @param table + * @param text + * @param code + * @return List + */ @Deprecated public List queryTableDictItemsByCode(@Param("table") String table,@Param("text") String text,@Param("code") String code); + /** + * 通过查询指定table的 text code 获取字典(指定查询条件) + * @param table + * @param text + * @param code + * @param filterSql + * @return List + */ @Deprecated public List queryTableDictItemsByCodeAndFilter(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("filterSql") String filterSql); + /** + * 通过查询指定table的 text code 获取字典 + * @param table + * @param key + * @param value + * @return List> + */ @Deprecated @Select("select ${key} as \"label\",${value} as \"value\" from ${table}") public List> getDictByTableNgAlain(@Param("table") String table, @Param("key") String key, @Param("value") String value); + /** + * 通过字典code获取字典数据 + * @param code + * @param key + * @return + */ public String queryDictTextByKey(@Param("code") String code,@Param("key") String key); /** @@ -73,6 +113,14 @@ public interface SysDictMapper extends BaseMapper { */ List queryManyDictByKeys(@Param("dictCodeList") List dictCodeList, @Param("keys") List keys); + /** + * 通过查询指定table的 text code key 获取字典值 + * @param table + * @param text + * @param code + * @param key + * @return String + */ @Deprecated public String queryTableDictTextByKey(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("key") String key); @@ -88,6 +136,14 @@ public interface SysDictMapper extends BaseMapper { @Deprecated List queryTableDictTextByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keys") List keys); + /** + * 通过查询指定table的 text code key 获取字典值,包含value + * @param table + * @param text + * @param code + * @param keyArray + * @return List + */ @Deprecated public List queryTableDictByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyArray") String[] keyArray); @@ -133,6 +189,8 @@ public interface SysDictMapper extends BaseMapper { * @param code * @param pid * @param hasChildField + * @param query + * @param pidField * @return */ @Deprecated diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java index 81fe4d5a..f84d124b 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java @@ -20,7 +20,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface SysLogMapper extends BaseMapper { /** - * @功能:清空所有日志记录 + * 清空所有日志记录 */ public void removeAll(); @@ -34,14 +34,16 @@ public interface SysLogMapper extends BaseMapper { //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 /** * 获取系统今日访问次数 - * + * @param dayStart 开始时间 + * @param dayEnd 结束时间 * @return Long */ Long findTodayVisitCount(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd); /** * 获取系统今日访问 IP数 - * + * @param dayStart 开始时间 + * @param dayEnd 结束时间 * @return Long */ Long findTodayIp(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd); @@ -51,6 +53,7 @@ public interface SysLogMapper extends BaseMapper { * 首页:根据时间统计访问数量/ip数量 * @param dayStart * @param dayEnd + * @param dbType * @return */ List> findVisitCount(@Param("dayStart") Date dayStart, @Param("dayEnd") Date dayEnd, @Param("dbType") String dbType); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java index 37f375f7..58bd3310 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java @@ -27,18 +27,24 @@ public interface SysPermissionMapper extends BaseMapper { public List queryListByParentId(@Param("parentId") String parentId); /** - * 根据用户查询用户权限 + * 根据用户查询用户权限 + * @param username 用户账户名称 + * @return List */ public List queryByUser(@Param("username") String username); /** - * 修改菜单状态字段: 是否子节点 + * 修改菜单状态字段: 是否子节点 + * @param id 菜单id + * @param leaf 叶子节点 + * @return int */ @Update("update sys_permission set is_leaf=#{leaf} where id = #{id}") public int setMenuLeaf(@Param("id") String id,@Param("leaf") int leaf); /** - * 获取模糊匹配规则的数据权限URL + * 获取模糊匹配规则的数据权限URL + * @return List */ @Select("SELECT url FROM sys_permission WHERE del_flag = 0 and menu_type = 2 and url like '%*%'") public List queryPermissionUrlWithStar(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleIndexMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleIndexMapper.java new file mode 100644 index 00000000..206f7b72 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleIndexMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysRoleIndex; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 角色首页配置 + * @Author: jeecg-boot + * @Date: 2022-03-25 + * @Version: V1.0 + */ +public interface SysRoleIndexMapper extends BaseMapper { + +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java index 9d8f20b4..83d5a44b 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java @@ -18,18 +18,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface SysRoleMapper extends BaseMapper { /** + * @Description: 删除角色与用户关系 * @Author scott * @Date 2019/12/13 16:12 - * @Description: 删除角色与用户关系 */ @Delete("delete from sys_user_role where role_id = #{roleId}") void deleteRoleUserRelation(@Param("roleId") String roleId); /** - * @Author scott - * @Date 2019/12/13 16:12 * @Description: 删除角色与权限关系 + * @Author scott + * @param roleId + * @Date 2019/12/13 16:12 */ @Delete("delete from sys_role_permission where role_id = #{roleId}") void deleteRolePermissionRelation(@Param("roleId") String roleId); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java index 38cbc489..42fdfb98 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java @@ -3,6 +3,10 @@ package org.jeecg.modules.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.system.entity.SysTenant; +/** + * @Description: 租户mapper接口 + * @author: jeecg-boot + */ public interface SysTenantMapper extends BaseMapper { } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java index a7139d43..f6dba86e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java @@ -8,8 +8,17 @@ import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserDepart; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +/** + * @Description: 用户部门mapper接口 + * @author: jeecg-boot + */ public interface SysUserDepartMapper extends BaseMapper{ - + + /** + * 通过用户id查询部门用户 + * @param userId 用户id + * @return List + */ List getUserDepartByUid(@Param("userId") String userId); /** diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java index 5ae50449..916faeb7 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java @@ -32,6 +32,7 @@ public interface SysUserMapper extends BaseMapper { * 根据部门Id查询用户信息 * @param page * @param departId + * @param username 用户登录账户 * @return */ IPage getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username); @@ -47,6 +48,7 @@ public interface SysUserMapper extends BaseMapper { * 根据部门Ids,查询部门下用户信息 * @param page * @param departIds + * @param username 用户登录账户 * @return */ IPage getUserByDepIds(Page page, @Param("departIds") List departIds, @Param("username") String username); @@ -54,7 +56,8 @@ public interface SysUserMapper extends BaseMapper { /** * 根据角色Id查询用户信息 * @param page - * @param + * @param roleId 角色id + * @param username 用户登录账户 * @return */ IPage getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username); @@ -62,7 +65,7 @@ public interface SysUserMapper extends BaseMapper { /** * 根据用户名设置部门ID * @param username - * @param departId + * @param orgCode */ void updateUserDepart(@Param("username") String username,@Param("orgCode") String orgCode); @@ -102,41 +105,55 @@ public interface SysUserMapper extends BaseMapper { Integer getUserByOrgCodeTotal(@Param("orgCode") String orgCode, @Param("userParams") SysUser userParams); /** + * 批量删除角色与用户关系 * @Author scott * @Date 2019/12/13 16:10 - * @Description: 批量删除角色与用户关系 + * @param roleIdArray */ void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray); /** + * 批量删除角色与权限关系 * @Author scott * @Date 2019/12/13 16:10 - * @Description: 批量删除角色与权限关系 + * @param roleIdArray */ void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray); /** * 查询被逻辑删除的用户 + * @param wrapper + * @return List */ List selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper wrapper); /** * 还原被逻辑删除的用户 + * @param userIds 用户id + * @param entity + * @return int */ int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUser entity); /** * 彻底删除被逻辑删除的用户 + * @param userIds 多个用户id + * @return int */ int deleteLogicDeleted(@Param("userIds") String userIds); - /** 更新空字符串为null【此写法有sql注入风险,禁止随便用】 */ + /** + * 更新空字符串为null【此写法有sql注入风险,禁止随便用】 + * @param fieldName + * @return int + */ @Deprecated int updateNullByEmptyString(@Param("fieldName") String fieldName); /** * 根据部门Ids,查询部门下用户信息 * @param departIds + * @param username 用户账户名称 * @return */ List queryByDepIds(@Param("departIds")List departIds,@Param("username") String username); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java index 2465ffff..53939316 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java @@ -16,9 +16,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SysUserRoleMapper extends BaseMapper { + /** + * 通过用户账号查询角色集合 + * @param username 用户账号名称 + * @return List + */ @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") List getRoleByUserName(@Param("username") String username); + /** + * 通过用户账号查询角色Id集合 + * @param username 用户账号名称 + * @return List + */ @Select("select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") List getRoleIdByUserName(@Param("username") String username); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml index 7a4b388a..34f3ebec 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml @@ -160,7 +160,8 @@ select ${query.text} as "text",${query.code} as "value" from ${query.table} where 1 = 1 - and (${query.text} like '%${query.keyword}%' or ${query.code} like '%${query.keyword}%') + + and (${query.text} like #{bindKeyword} or ${query.code} like #{bindKeyword}) and ${query.code} = #{query.codeValue} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleIndexMapper.xml b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleIndexMapper.xml new file mode 100644 index 00000000..4b7cc605 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleIndexMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml index 92da725f..bee2bea5 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml @@ -12,7 +12,8 @@ select a.* from sys_user a join sys_user_depart b on b.user_id = a.id join sys_depart c on b.dep_id = c.id - where a.del_flag = 0 and c.org_code like '${orgCode}%' + + where a.del_flag = 0 and c.org_code like #{bindOrgCode} @@ -25,7 +26,8 @@ select a.*, c.depart_name as org_code_txt from sys_user a join sys_user_depart b on b.user_id = a.id join sys_depart c on b.dep_id = c.id - where a.del_flag = 0 and a.status = 1 and c.org_code like '${orgCode}%' + + where a.del_flag = 0 and a.status = 1 and c.org_code like #{bindOrgCode} and a.username like #{bindUsername} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml index 500261b4..7328a2dd 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml @@ -68,7 +68,13 @@ INNER JOIN sys_user_depart ON sys_user_depart.dep_id = sys_depart.id INNER JOIN sys_user ON sys_user.id = sys_user_depart.user_id WHERE - sys_user.del_flag = 0 AND sys_depart.org_code LIKE '${orgCode}%' + + + + + + + sys_user.del_flag = 0 AND sys_depart.org_code LIKE #{bindOrgCode} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java index 572f2d01..af157006 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java @@ -19,13 +19,19 @@ public class DepartIdModel implements Serializable { private static final long serialVersionUID = 1L; - // 主键ID + /** + * 主键ID + */ private String key; - // 主键ID + /** + * 主键ID + */ private String value; - // 部门名称 + /** + * 部门名称 + */ private String title; List children = new ArrayList<>(); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java index 86f54118..dcfc9235 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java @@ -75,6 +75,11 @@ public class SysDepartTreeModel implements Serializable{ private Date updateTime; + //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids + /**部门负责人ids*/ + private String directorUserIds; + //update-end---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids + private List children = new ArrayList<>(); @@ -107,6 +112,7 @@ public class SysDepartTreeModel implements Serializable{ this.createTime = sysDepart.getCreateTime(); this.updateBy = sysDepart.getUpdateBy(); this.updateTime = sysDepart.getUpdateTime(); + this.directorUserIds = sysDepart.getDirectorUserIds(); } public boolean getIsLeaf() { @@ -332,6 +338,14 @@ public class SysDepartTreeModel implements Serializable{ public SysDepartTreeModel() { } + public String getDirectorUserIds() { + return directorUserIds; + } + + public void setDirectorUserIds(String directorUserIds) { + this.directorUserIds = directorUserIds; + } + /** * 重写equals方法 */ @@ -365,6 +379,7 @@ public class SysDepartTreeModel implements Serializable{ Objects.equals(createTime, model.createTime) && Objects.equals(updateBy, model.updateBy) && Objects.equals(updateTime, model.updateTime) && + Objects.equals(directorUserIds, model.directorUserIds) && Objects.equals(children, model.children); } @@ -377,7 +392,7 @@ public class SysDepartTreeModel implements Serializable{ return Objects.hash(id, parentId, departName, departNameEn, departNameAbbr, departOrder, description, orgCategory, orgType, orgCode, mobile, fax, address, memo, status, delFlag, qywxIdentifier, createBy, createTime, updateBy, updateTime, - children); + children,directorUserIds); } } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java index 5b44d530..3b6ee090 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java @@ -6,6 +6,10 @@ import java.util.Date; import java.util.List; import org.jeecg.modules.system.entity.SysPermission; +/** + * @Description: 菜单树,封装树结构 + * @author: jeecg-boot + */ public class SysPermissionTree implements Serializable { private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java index e13265fd..4f6cc278 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java @@ -6,6 +6,7 @@ import java.io.Serializable; /** * 第三方登录 信息存储 + * @author: jeecg-boot */ @Data public class ThirdLoginModel implements Serializable { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeModel.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeModel.java index 417ccdde..c2da973a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeModel.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeModel.java @@ -10,6 +10,7 @@ import org.jeecg.modules.system.entity.SysPermission; /** * 树形列表用到 + * @author: jeecg-boot */ public class TreeModel implements Serializable { @@ -102,7 +103,7 @@ public class TreeModel implements Serializable { this.parentId = parentId; this.ruleFlag=ruleFlag; this.slotTitle = slotTitle; - Map map = new HashMap(); + Map map = new HashMap(5); map.put("title", "hasDatarule"); this.scopedSlots = map; this.isLeaf = isLeaf; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java index 39e7f4bb..6fc6f369 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java @@ -5,6 +5,7 @@ import java.util.List; /** * 树形下拉框 + * @author: jeecg-boot */ public class TreeSelectModel implements Serializable { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/CategoryCodeRule.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/CategoryCodeRule.java index 29ed03c9..9a23fcaa 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/CategoryCodeRule.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/CategoryCodeRule.java @@ -31,11 +31,15 @@ public class CategoryCodeRule implements IFillRuleHandler { if (formData != null && formData.size() > 0) { Object obj = formData.get("pid"); - if (oConvertUtils.isNotEmpty(obj)) categoryPid = obj.toString(); + if (oConvertUtils.isNotEmpty(obj)) { + categoryPid = obj.toString(); + } } else { if (params != null) { Object obj = params.get("pid"); - if (oConvertUtils.isNotEmpty(obj)) categoryPid = obj.toString(); + if (oConvertUtils.isNotEmpty(obj)) { + categoryPid = obj.toString(); + } } } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/OrgCodeRule.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/OrgCodeRule.java index bf6a3ac6..5b0d3549 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/OrgCodeRule.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/rule/OrgCodeRule.java @@ -38,11 +38,15 @@ public class OrgCodeRule implements IFillRuleHandler { String parentId = null; if (formData != null && formData.size() > 0) { Object obj = formData.get("parentId"); - if (obj != null) parentId = obj.toString(); + if (obj != null) { + parentId = obj.toString(); + } } else { if (params != null) { Object obj = params.get("parentId"); - if (obj != null) parentId = obj.toString(); + if (obj != null) { + parentId = obj.toString(); + } } } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/security/DictQueryBlackListHandler.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/security/DictQueryBlackListHandler.java new file mode 100644 index 00000000..279c72ab --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/security/DictQueryBlackListHandler.java @@ -0,0 +1,56 @@ +package org.jeecg.modules.system.security; + +import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.util.security.AbstractQueryBlackListHandler; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 字典组件 执行sql前校验 只校验表字典 + * dictCodeString格式如: + * table,text,code + * table where xxx,text,code + * table,text,code, where xxx + * + * @Author taoYan + * @Date 2022/3/23 21:10 + **/ +@Component("dictQueryBlackListHandler") +public class DictQueryBlackListHandler extends AbstractQueryBlackListHandler { + + @Override + protected List getQueryTableInfo(String dictCodeString) { + if (dictCodeString != null && dictCodeString.indexOf(SymbolConstant.COMMA) > 0) { + String[] arr = dictCodeString.split(SymbolConstant.COMMA); + if (arr.length != 3 && arr.length != 4) { + return null; + } + String tableName = getTableName(arr[0]); + QueryTable table = new QueryTable(tableName, ""); + // 无论什么场景 第二、三个元素一定是表的字段,直接add + table.addField(arr[1].trim()); + if (oConvertUtils.isNotEmpty(arr[2].trim())) { + table.addField(arr[2].trim()); + } + List list = new ArrayList<>(); + list.add(table); + return list; + } + return null; + } + + /** + * 取where前面的为:table name + * + * @param str + * @return + */ + private String getTableName(String str) { + String[] arr = str.split("\\s+(?i)where\\s+"); + return arr[0]; + } + +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementSendService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementSendService.java index 531718cb..60f8a2fa 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementSendService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementSendService.java @@ -16,11 +16,17 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ISysAnnouncementSendService extends IService { + /** + * 通过用户id查询用户通告阅读标记 + * @param userId 用户id + * @return + */ public List queryByUserId(String userId); /** - * @功能:获取我的消息 + * 获取我的消息 * @param announcementSendModel + * @param page 当前页数 * @return */ public Page getMyAnnouncementSendPage(Page page,AnnouncementSendModel announcementSendModel); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java index 38521d12..d719d660 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java @@ -13,12 +13,33 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ISysAnnouncementService extends IService { + /** + * 保存系统通告 + * @param sysAnnouncement + */ public void saveAnnouncement(SysAnnouncement sysAnnouncement); + /** + * 修改系统通告 + * @param sysAnnouncement + * @return + */ public boolean upDateAnnouncement(SysAnnouncement sysAnnouncement); + /** + * 保存系统通告 + * @param title 标题 + * @param msgContent 信息内容 + */ public void saveSysAnnouncement(String title, String msgContent); + /** + * 分页查询系统通告 + * @param page 当前页数 + * @param userId 用户id + * @param msgCategory 消息类型 + * @return Page + */ public Page querySysCementPageByUserId(Page page,String userId,String msgCategory); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java index a93d967f..908dfda9 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java @@ -19,14 +19,23 @@ public interface ISysCategoryService extends IService { /**根节点父ID的值*/ public static final String ROOT_PID_VALUE = "0"; + /** + * 添加分类字典 + * @param sysCategory + */ void addSysCategory(SysCategory sysCategory); - + + /** + * 修改分类字典 + * @param sysCategory + */ void updateSysCategory(SysCategory sysCategory); /** - * 根据父级编码加载分类字典的数据 + * 根据父级编码加载分类字典的数据 * @param pcode * @return + * @throws JeecgBootException */ public List queryListByCode(String pcode) throws JeecgBootException; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java index a18b8bf4..3886fc5c 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java @@ -4,6 +4,10 @@ import org.jeecg.modules.system.entity.SysDataLog; import com.baomidou.mybatisplus.extension.service.IService; +/** + * @Description: 数据日志service接口 + * @author: jeecg-boot + */ public interface ISysDataLogService extends IService { /** diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartPermissionService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartPermissionService.java index 0ae3933e..08ff1be3 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartPermissionService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartPermissionService.java @@ -23,7 +23,8 @@ public interface ISysDepartPermissionService extends IService getPermRuleListByDeptIdAndPermId(String departId,String permissionId); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleUserService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleUserService.java index dc34a001..2c5ca6ff 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleUserService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleUserService.java @@ -13,6 +13,12 @@ import java.util.List; */ public interface ISysDepartRoleUserService extends IService { + /** + * 添加用户与部门关联 + * @param userId 用户id + * @param newRoleId 新的角色id + * @param oldRoleId 旧的角色id + */ void deptRoleUserAdd(String userId,String newRoleId,String oldRoleId); /** diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index d389da28..5e52ef2a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -19,6 +19,7 @@ public interface ISysDepartService extends IService{ /** * 查询我的部门信息,并分节点进行显示 + * @param departIds 部门id * @return */ List queryMyDeptTreeList(String departIds); @@ -32,6 +33,7 @@ public interface ISysDepartService extends IService{ /** * 查询所有部门信息,并分节点进行显示 + * @param ids 多个部门id * @return */ List queryTreeList(String ids); @@ -45,12 +47,14 @@ public interface ISysDepartService extends IService{ /** * 保存部门数据 * @param sysDepart + * @param username 用户名 */ void saveDepartData(SysDepart sysDepart,String username); /** * 更新depart数据 * @param sysDepart + * @param username 用户名 * @return */ Boolean updateDepartDataById(SysDepart sysDepart,String username); @@ -65,6 +69,8 @@ public interface ISysDepartService extends IService{ /** * 根据关键字搜索相关的部门数据 * @param keyWord + * @param myDeptSearch + * @param departIds 多个部门id * @return */ List searchByKeyWord(String keyWord,String myDeptSearch,String departIds); @@ -93,7 +99,7 @@ public interface ISysDepartService extends IService{ /** * 根据部门id批量删除并删除其可能存在的子级部门 - * @param id + * @param ids 多个部门id * @return */ void deleteBatchWithChildren(List ids); @@ -107,16 +113,20 @@ public interface ISysDepartService extends IService{ /** * 获取我的部门下级所有部门IDS + * @param departIds 多个部门id * @return */ List getMySubDepIdsByDepId(String departIds); /** * 根据关键字获取部门信息(通讯录) + * @param keyWord 搜索词 * @return */ List queryTreeByKeyWord(String keyWord); /** * 获取我的部门下级所有部门 + * @param parentId 父id + * @param ids 多个部门id * @return */ List queryTreeListByPid(String parentId,String ids); @@ -125,6 +135,7 @@ public interface ISysDepartService extends IService{ * 获取某个部门的所有父级部门的ID * * @param departId 根据departId查 + * @return JSONObject */ JSONObject queryAllParentIdByDepartId(String departId); @@ -132,15 +143,18 @@ public interface ISysDepartService extends IService{ * 获取某个部门的所有父级部门的ID * * @param orgCode 根据orgCode查 + * @return JSONObject */ JSONObject queryAllParentIdByOrgCode(String orgCode); /** * 获取公司信息 + * @param orgCode 部门编码 * @return */ SysDepart queryCompByOrgCode(String orgCode); /** * 获取下级部门 + * @param pid * @return */ List queryDeptByPid(String pid); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java index 19c02b20..803b490e 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java @@ -14,5 +14,11 @@ import java.util.List; * @since 2018-12-28 */ public interface ISysDictItemService extends IService { + + /** + * 通过字典id查询字典项 + * @param mainId 字典id + * @return + */ public List selectItemsByMainId(String mainId); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java index 0d3860d6..b08a9d30 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java @@ -20,6 +20,11 @@ import java.util.Map; */ public interface ISysDictService extends IService { + /** + * 通过字典code获取字典数据 + * @param code + * @return + */ public List queryDictItemsByCode(String code); /** @@ -37,14 +42,39 @@ public interface ISysDictService extends IService { */ Map> queryDictItemsByCodeList(List dictCodeList); + /** + * 登录加载系统字典 + * @return + */ public Map> queryAllDictItems(); + /** + * 查通过查询指定table的 text code 获取字典 + * @param table + * @param text + * @param code + * @return + */ @Deprecated List queryTableDictItemsByCode(String table, String text, String code); + /** + * 通过查询指定table的 text code 获取字典(指定查询条件) + * @param table + * @param text + * @param code + * @param filterSql + * @return + */ @Deprecated public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql); + /** + * 通过字典code及字典项的value获取字典文本 + * @param code + * @param key + * @return + */ public String queryDictTextByKey(String code, String key); /** @@ -55,6 +85,14 @@ public interface ISysDictService extends IService { */ Map> queryManyDictByKeys(List dictCodeList, List keys); + /** + * 通过查询指定table的 text code key 获取字典值 + * @param table + * @param text + * @param code + * @param key + * @return + */ @Deprecated String queryTableDictTextByKey(String table, String text, String code, String key); @@ -69,8 +107,26 @@ public interface ISysDictService extends IService { */ List queryTableDictTextByKeys(String table, String text, String code, List keys); + /** + * 通过查询指定table的 text code key 获取字典值,包含value + * @param table 表名 + * @param text + * @param code + * @param keys + * @return + */ @Deprecated List queryTableDictByKeys(String table, String text, String code, String keys); + + /** + * 通过查询指定table的 text code key 获取字典值,包含value + * @param table + * @param text + * @param code + * @param keys + * @param delNotExist + * @return + */ @Deprecated List queryTableDictByKeys(String table, String text, String code, String keys,boolean delNotExist); @@ -84,6 +140,9 @@ public interface ISysDictService extends IService { /** * 添加一对多 + * @param sysDict + * @param sysDictItemList + * @return Integer */ public Integer saveMain(SysDict sysDict, List sysDictItemList); @@ -116,6 +175,8 @@ public interface ISysDictService extends IService { * @param text * @param code * @param keyword + * @param condition + * @param pageSize 每页条数 * @return */ public List queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize); @@ -138,6 +199,7 @@ public interface ISysDictService extends IService { * @param pidField * @param pid * @param hasChildField + * @param query * @return */ @Deprecated @@ -185,6 +247,8 @@ public interface ISysDictService extends IService { * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 * * @param dictCode 字典code格式:table,text,code + * @param keyword + * @param pageSize 每页条数 * @return */ List loadDict(String dictCode, String keyword, Integer pageSize); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysLogService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysLogService.java index ea796e3b..2d7238db 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysLogService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysLogService.java @@ -19,7 +19,7 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface ISysLogService extends IService { /** - * @功能:清空所有日志记录 + * 清空所有日志记录 */ public void removeAll(); @@ -33,14 +33,16 @@ public interface ISysLogService extends IService { //update-begin--Author:zhangweijian Date:20190428 for:传入开始时间,结束时间参数 /** * 获取系统今日访问次数 - * + * @param dayStart + * @param dayEnd * @return Long */ Long findTodayVisitCount(Date dayStart, Date dayEnd); /** * 获取系统今日访问 IP数 - * + * @param dayStart 开始时间 + * @param dayEnd 结束时间 * @return Long */ Long findTodayIp(Date dayStart, Date dayEnd); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java index 1b32ec5d..3e0a5d08 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java @@ -19,13 +19,14 @@ public interface ISysPermissionDataRuleService extends IService */ List getPermRuleListByPermId(String permissionId); /** * 根据页面传递的参数查询菜单权限数据 - * + * @param permRule * @return */ List queryPermissionRule(SysPermissionDataRule permRule); @@ -33,7 +34,7 @@ public interface ISysPermissionDataRuleService extends IService { - + + /** + * 通过父id查询菜单 + * @param parentId 父id + * @return + */ public List queryListByParentId(String parentId); - /**真实删除*/ + /** + * 真实删除 + * @param id 菜单id + * @throws JeecgBootException + */ public void deletePermission(String id) throws JeecgBootException; - /**逻辑删除*/ + /** + * 逻辑删除 + * @param id 菜单id + * @throws JeecgBootException + */ public void deletePermissionLogical(String id) throws JeecgBootException; - + + /** + * 添加菜单 + * @param sysPermission SysPermission对象 + * @throws JeecgBootException + */ public void addPermission(SysPermission sysPermission) throws JeecgBootException; - + + /** + * 编辑菜单 + * @param sysPermission SysPermission对象 + * @throws JeecgBootException + */ public void editPermission(SysPermission sysPermission) throws JeecgBootException; - + + /** + * 获取登录用户拥有的权限 + * @param username 用户名 + * @return + */ public List queryByUser(String username); /** diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPositionService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPositionService.java index d90d394e..1421f464 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPositionService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysPositionService.java @@ -13,6 +13,8 @@ public interface ISysPositionService extends IService { /** * 通过code查询 + * @param code 职务编码 + * @return SysPosition */ SysPosition getByCode(String code); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysRoleIndexService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysRoleIndexService.java new file mode 100644 index 00000000..328f67c9 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysRoleIndexService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysRoleIndex; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 角色首页配置 + * @Author: jeecg-boot + * @Date: 2022-03-25 + * @Version: V1.0 + */ +public interface ISysRoleIndexService extends IService { + +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java index 41425850..7aa8a36c 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java @@ -6,6 +6,10 @@ import org.jeecg.modules.system.entity.SysTenant; import java.util.Collection; import java.util.List; +/** + * @Description: 租户service接口 + * @author: jeecg-boot + */ public interface ISysTenantService extends IService { /** @@ -22,7 +26,7 @@ public interface ISysTenantService extends IService { * @param id * @return */ - int countUserLinkTenant(String id); + Long countUserLinkTenant(String id); /** * 根据ID删除租户,会判断是否已被引用 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java index e8040c73..7d5c1731 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java @@ -14,14 +14,35 @@ import java.util.List; * @Version: V1.0 */ public interface ISysThirdAccountService extends IService { - /**更新第三方账户信息*/ + /** + * 更新第三方账户信息 + * @param sysUser SysUser对象 + * @param thirdUserUuid 第三方id + */ void updateThirdUserId(SysUser sysUser,String thirdUserUuid); - /**创建第三方用户*/ + + /** + * 创建第三方用户 + * @param phone 手机号 + * @param thirdUserUuid 第三方id + * @return SysUser + */ SysUser createUser(String phone, String thirdUserUuid); - /** 根据本地userId查询数据 */ + /** + * 根据本地userId查询数据 + * @param sysUserId 用户id + * @param thirdType 第三方登录类型 + * @return SysThirdAccount + */ SysThirdAccount getOneBySysUserId(String sysUserId, String thirdType); - /** 根据第三方userId查询数据 */ + + /** + * 根据第三方userId查询数据 + * @param thirdUserId 第三方id + * @param thirdType 第三方登录类型 + * @return SysThirdAccount + */ SysThirdAccount getOneByThirdUserId(String thirdUserId, String thirdType); /** @@ -37,6 +58,7 @@ public interface ISysThirdAccountService extends IService { * 创建新用户 * * @param tlm 第三方登录信息 + * @return SysThirdAccount */ SysThirdAccount saveThirdUser(ThirdLoginModel tlm); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java index 10aa9dfb..e3689424 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java @@ -37,6 +37,9 @@ public interface ISysUserDepartService extends IService { List queryUserByDepId(String depId); /** * 根据部门code,查询当前部门和下级部门的用户信息 + * @param depCode 部门code + * @param realname 真实姓名 + * @return List */ List queryUserByDepCode(String depCode,String realname); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index 39123d81..70c880a1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java @@ -58,7 +58,12 @@ public interface ISysUserService extends IService { * @return */ public boolean deleteBatchUsers(String userIds); - + + /** + * 根据用户名查询 + * @param username 用户名 + * @return SysUser + */ public SysUser getUserByName(String username); /** @@ -92,21 +97,25 @@ public interface ISysUserService extends IService { /** * 根据部门Id查询 - * @param + * @param page + * @param departId 部门id + * @param username 用户账户名称 * @return */ public IPage getUserByDepId(Page page, String departId, String username); /** * 根据部门Ids查询 - * @param + * @param page + * @param departIds 部门id集合 + * @param username 用户账户名称 * @return */ public IPage getUserByDepIds(Page page, List departIds, String username); /** * 根据 userIds查询,查询用户所属部门的名称(多个部门名逗号隔开) - * @param + * @param userIds * @return */ public Map getDepNamesByUserIds(List userIds); @@ -133,7 +142,9 @@ public interface ISysUserService extends IService { /** * 根据角色Id查询 - * @param + * @param page + * @param roleId 角色id + * @param username 用户账户名称 * @return */ public IPage getUserByRoleId(Page page,String roleId, String username); @@ -163,13 +174,16 @@ public interface ISysUserService extends IService { /** * 根据手机号获取用户名和密码 + * @param phone 手机号 */ public SysUser getUserByPhone(String phone); /** * 根据邮箱获取用户 - */ + * @param email 邮箱 + * @return SysUser + */ public SysUser getUserByEmail(String email); @@ -196,26 +210,35 @@ public interface ISysUserService extends IService { /** * 查询被逻辑删除的用户 + * @return List */ List queryLogicDeleted(); /** * 查询被逻辑删除的用户(可拼装查询条件) + * @param wrapper + * @return List */ List queryLogicDeleted(LambdaQueryWrapper wrapper); /** * 还原被逻辑删除的用户 + * @param userIds 存放用户id集合 + * @param updateEntity + * @return boolean */ boolean revertLogicDeleted(List userIds, SysUser updateEntity); /** * 彻底删除被逻辑删除的用户 + * @param userIds 存放用户id集合 + * @return boolean */ boolean removeLogicDeleted(List userIds); /** * 更新手机号、邮箱空字符串为 null + * @return boolean */ @Transactional(rollbackFor = Exception.class) boolean updateNullPhoneEmail(); @@ -228,7 +251,8 @@ public interface ISysUserService extends IService { /** * 根据部门Ids查询 - * @param + * @param departIds 部门id集合 + * @param username 用户账户名称 * @return */ List queryByDepIds(List departIds, String username); @@ -249,7 +273,11 @@ public interface ISysUserService extends IService { */ void editUser(SysUser user, String roles, String departs); - /** userId转为username */ + /** + * userId转为username + * @param userIdList + * @return List + */ List userIdToUsername(Collection userIdList); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IThirdAppService.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IThirdAppService.java index 41161425..2f622ec0 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IThirdAppService.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IThirdAppService.java @@ -7,9 +7,14 @@ import java.util.List; /** * 第三方App对接 + * @author: jeecg-boot */ public interface IThirdAppService { + /** + * 获取AccessToken + * @return String + */ String getAccessToken(); /** @@ -18,7 +23,7 @@ public interface IThirdAppService { * 同步逻辑:
* 1. 先判断是否同步过,有则修改,无则创建;
* 2. 本地没有但第三方App里有则删除第三方App里的。 - * + * @param ids * @return 成功返回true */ SyncInfoVo syncLocalDepartmentToThirdApp(String ids); @@ -29,7 +34,7 @@ public interface IThirdAppService { * 同步逻辑:
* 1. 先判断是否同步过,有则修改,无则创建;
* 2. 本地没有但第三方App里有则删除第三方App里的。 - * + * @param ids * @return 成功返回true */ SyncInfoVo syncThirdAppDepartmentToLocal(String ids); @@ -42,7 +47,7 @@ public interface IThirdAppService { * (特殊点:1、目前逻辑特意做的不删除用户,防止企业微信提前上线,用户已经存在,但是平台无此用户。 * 企业微信支持禁用账号;钉钉不支持 * 2、企业微信里面是手机号激活,只能用户自己改,不允许通过接口改) - * + * @param ids * @return 成功返回空数组,失败返回错误信息 */ SyncInfoVo syncLocalUserToThirdApp(String ids); @@ -74,6 +79,11 @@ public interface IThirdAppService { */ boolean sendMessage(MessageDTO message, boolean verifyConfig); + /** + * 发送消息 + * @param message + * @return boolean + */ boolean sendMessage(MessageDTO message); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ImportFileServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ImportFileServiceImpl.java index ac5cc897..8c6839c4 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ImportFileServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ImportFileServiceImpl.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; /** * excel导入 实现类 + * @author: jeecg-boot */ @Slf4j @Service diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java index b5552519..30d938d9 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -36,7 +36,7 @@ public class SysAnnouncementServiceImpl extends ServiceImpl queryAllDSysCategory() { + public List queryAllSysCategory() { List ls = categoryMapper.selectList(null); List res = oConvertUtils.entityListToModelList(ls,SysCategoryModel.class); return res; @@ -780,7 +780,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { for(SysUserDepart userDepart : userDepartList){ //查询所属公司编码 SysDepart depart = sysDepartService.getById(userDepart.getDepId()); - int length = YouBianCodeUtil.zhanweiLength; + int length = YouBianCodeUtil.ZHANWEI_LENGTH; String compyOrgCode = ""; if(depart != null && depart.getOrgCode() != null){ compyOrgCode = depart.getOrgCode().substring(0,length); @@ -1056,7 +1056,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { List list=new ArrayList(); //4.处理部门和下级用户数据 for (SysDepart dept:departs) { - Map map=new HashMap(); + Map map=new HashMap(5); //部门名称 String departName = dept.getDepartName(); //根据部门编码获取下级部门id diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java index c8050108..5f732376 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java @@ -7,6 +7,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +/** + * @Description: 系统数据日志实现类 + * @author: jeecg-boot + */ @Service public class SysDataLogServiceImpl extends ServiceImpl implements ISysDataLogService { @Autowired diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java index b9e72f15..1c3afcca 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java @@ -96,7 +96,7 @@ public class SysDepartPermissionServiceImpl extends ServiceImpl map = new HashMap<>(); + Map map = new HashMap(5); for (String string : mainArr) { map.put(string, 1); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java index 5ff29a79..10c19db2 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java @@ -1,7 +1,7 @@ package org.jeecg.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysDepartRolePermission; @@ -30,7 +30,7 @@ public class SysDepartRolePermissionServiceImpl extends ServiceImpl map = new HashMap<>(); + Map map = new HashMap(5); for (String string : mainArr) { map.put(string, 1); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleUserServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleUserServiceImpl.java index d900725e..bf49e3aa 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleUserServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleUserServiceImpl.java @@ -78,7 +78,7 @@ public class SysDepartRoleUserServiceImpl extends ServiceImpl map = new HashMap<>(); + Map map = new HashMap(5); for (String string : mainArr) { map.put(string, 1); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index f1e55bee..5de598dc 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.function.Consumer; +import java.util.stream.Collectors; /** *

@@ -85,6 +86,10 @@ public class SysDepartServiceImpl extends ServiceImpl list = this.list(query); + //update-begin---author:wangshuai ---date:20220307 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理 + //设置用户id,让前台显示 + this.setUserIdsByDepList(list); + //update-begin---author:wangshuai ---date:20220307 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理 // 调用wrapTreeDataToTreeList方法生成树状数据 List listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); return listResult; @@ -126,7 +131,7 @@ public class SysDepartServiceImpl extends ServiceImpl list){ - Map map = new HashMap<>(); + Map map = new HashMap(5); //1.先将同一公司归类 for(SysDepart dept : list){ String code = dept.getOrgCode().substring(0,3); @@ -509,6 +524,10 @@ public class SysDepartServiceImpl extends ServiceImpl list = list(lqw); + //update-begin---author:wangshuai ---date:20220316 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理 + //设置用户id,让前台显示 + this.setUserIdsByDepList(list); + //update-end---author:wangshuai ---date:20220316 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理 List records = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { SysDepart depart = list.get(i); @@ -581,7 +600,7 @@ public class SysDepartServiceImpl extends ServiceImpl userDepartList = userDepartMapper.getUserDepartByUid(userId); + boolean isExistDepId = userDepartList.stream().anyMatch(item -> departId.equals(item.getDepId())); + //如果不存在需要设置所属部门 + if(!isExistDepId){ + userDepartMapper.insert(new SysUserDepart(userId,departId)); + } + } + } + + /** + * 修改用户负责部门 + * @param sysDepart SysDepart对象 + */ + private void updateChargeDepart(SysDepart sysDepart) { + //新的用户id + String directorIds = sysDepart.getDirectorUserIds(); + //旧的用户id(数据库中存在的) + String oldDirectorIds = sysDepart.getOldDirectorUserIds(); + String departId = sysDepart.getId(); + //如果用户id为空,那么用户的负责部门id应该去除 + if(oConvertUtils.isEmpty(directorIds)){ + this.deleteChargeDepId(departId,null); + }else if(oConvertUtils.isNotEmpty(directorIds) && oConvertUtils.isEmpty(oldDirectorIds)){ + //如果用户id不为空但是用户原来负责部门的用户id为空 + this.addDepartByUserIds(sysDepart,directorIds); + }else{ + //都不为空,需要比较,进行添加或删除 + //找到新的负责部门用户id与原来负责部门的用户id,进行删除 + List userIdList = Arrays.stream(oldDirectorIds.split(",")).filter(item -> !directorIds.contains(item)).collect(Collectors.toList()); + for (String userId:userIdList){ + this.deleteChargeDepId(departId,userId); + } + //找到原来负责部门的用户id与新的负责部门用户id,进行新增 + String addUserIds = Arrays.stream(directorIds.split(",")).filter(item -> !oldDirectorIds.contains(item)).collect(Collectors.joining(",")); + if(oConvertUtils.isNotEmpty(addUserIds)){ + this.addDepartByUserIds(sysDepart,addUserIds); + } + } + } + + /** + * 删除用户负责部门 + * @param departId 部门id + * @param userId 用户id + */ + private void deleteChargeDepId(String departId,String userId){ + //先查询负责部门的用户id,因为负责部门的id使用逗号拼接起来的 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.like(SysUser::getDepartIds,departId); + //删除全部的情况下用户id不存在 + if(oConvertUtils.isNotEmpty(userId)){ + query.eq(SysUser::getId,userId); + } + List userList = sysUserMapper.selectList(query); + for (SysUser sysUser:userList) { + //将不存在的部门id删除掉 + String departIds = sysUser.getDepartIds(); + List list = new ArrayList<>(Arrays.asList(departIds.split(","))); + list.remove(departId); + //删除之后再将新的id用逗号拼接起来进行更新 + String newDepartIds = String.join(",",list); + sysUser.setDepartIds(newDepartIds); + sysUserMapper.updateById(sysUser); + } + } + + /** + * 通过部门集合为部门设置用户id,用于前台展示 + * @param departList 部门集合 + */ + private void setUserIdsByDepList(List departList) { + //查询负责部门不为空的情况 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.isNotNull(SysUser::getDepartIds); + List users = sysUserMapper.selectList(query); + Map map = new HashMap(5); + //先循环一遍找到不同的负责部门id + for (SysUser user:users) { + String departIds = user.getDepartIds(); + String[] departIdArray = departIds.split(","); + for (String departId:departIdArray) { + //mao中包含部门key,负责用户直接拼接 + if(map.containsKey(departId)){ + String userIds = map.get(departId) + "," + user.getId(); + map.put(departId,userIds); + }else{ + map.put(departId,user.getId()); + } + } + } + //循环部门集合找到部门id对应的负责用户 + for (SysDepart sysDepart:departList) { + if(map.containsKey(sysDepart.getId())){ + sysDepart.setDirectorUserIds(map.get(sysDepart.getId()).toString()); + } + } + } + //update-end---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增方法添加部门负责人、删除负责部门负责人、查询部门对应的负责人 + } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index 3382fb9c..6662166a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.system.vo.DictModelMany; import org.jeecg.common.system.vo.DictQuery; @@ -68,7 +70,7 @@ public class SysDictServiceImpl extends ServiceImpl impl @Override public Map> queryDictItemsByCodeList(List dictCodeList) { List list = sysDictMapper.queryDictItemsByCodeList(dictCodeList); - Map> dictMap = new HashMap<>(); + Map> dictMap = new HashMap(5); for (DictModelMany dict : list) { List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); dict.setDictCode(null); @@ -79,7 +81,7 @@ public class SysDictServiceImpl extends ServiceImpl impl @Override public Map> queryAllDictItems() { - Map> res = new HashMap>(); + Map> res = new HashMap(5); List ls = sysDictMapper.selectList(null); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(SysDictItem::getStatus, 1); @@ -116,7 +118,7 @@ public class SysDictServiceImpl extends ServiceImpl impl @Override public Map> queryManyDictByKeys(List dictCodeList, List keys) { List list = sysDictMapper.queryManyDictByKeys(dictCodeList, keys); - Map> dictMap = new HashMap<>(); + Map> dictMap = new HashMap(5); for (DictModelMany dict : list) { List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); dictItemList.add(new DictModel(dict.getValue(), dict.getText())); @@ -226,7 +228,7 @@ public class SysDictServiceImpl extends ServiceImpl impl } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Integer saveMain(SysDict sysDict, List sysDictItemList) { int insert=0; try{ @@ -390,6 +392,11 @@ public class SysDictServiceImpl extends ServiceImpl impl return null; } else if (params.length == 4) { condition = params[3]; + // update-begin-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 + if(condition.indexOf("#{")>=0){ + condition = QueryGenerator.getSqlRuleValue(condition); + } + // update-end-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 } List ls; if (pageSize != null) { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java index 316d9442..18c36495 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java @@ -92,12 +92,12 @@ public class SysGatewayRouteServiceImpl extends ServiceImpl impleme @Resource private SysLogMapper sysLogMapper; @Autowired - private ISysBaseAPI sysBaseAPI; + private SysBaseApiImpl sysBaseAPI; /** * @功能:清空所有日志记录 diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java index b907a178..69b7c123 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java @@ -84,7 +84,7 @@ public class SysPermissionDataRuleImpl extends ServiceImpl().eq(SysPermissionDataRule::getPermissionId, dataRule.getPermissionId())); + Long count = this.baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPermissionDataRule::getPermissionId, dataRule.getPermissionId())); //注:同一个事务中删除后再查询是会认为数据已被删除的 若事务回滚上述删除无效 if(count==null || count==0) { SysPermission permission = sysPermissionMapper.selectById(dataRule.getPermissionId()); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java index 06d2b61d..88b93ff0 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java @@ -64,7 +64,7 @@ public class SysPermissionServiceImpl extends ServiceImpl().lambda().eq(SysPermission::getParentId, pid)); + Long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if(count==1) { //若父节点无其他子节点,则该父节点是叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 1); @@ -83,7 +83,7 @@ public class SysPermissionServiceImpl extends ServiceImpl(); + Map map = new HashMap(5); map.put("permission_id",id); //删除数据规则 this.deletePermRuleByPermId(id); @@ -107,14 +107,16 @@ public class SysPermissionServiceImpl extends ServiceImpl permissionList = this.list(query); if (permissionList != null && permissionList.size() > 0) { - String id = ""; // id - int num = 0; // 查出的子级数量 + // id + String id = ""; + // 查出的子级数量 + Long num = Long.valueOf(0); // 如果查出的集合不为空, 则先删除所有 this.remove(query); // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 for (int i = 0, len = permissionList.size(); i < len; i++) { id = permissionList.get(i).getId(); - Map map = new HashMap<>(); + Map map = new HashMap(5); map.put("permission_id",id); //删除数据规则 this.deletePermRuleByPermId(id); @@ -145,7 +147,7 @@ public class SysPermissionServiceImpl extends ServiceImpl().lambda().eq(SysPermission::getParentId, pid)); + Long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if(count==1) { //若父节点无其他子节点,则该父节点是叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 1); @@ -189,7 +191,7 @@ public class SysPermissionServiceImpl extends ServiceImpl().lambda().eq(SysPermission::getParentId, sysPermission.getId())); + Long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, sysPermission.getId())); if(count==0) { sysPermission.setLeaf(true); } @@ -202,7 +204,7 @@ public class SysPermissionServiceImpl extends ServiceImpl().lambda().eq(SysPermission::getParentId, p.getParentId())); + Long cc = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, p.getParentId())); if(cc==0) { if(oConvertUtils.isNotEmpty(p.getParentId())) { this.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1); @@ -226,7 +228,7 @@ public class SysPermissionServiceImpl extends ServiceImpl query = new LambdaQueryWrapper<>(); query.eq(SysPermissionDataRule::getPermissionId, id); - int countValue = this.permissionDataRuleService.count(query); + Long countValue = this.permissionDataRuleService.count(query); if(countValue > 0) { this.permissionDataRuleService.remove(query); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRoleIndexServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRoleIndexServiceImpl.java new file mode 100644 index 00000000..60f63204 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRoleIndexServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysRoleIndex; +import org.jeecg.modules.system.mapper.SysRoleIndexMapper; +import org.jeecg.modules.system.service.ISysRoleIndexService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 角色首页配置 + * @Author: jeecg-boot + * @Date: 2022-03-25 + * @Version: V1.0 + */ +@Service +public class SysRoleIndexServiceImpl extends ServiceImpl implements ISysRoleIndexService { + +} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java index 79ff4ae8..6103c56a 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java @@ -2,8 +2,7 @@ package org.jeecg.modules.system.service.impl; import java.util.*; -import org.jeecg.common.constant.CacheConstant; -import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysRolePermission; @@ -14,7 +13,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -37,7 +35,7 @@ public class SysRolePermissionServiceImpl extends ServiceImpl map = new HashMap<>(); + Map map = new HashMap(5); for (String string : mainArr) { map.put(string, 1); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java index a4c4e857..629b99a5 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java @@ -16,6 +16,10 @@ import org.springframework.stereotype.Service; import java.util.Collection; import java.util.List; +/** + * @Description: 租户实现类 + * @author: jeecg-boot + */ @Service("sysTenantServiceImpl") @Slf4j public class SysTenantServiceImpl extends ServiceImpl implements ISysTenantService { @@ -33,7 +37,7 @@ public class SysTenantServiceImpl extends ServiceImpl userQueryWrapper = new LambdaQueryWrapper<>(); userQueryWrapper.eq(SysUser::getRelTenantIds, id); userQueryWrapper.or().like(SysUser::getRelTenantIds, "%," + id); @@ -46,7 +50,7 @@ public class SysTenantServiceImpl extends ServiceImpl 0) { throw new JeecgBootException("该租户已被引用,无法删除!"); } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java index 143df8fc..40893606 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java @@ -10,10 +10,11 @@ import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserDepart; import org.jeecg.modules.system.mapper.SysUserDepartMapper; +import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.service.ISysUserDepartService; -import org.jeecg.modules.system.service.ISysUserService; +import org.jeecg.modules.system.vo.SysUserDepVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,7 +36,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl userList = (List) sysUserService.listByIds(userIdList); + List userList = (List) sysUserMapper.selectBatchIds(userIdList); //update-begin-author:taoyan date:201905047 for:接口调用查询返回结果不能返回密码相关信息 for (SysUser sysUser : userList) { sysUser.setSalt(""); @@ -107,7 +108,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl userList = this.baseMapper.queryDepartUserList(depCode, realname); - Map map = new HashMap(); + Map map = new HashMap(5); for (SysUser sysUser : userList) { // 返回的用户数据去掉密码信息 sysUser.setSalt(""); @@ -132,7 +133,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl userList = pageList.getRecords(); if(userList!=null && userList.size()>0){ List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); - Map map = new HashMap(); + Map map = new HashMap(5); if(userIds!=null && userIds.size()>0){ // 查部门名称 - Map useDepNames = sysUserService.getDepNamesByUserIds(userIds); + Map useDepNames = this.getDepNamesByUserIds(userIds); userList.forEach(item->{ //TODO 临时借用这个字段用于页面展示 item.setOrgCodeTxt(useDepNames.get(item.getId())); @@ -159,4 +160,24 @@ public class SysUserDepartServiceImpl extends ServiceImpl getDepNamesByUserIds(List userIds) { + List list = sysUserMapper.getDepNamesByUserIds(userIds); + + Map res = new HashMap(5); + list.forEach(item -> { + if (res.get(item.getUserId()) == null) { + res.put(item.getUserId(), item.getDepartName()); + } else { + res.put(item.getUserId(), res.get(item.getUserId()) + "," + item.getDepartName()); + } + } + ); + return res; + } + } diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index cbb4eae8..3316a9fa 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java @@ -9,8 +9,6 @@ import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SysUserCacheInfo; import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.UUIDGenerator; @@ -23,6 +21,7 @@ import org.jeecg.modules.system.service.ISysUserService; import org.jeecg.modules.system.vo.SysUserDepVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -51,8 +50,6 @@ public class SysUserServiceImpl extends ServiceImpl impl @Autowired private SysUserDepartMapper sysUserDepartMapper; @Autowired - private ISysBaseAPI sysBaseAPI; - @Autowired private SysDepartMapper sysDepartMapper; @Autowired private SysRoleMapper sysRoleMapper; @@ -125,7 +122,7 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void addUserWithRole(SysUser user, String roles) { this.save(user); if(oConvertUtils.isNotEmpty(roles)) { @@ -139,7 +136,7 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override @CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, allEntries=true) - @Transactional + @Transactional(rollbackFor = Exception.class) public void editUserWithRole(SysUser user, String roles) { this.updateById(user); //先删后加 @@ -195,24 +192,32 @@ public class SysUserServiceImpl extends ServiceImpl impl return permissionSet; } + /** + * 升级SpringBoot2.6.6,不允许循环依赖 + * @author:qinfeng + * @update: 2022-04-07 + * @param username + * @return + */ @Override + @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") public SysUserCacheInfo getCacheUser(String username) { SysUserCacheInfo info = new SysUserCacheInfo(); info.setOneDepart(true); -// SysUser user = userMapper.getUserByName(username); -// info.setSysUserCode(user.getUsername()); -// info.setSysUserName(user.getRealname()); - + if(oConvertUtils.isEmpty(username)) { + return null; + } - LoginUser user = sysBaseAPI.getUserByName(username); - if(user!=null) { - info.setSysUserCode(user.getUsername()); - info.setSysUserName(user.getRealname()); - info.setSysOrgCode(user.getOrgCode()); + //查询用户信息 + SysUser sysUser = userMapper.getUserByName(username); + if(sysUser!=null) { + info.setSysUserCode(sysUser.getUsername()); + info.setSysUserName(sysUser.getRealname()); + info.setSysOrgCode(sysUser.getOrgCode()); } //多部门支持in查询 - List list = sysDepartMapper.queryUserDeparts(user.getId()); + List list = sysDepartMapper.queryUserDeparts(sysUser.getId()); List sysMultiOrgCode = new ArrayList(); if(list==null || list.size()==0) { //当前用户无部门 @@ -230,7 +235,13 @@ public class SysUserServiceImpl extends ServiceImpl impl return info; } - // 根据部门Id查询 + /** + * 根据部门Id查询 + * @param page + * @param departId 部门id + * @param username 用户账户名称 + * @return + */ @Override public IPage getUserByDepId(Page page, String departId,String username) { return userMapper.getUserByDepId(page, departId,username); @@ -245,7 +256,7 @@ public class SysUserServiceImpl extends ServiceImpl impl public Map getDepNamesByUserIds(List userIds) { List list = this.baseMapper.getDepNamesByUserIds(userIds); - Map res = new HashMap(); + Map res = new HashMap(5); list.forEach(item -> { if (res.get(item.getUserId()) == null) { res.put(item.getUserId(), item.getDepartName()); @@ -278,7 +289,13 @@ public class SysUserServiceImpl extends ServiceImpl impl return result; } - // 根据角色Id查询 + /** + * 根据角色Id查询 + * @param page + * @param roleId 角色id + * @param username 用户账户名称 + * @return + */ @Override public IPage getUserByRoleId(Page page, String roleId, String username) { return userMapper.getUserByRoleId(page,roleId,username); @@ -304,7 +321,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void addUserWithDepart(SysUser user, String selectedParts) { // this.save(user); //保存角色的时候已经添加过一次了 if(oConvertUtils.isNotEmpty(selectedParts)) { @@ -321,7 +338,8 @@ public class SysUserServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) public void editUserWithDepart(SysUser user, String departs) { - this.updateById(user); //更新角色的时候已经更新了一次了,可以再跟新一次 + //更新角色的时候已经更新了一次了,可以再跟新一次 + this.updateById(user); String[] arr = {}; if(oConvertUtils.isNotEmpty(departs)){ arr = departs.split(","); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java index e596e147..88530823 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java @@ -3,6 +3,7 @@ package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.jeecg.dingtalk.api.base.JdtBaseAPI; import com.jeecg.dingtalk.api.core.response.Response; import com.jeecg.dingtalk.api.core.vo.AccessToken; @@ -31,6 +32,7 @@ import org.jeecg.config.thirdapp.ThirdAppConfig; import org.jeecg.config.thirdapp.ThirdAppTypeItemVo; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; +import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.model.ThirdLoginModel; import org.jeecg.modules.system.service.*; @@ -49,6 +51,7 @@ import java.util.stream.Collectors; /** * 第三方App对接:钉钉实现类 + * @author: jeecg-boot */ @Slf4j @Service @@ -56,11 +59,10 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @Autowired ThirdAppConfig thirdAppConfig; - @Autowired private ISysDepartService sysDepartService; @Autowired - private ISysUserService sysUserService; + private SysUserMapper userMapper; @Autowired private ISysThirdAccountService sysThirdAccountService; @Autowired @@ -70,7 +72,9 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @Autowired private SysAnnouncementSendMapper sysAnnouncementSendMapper; - // 第三方APP类型,当前固定为 dingtalk + /** + * 第三方APP类型,当前固定为 dingtalk + */ public final String THIRD_TYPE = ThirdAppConfig.DINGTALK.toLowerCase(); @Override @@ -142,7 +146,14 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { return syncInfo; } - // 递归同步部门到本地 + /** + * 递归同步部门到本地 + * @param sysDepartsTree + * @param departments + * @param parent + * @param accessToken + * @param syncInfo + */ public void syncDepartmentRecursion(List sysDepartsTree, List> departments, Department parent, String accessToken, SyncInfoVo syncInfo) { if (sysDepartsTree != null && sysDepartsTree.size() != 0) { for1: @@ -303,10 +314,10 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getId, (Object[]) idList); // 获取本地指定用户 - sysUsers = sysUserService.list(queryWrapper); + sysUsers = userMapper.selectList(queryWrapper); } else { // 获取本地所有用户 - sysUsers = sysUserService.list(); + sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); } // 查询钉钉所有的部门,用于同步用户和部门的关系 List allDepartment = JdtDepartmentAPI.listAll(accessToken); @@ -385,7 +396,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { } // 获取本地用户 - List sysUsersList = sysUserService.list(); + List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); // 查询钉钉所有的部门,用于同步用户和部门的关系 List allDepartment = JdtDepartmentAPI.listAll(accessToken); @@ -401,7 +412,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { // 循环到此说明用户匹配成功,进行更新操作 SysUser updateSysUser = this.dtUserToSysUser(dtUserInfo, sysUserTemp); try { - sysUserService.updateById(updateSysUser); + userMapper.updateById(updateSysUser); String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { @@ -413,7 +424,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { // 如果没有匹配到用户,则走创建逻辑 SysUser newSysUser = this.dtUserToSysUser(dtUserInfo); try { - sysUserService.save(newSysUser); + userMapper.insert(newSysUser); String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { @@ -719,6 +730,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { * @param verifyConfig * @return */ + @Override public boolean sendMessage(MessageDTO message, boolean verifyConfig) { Response response = this.sendMessageResponse(message, verifyConfig); if (response != null) { @@ -739,7 +751,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { String content = message.getContent(); int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); Message textMessage = new Message<>(agentId, new TextMessage(content)); - if (message.isToAll()) { + if (message.getToAll()) { textMessage.setTo_all_user(true); } else { String[] toUsers = message.getToUser().split(","); @@ -813,7 +825,11 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { } if(userIds!=null){ - String[] usernameList = sysUserService.userIdToUsername(Arrays.asList(userIds)).toArray(new String[]{}); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getId, userIds); + List userList = userMapper.selectList(queryWrapper); + String[] usernameList = userList.stream().map(SysUser::getUsername).toArray(String[] :: new); + // 通过第三方账号表查询出第三方userId List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(usernameList, THIRD_TYPE); List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); @@ -887,14 +903,14 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken) { String sysUserId = thirdAccount.getSysUserId(); if (oConvertUtils.isNotEmpty(sysUserId)) { - return sysUserService.getById(sysUserId); + return userMapper.selectById(sysUserId); } else { // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 if (appUser == null) { appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult(); } // 判断系统里是否有这个手机号的用户 - SysUser sysUser = sysUserService.getUserByPhone(appUser.getMobile()); + SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); if (sysUser != null) { thirdAccount.setAvatar(appUser.getAvatar()); thirdAccount.setRealname(appUser.getName()); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java index c6f1b966..02a54b04 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.jeecg.qywx.api.base.JwAccessTokenAPI; import com.jeecg.qywx.api.core.common.AccessToken; import com.jeecg.qywx.api.department.JwDepartmentAPI; @@ -26,6 +27,7 @@ import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.thirdapp.ThirdAppConfig; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; +import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.model.ThirdLoginModel; import org.jeecg.modules.system.service.*; @@ -43,6 +45,7 @@ import java.util.stream.Collectors; /** * 第三方App对接:企业微信实现类 + * @author: jeecg-boot */ @Slf4j @Service @@ -53,7 +56,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @Autowired private ISysDepartService sysDepartService; @Autowired - private ISysUserService sysUserService; + private SysUserMapper userMapper; @Autowired private ISysThirdAccountService sysThirdAccountService; @Autowired @@ -63,7 +66,9 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @Autowired private SysAnnouncementSendMapper sysAnnouncementSendMapper; - // 第三方APP类型,当前固定为 wechat_enterprise + /** + * 第三方APP类型,当前固定为 wechat_enterprise + */ public final String THIRD_TYPE = ThirdAppConfig.WECHAT_ENTERPRISE.toLowerCase(); @Override @@ -123,7 +128,12 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { return syncInfo; } - // 递归删除部门以及子部门,由于企业微信不允许删除带有成员和子部门的部门,所以需要递归删除下子部门,然后把部门成员移动端根部门下 + /** + * 递归删除部门以及子部门,由于企业微信不允许删除带有成员和子部门的部门,所以需要递归删除下子部门,然后把部门成员移动端根部门下 + * @param children + * @param accessToken + * @param ifLocal + */ private void deleteDepartRecursion(List children, String accessToken, boolean ifLocal) { for (JwDepartmentTreeVo departmentTree : children) { String depId = departmentTree.getId(); @@ -162,7 +172,13 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { } } - // 递归同步部门到第三方APP + /** + * 递归同步部门到第三方APP + * @param sysDepartsTree + * @param departments + * @param parent + * @param accessToken + */ private void syncDepartmentRecursion(List sysDepartsTree, List departments, Department parent, String accessToken) { if (sysDepartsTree != null && sysDepartsTree.size() != 0) { for1: @@ -295,10 +311,10 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getId, (Object[]) idList); // 获取本地指定用户 - sysUsers = sysUserService.list(queryWrapper); + sysUsers = userMapper.selectList(queryWrapper); } else { // 获取本地所有用户 - sysUsers = sysUserService.list(); + sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); } // 循环判断新用户和需要更新的用户 @@ -364,7 +380,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { return syncInfo; } //查询本地用户 - List sysUsersList = sysUserService.list(); + List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); // 循环判断新用户和需要更新的用户 for (User qwUser : qwUsersList) { /* @@ -381,7 +397,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { // 循环到此说明用户匹配成功,进行更新操作 SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp); try { - sysUserService.updateById(updateSysUser); + userMapper.updateById(updateSysUser); String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { @@ -394,7 +410,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { // 没匹配到用户则走新增逻辑 SysUser newSysUser = this.qwUserToSysUser(qwUser); try { - sysUserService.save(newSysUser); + userMapper.insert(newSysUser); String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { @@ -557,7 +573,8 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { user.setEnable(1); } } - user.setTelephone(sysUser.getTelephone());// 座机号 + // 座机号 + user.setTelephone(sysUser.getTelephone()); // --- 企业微信没有逻辑删除的功能 // update-begin--Author:sunjianlei Date:20210520 for:本地逻辑删除的用户,在企业微信里禁用 ----- if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) { @@ -639,7 +656,8 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { if (qwUser.getEnable() != null) { sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2); } - sysUser.setTelephone(qwUser.getTelephone());// 座机号 + // 座机号 + sysUser.setTelephone(qwUser.getTelephone()); // --- 企业微信没有逻辑删除的功能 // sysUser.setDelFlag() @@ -740,7 +758,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { } Text text = new Text(); text.setMsgtype("text"); - text.setTouser(this.getTouser(message.getToUser(), message.isToAll())); + text.setTouser(this.getTouser(message.getToUser(), message.getToAll())); TextEntity entity = new TextEntity(); entity.setContent(message.getContent()); text.setText(entity); @@ -779,7 +797,11 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); userIds = new String[] {sysAnnouncementSend.getUserId()}; } - List usernameList = sysUserService.userIdToUsername(Arrays.asList(userIds)); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getId, userIds); + List userList = userMapper.selectList(queryWrapper); + List usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); usernameString = String.join(",", usernameList); } @@ -863,14 +885,14 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken) { String sysUserId = thirdAccount.getSysUserId(); if (oConvertUtils.isNotEmpty(sysUserId)) { - return sysUserService.getById(sysUserId); + return userMapper.selectById(sysUserId); } else { // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 if (appUser == null) { appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); } // 判断系统里是否有这个手机号的用户 - SysUser sysUser = sysUserService.getUserByPhone(appUser.getMobile()); + SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); if (sysUser != null) { thirdAccount.setAvatar(appUser.getAvatar()); thirdAccount.setRealname(appUser.getName()); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java index 4697821c..d9e7fe4b 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java @@ -11,6 +11,7 @@ import java.util.Random; /** * 登录验证码工具类 + * @author: jeecg-boot */ public class RandImageUtil { @@ -73,7 +74,8 @@ public class RandImageUtil { byte[] bytes = byteStream.toByteArray(); //转换成base64串 String base64 = Base64.getEncoder().encodeToString(bytes).trim(); - base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n + //删除 \r\n + base64 = base64.replaceAll("\n", "").replaceAll("\r", ""); //写到指定位置 //ImageIO.write(bufferedImage, "png", new File("")); @@ -87,7 +89,8 @@ public class RandImageUtil { // 获取图形上下文 final Graphics2D graphics = (Graphics2D) image.getGraphics(); // 设定背景颜色 - graphics.setColor(Color.WHITE); // ---1 + // ---1 + graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, width, height); // 设定边框颜色 // graphics.setColor(getRandColor(100, 200)); // ---2 @@ -96,9 +99,11 @@ public class RandImageUtil { final Random random = new Random(); // 随机产生干扰线,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < count; i++) { - graphics.setColor(getRandColor(150, 200)); // ---3 + // ---3 + graphics.setColor(getRandColor(150, 200)); - final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内 + // 保证画在边框之内 + final int x = random.nextInt(width - lineWidth - 1) + 1; final int y = random.nextInt(height - lineWidth - 1) + 1; final int xl = random.nextInt(lineWidth); final int yl = random.nextInt(lineWidth); diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDepartUsersVO.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDepartUsersVO.java index 3d11f543..79d201a1 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDepartUsersVO.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDepartUsersVO.java @@ -5,6 +5,10 @@ import java.util.List; import lombok.Data; +/** + * @Description: 系统部门VO + * @author: jeecg-boot + */ @Data public class SysDepartUsersVO implements Serializable{ private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java index bd06e8ba..2bd82a82 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java @@ -7,6 +7,10 @@ import org.jeecgframework.poi.excel.annotation.ExcelCollection; import java.util.List; +/** + * @Description: 系统字典分页 + * @author: jeecg-boot + */ @Data public class SysDictPage { diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysUserRoleVO.java b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysUserRoleVO.java index 70d14efc..a9147927 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysUserRoleVO.java +++ b/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/vo/SysUserRoleVO.java @@ -5,6 +5,10 @@ import lombok.Data; import java.io.Serializable; import java.util.List; +/** + * @Description: 用户角色vo + * @author: jeecg-boot + */ @Data public class SysUserRoleVO implements Serializable{ private static final long serialVersionUID = 1L; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml index c46531e4..d8730e25 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml @@ -50,7 +50,7 @@ spring: instanceName: MyScheduler instanceId: AUTO jobStore: - class: org.quartz.impl.jdbcjobstore.JobStoreTX + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate tablePrefix: QRTZ_ isClustered: true @@ -92,6 +92,9 @@ spring: # 设置静态文件路径,js,css等 mvc: static-path-pattern: /** + #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher + pathmatch: + matching-strategy: ant_path_matcher resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: @@ -173,15 +176,13 @@ mybatis-plus: #jeecg专用配置 minidao : base-package: org.jeecg.modules.jmreport.* - #DB类型(mysql | postgresql | oracle | sqlserver| other) - db-type: mysql jeecg : # 是否启用安全模式 safeMode: false # 签名密钥串(前后端要一致,正式发布请自行修改) signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a # 本地:local\Minio:minio\阿里云:alioss - uploadType: minio + uploadType: local path : #文件上传根目录 设置 upload: /opt/upFiles @@ -226,6 +227,13 @@ jeecg : is_verify_token: true #必须校验方法 verify_methods: remove,delete,save,add,update + #自定义项目前缀 + customPrePath: + pageSize: + - 10 + - 20 + - 30 + - 40 #Wps在线文档 wps: domain: https://wwo.wps.cn/office/ diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml index e185687c..8f557c04 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml @@ -50,7 +50,7 @@ spring: instanceName: MyScheduler instanceId: AUTO jobStore: - class: org.quartz.impl.jdbcjobstore.JobStoreTX + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate tablePrefix: QRTZ_ isClustered: true @@ -92,6 +92,9 @@ spring: # 设置静态文件路径,js,css等 mvc: static-path-pattern: /** + #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher + pathmatch: + matching-strategy: ant_path_matcher resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-test.yml b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-test.yml index 9698b34e..25531525 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-test.yml +++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/application-test.yml @@ -50,7 +50,7 @@ spring: instanceName: MyScheduler instanceId: AUTO jobStore: - class: org.quartz.impl.jdbcjobstore.JobStoreTX + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate tablePrefix: QRTZ_ isClustered: true @@ -92,6 +92,9 @@ spring: # 设置静态文件路径,js,css等 mvc: static-path-pattern: /** + #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher + pathmatch: + matching-strategy: ant_path_matcher resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/banner.txt b/jeecg-boot/jeecg-boot-module-system/src/main/resources/banner.txt index 75c70b15..21783e00 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/banner.txt +++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/banner.txt @@ -9,6 +9,6 @@ ${AnsiColor.BRIGHT_BLUE} ${AnsiColor.BRIGHT_GREEN} -Jeecg Boot Version: 3.1.0 +Jeecg Boot Version: 3.2.0 Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version} ${AnsiColor.BLACK} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei index 44a5fbdc..b703fa84 100644 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei +++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -165,9 +165,9 @@ -