From 70847d17f10a513a212348ab83806de1d7dd240c Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Sat, 23 Mar 2024 21:22:29 +0800 Subject: [PATCH 01/73] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=A7=AF=E6=9C=A8?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90d46a27b..94176c3ee 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.9.6 - 1.7.2-beta + 1.7.3 2.11.0 2.6 2.1.0 From f3cf90bd28acd6b49d656c9f8c4188254fc3d858 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 25 Mar 2024 09:42:33 +0800 Subject: [PATCH 02/73] =?UTF-8?q?=E5=9C=A8=E7=A7=9F=E6=88=B7=E4=B8=8D?= =?UTF-8?q?=E9=9A=94=E7=A6=BB=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E9=83=A8=E9=97=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/modules/system/controller/SysDepartController.java | 3 ++- .../org/jeecg/modules/system/service/ISysDepartService.java | 2 +- .../modules/system/service/impl/SysDepartServiceImpl.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index a529ada64..f9fa6e411 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -365,7 +365,8 @@ public class SysDepartController { //} //}); //step.2 组装导出数据 - List sysDepartExportVos = sysDepartService.getExportDepart(sysDepart.getTenantId()); + Integer tenantId = sysDepart == null ? null : sysDepart.getTenantId(); + List sysDepartExportVos = sysDepartService.getExportDepart(tenantId); //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表"); mv.addObject(NormalExcelConstants.CLASS, SysDepartExportVo.class); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index a22273eda..04caf35ea 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -223,7 +223,7 @@ public interface ISysDepartService extends IService{ * @param tenantId * @return */ - List getExportDepart(int tenantId); + List getExportDepart(Integer tenantId); /** * 导出系统部门excel diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index 7c58ffc75..edbc814ba 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -1220,7 +1220,7 @@ public class SysDepartServiceImpl extends ServiceImpl getExportDepart(int tenantId) { + public List getExportDepart(Integer tenantId) { //获取父级部门 List parentDepart = departMapper.getSysDepartList("", tenantId); //子部门 From e3e1cd6b0d2e1d8046ebf12a00213d8d5db84f09 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Mon, 25 Mar 2024 16:27:53 +0800 Subject: [PATCH 03/73] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20#5936?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90d46a27b..35910f824 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 3.5.3.1 4.1.3 - 1.2.19 + 1.2.22 1.9.6 From c9c6dd5c1dd096434f7eb79ba54b050c352aac88 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Thu, 28 Mar 2024 14:44:24 +0800 Subject: [PATCH 04/73] =?UTF-8?q?Online=E8=A1=A8=E5=8D=95=E4=B8=AD=20?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E6=90=9C=E7=B4=A2=E6=A1=86=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=97=B6=E6=8A=A5sql=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84SQL=E5=A4=9A=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=20=E2=80=9Cand"=20#5978=20=E5=AD=97=E5=85=B8=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E5=BC=82=E6=AD=A5=E5=87=BA=E9=94=99=20#1108?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysDictServiceImpl.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index efa3f5bd8..db94bd7fa 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -21,6 +21,7 @@ import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.system.vo.DictModelMany; import org.jeecg.common.system.vo.DictQuery; import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.SqlInjectionUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; @@ -67,6 +68,9 @@ public class SysDictServiceImpl extends ServiceImpl impl @Lazy @Autowired private ISysBaseAPI sysBaseAPI; + @Lazy + @Autowired + private RedisUtil redisUtil; @Override public boolean duplicateCheckData(DuplicateCheckVo duplicateCheckVo) { @@ -565,16 +569,17 @@ public class SysDictServiceImpl extends ServiceImpl impl } //下拉搜索组件 支持传入排序信息 查询排序 - if(oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)){ - filterSql += sqlWhere + sqlAnd + condition + sqlAnd + keywordSql; - }else if(oConvertUtils.isNotEmpty(condition)){ - filterSql += sqlWhere + sqlAnd + condition; - }else if(oConvertUtils.isNotEmpty(keywordSql)){ - filterSql += sqlWhere + sqlAnd + keywordSql; - } else if (tableHasWhere){ - filterSql += sqlWhere; - } - + //update-begin---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ + if (oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)) { + filterSql += sqlWhere + (tableHasWhere ? sqlAnd : " ") + condition + sqlAnd + keywordSql; + } else if (oConvertUtils.isNotEmpty(condition)) { + filterSql += sqlWhere + (tableHasWhere ? sqlAnd : " ") + condition; + } else if (oConvertUtils.isNotEmpty(keywordSql)) { + filterSql += sqlWhere + (tableHasWhere ? sqlAnd : " ") + keywordSql; + } else if (tableHasWhere) { + filterSql += sqlWhere; + } + //update-end---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ // 增加排序逻辑 if (oConvertUtils.isNotEmpty(orderField)) { filterSql += " order by " + orderField + " " + orderType; @@ -818,6 +823,8 @@ public class SysDictServiceImpl extends ServiceImpl impl sysDict.setId(id); baseMapper.updateById(sysDict); this.updateDictItem(id,sysDictVo.getDictItemsList()); + // 删除字典缓存 + redisUtil.removeAll(CacheConstant.SYS_DICT_CACHE + "::" + dict.getDictCode()); } /** From ac93bf7d6b5ea5d334aaed3c6b7a86da4bc3bd08 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 1 Apr 2024 13:47:48 +0800 Subject: [PATCH 05/73] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=A7=AF=E6=9C=A8?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=88=B01.7.4=EF=BC=8C=E5=8D=87=E7=BA=A7drui?= =?UTF-8?q?d=E5=88=B01.2.22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-module-system/jeecg-system-biz/pom.xml | 6 ++++++ pom.xml | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml index f391a3332..14d2ede35 100644 --- a/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-module-system/jeecg-system-biz/pom.xml @@ -33,6 +33,12 @@ org.jeecgframework.jimureport jimureport-spring-boot-starter + + + jsqlparser + com.github.jsqlparser + + org.jeecgframework.jimureport diff --git a/pom.xml b/pom.xml index 94176c3ee..23d937e93 100644 --- a/pom.xml +++ b/pom.xml @@ -53,11 +53,11 @@ 3.5.3.1 4.1.3 - 1.2.19 - 1.9.6 + 1.2.22 + 1.9.10 - 1.7.3 + 1.7.4 2.11.0 2.6 2.1.0 From ab49983759c71092910070e57838dd9bfa42e427 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Wed, 3 Apr 2024 09:44:01 +0800 Subject: [PATCH 06/73] =?UTF-8?q?=E5=9B=9E=E6=BB=9Adruid=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=EF=BC=8C=E5=AF=BC=E8=87=B4=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E2=80=9C=E8=A7=92=E8=89=B2=E5=8A=9F=E8=83=BD=E6=8A=A5=E9=94=99?= =?UTF-8?q?=EF=BC=8C=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E3=80=82=20#6070=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-module-system/jeecg-system-biz/pom.xml | 4 ++++ pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml index 14d2ede35..e111cedaa 100644 --- a/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-module-system/jeecg-system-biz/pom.xml @@ -34,6 +34,10 @@ org.jeecgframework.jimureport jimureport-spring-boot-starter + + druid + com.alibaba + jsqlparser com.github.jsqlparser diff --git a/pom.xml b/pom.xml index 23d937e93..3df21af72 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 3.5.3.1 4.1.3 - 1.2.22 + 1.2.19 1.9.10 From 6edef14f07aac58430451652f576ecdc41d77ed1 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Wed, 3 Apr 2024 11:18:47 +0800 Subject: [PATCH 07/73] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20#6070?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/test/mapper/xml/JeecgDemoMapper.xml | 5 +- .../system/mapper/xml/SysDepartMapper.xml | 8 +-- .../system/mapper/xml/SysDictMapper.xml | 60 +++++++++---------- .../system/mapper/xml/SysPermissionMapper.xml | 19 +++--- .../system/mapper/xml/SysRoleMapper.xml | 19 +++--- 5 files changed, 57 insertions(+), 54 deletions(-) diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml index 95d5da9a4..572db9254 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml @@ -9,7 +9,10 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml index 597d677a3..b0b83ae30 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml @@ -161,11 +161,6 @@ \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml index ae0c60ae9..95165367a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml @@ -127,41 +127,41 @@ ${pidField} as parentId from ${table} - where - - - - - ${pidField} = #{pid} - - - (${pidField} = '' OR ${pidField} IS NULL) - - - - - - 1 = 1 - + + + - - and tenant_id = #{value} + + ${pidField} = #{pid} - and ${key} LIKE #{value} + (${pidField} = '' OR ${pidField} IS NULL) - - - - - and ${pidField} = #{pid} - - - and (${pidField} = '' OR ${pidField} IS NULL) - - - + + + + + + + and tenant_id = #{value} + + + and ${key} LIKE #{value} + + + + + + + and ${pidField} = #{pid} + + + and (${pidField} = '' OR ${pidField} IS NULL) + + + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml index 104d79a97..29a52b715 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml @@ -28,15 +28,16 @@ ,icon ,is_leaf FROM sys_permission - WHERE 1=1 - - - AND parent_id = #{parentId,jdbcType=VARCHAR} - - - AND parent_id is null - - + + + + AND parent_id = #{parentId,jdbcType=VARCHAR} + + + AND parent_id is null + + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml index fe9098247..ec02bfc82 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml @@ -4,15 +4,16 @@ From eed3bc346d1967d73fdd506d2399d152396c46d8 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Wed, 3 Apr 2024 16:01:39 +0800 Subject: [PATCH 08/73] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=8D=87=E7=BA=A7druid?= =?UTF-8?q?=201.2.22=E7=89=88=E6=9C=AC=E5=85=BC=E5=AE=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg-system-start/src/main/resources/application-dev.yml | 2 +- .../jeecg-system-start/src/main/resources/application-prod.yml | 2 +- .../jeecg-system-start/src/main/resources/application-test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 3acf0b050..f6952ebda 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 0003ed039..8faf8dd96 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml index 299700312..8185c5206 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true From c9b92decaf41f572b1e6b8c6b7558ab88af00fb0 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Wed, 3 Apr 2024 16:04:23 +0800 Subject: [PATCH 09/73] =?UTF-8?q?Revert=20"=E5=A4=84=E7=90=86=E5=8D=87?= =?UTF-8?q?=E7=BA=A7druid=201.2.22=E7=89=88=E6=9C=AC=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=A4=84=E7=90=86"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit eed3bc346d1967d73fdd506d2399d152396c46d8. --- .../jeecg-system-start/src/main/resources/application-dev.yml | 2 +- .../jeecg-system-start/src/main/resources/application-prod.yml | 2 +- .../jeecg-system-start/src/main/resources/application-test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index f6952ebda..3acf0b050 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,slf4j + filters: stat,wall,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 8faf8dd96..0003ed039 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,slf4j + filters: stat,wall,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml index 8185c5206..299700312 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml @@ -151,7 +151,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,slf4j + filters: stat,wall,slf4j # 打开mergeSql功能;慢SQL记录 stat: merge-sql: true From ee4ff35c90cb8cfe256a58679407efa3a94fbaab Mon Sep 17 00:00:00 2001 From: EightMonth Date: Wed, 3 Apr 2024 16:04:29 +0800 Subject: [PATCH 10/73] =?UTF-8?q?Revert=20"=E4=BF=AE=E5=A4=8D=20#6070"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6edef14f07aac58430451652f576ecdc41d77ed1. --- .../demo/test/mapper/xml/JeecgDemoMapper.xml | 5 +- .../system/mapper/xml/SysDepartMapper.xml | 8 ++- .../system/mapper/xml/SysDictMapper.xml | 60 +++++++++---------- .../system/mapper/xml/SysPermissionMapper.xml | 19 +++--- .../system/mapper/xml/SysRoleMapper.xml | 19 +++--- 5 files changed, 54 insertions(+), 57 deletions(-) diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml index 572db9254..95d5da9a4 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml @@ -9,10 +9,7 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml index b0b83ae30..597d677a3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml @@ -161,6 +161,11 @@ \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml index 95165367a..ae0c60ae9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml @@ -127,41 +127,41 @@ ${pidField} as parentId from ${table} - - - + where + + + + + ${pidField} = #{pid} + + + (${pidField} = '' OR ${pidField} IS NULL) + + + + + + 1 = 1 + - - ${pidField} = #{pid} + + and tenant_id = #{value} - (${pidField} = '' OR ${pidField} IS NULL) + and ${key} LIKE #{value} - - - - - - - and tenant_id = #{value} - - - and ${key} LIKE #{value} - - - - - - - and ${pidField} = #{pid} - - - and (${pidField} = '' OR ${pidField} IS NULL) - - - - + + + + + and ${pidField} = #{pid} + + + and (${pidField} = '' OR ${pidField} IS NULL) + + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml index 29a52b715..104d79a97 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml @@ -28,16 +28,15 @@ ,icon ,is_leaf FROM sys_permission - - - - AND parent_id = #{parentId,jdbcType=VARCHAR} - - - AND parent_id is null - - - + WHERE 1=1 + + + AND parent_id = #{parentId,jdbcType=VARCHAR} + + + AND parent_id is null + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml index ec02bfc82..fe9098247 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml @@ -4,16 +4,15 @@ From 4fed40ff7d2701370268df24d04ee9845908103f Mon Sep 17 00:00:00 2001 From: EightMonth <1099139462@qq.com> Date: Wed, 3 Apr 2024 16:06:04 +0800 Subject: [PATCH 11/73] Update pom.xml --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0dad6ad2d..26aca9b84 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,6 @@ 1.2.22 1.9.10 - 1.7.4 2.11.0 @@ -566,4 +565,4 @@ - \ No newline at end of file + From 7e71fa26d700c9799012b9a475e99add6bb90343 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Mon, 8 Apr 2024 13:11:55 +0800 Subject: [PATCH 12/73] =?UTF-8?q?=E5=8D=87=E7=BA=A7druid=20v1.2.22?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=85=BC=E5=AE=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/config/WallConfigRegister.java | 47 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 2 + 2 files changed, 49 insertions(+) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java create mode 100644 jeecg-boot-base-core/src/main/resources/META-INF/spring.factories diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java new file mode 100644 index 000000000..e165b59b0 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java @@ -0,0 +1,47 @@ +package org.jeecg.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringApplicationRunListener; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertySource; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author eightmonth@qq.com + * @date 2024/4/8 11:37 + */ +public class WallConfigRegister implements SpringApplicationRunListener { + + public SpringApplication application; + + private String[] args; + + + /** + * 必备,否则启动报错 + * @param application + * @param args + */ + public WallConfigRegister(SpringApplication application, String[] args) { + this.application = application; + this.args = args; + } + + @Override + public void contextLoaded(ConfigurableApplicationContext context) { + ConfigurableEnvironment env = context.getEnvironment(); + Map props = new HashMap<>(); + props.put("spring.datasource.dynamic.druid.wall.selectWhereAlwayTrueCheck", false); + + MutablePropertySources propertySources = env.getPropertySources(); + + PropertySource> propertySource = new MapPropertySource("jeecg-datasource-config", props); + + propertySources.addLast(propertySource); + } +} \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..5f73e208c --- /dev/null +++ b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.SpringApplicationRunListener=\ +org.jeecg.config.WallConfigRegister \ No newline at end of file From b69a716b04ed0533f24ed36fccb0f44bfac69bc7 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Mon, 8 Apr 2024 13:45:27 +0800 Subject: [PATCH 13/73] =?UTF-8?q?=E4=BF=AE=E6=94=B9druid=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{WallConfigRegister.java => DruidWallConfigRegister.java} | 4 ++-- .../src/main/resources/META-INF/spring.factories | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename jeecg-boot-base-core/src/main/java/org/jeecg/config/{WallConfigRegister.java => DruidWallConfigRegister.java} (89%) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java similarity index 89% rename from jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java rename to jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java index e165b59b0..049d42105 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WallConfigRegister.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java @@ -15,7 +15,7 @@ import java.util.Map; * @author eightmonth@qq.com * @date 2024/4/8 11:37 */ -public class WallConfigRegister implements SpringApplicationRunListener { +public class DruidWallConfigRegister implements SpringApplicationRunListener { public SpringApplication application; @@ -27,7 +27,7 @@ public class WallConfigRegister implements SpringApplicationRunListener { * @param application * @param args */ - public WallConfigRegister(SpringApplication application, String[] args) { + public DruidWallConfigRegister(SpringApplication application, String[] args) { this.application = application; this.args = args; } diff --git a/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories index 5f73e208c..8ba71de9f 100644 --- a/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories +++ b/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.SpringApplicationRunListener=\ -org.jeecg.config.WallConfigRegister \ No newline at end of file +org.jeecg.config.DruidWallConfigRegister \ No newline at end of file From dbc3f13c657b2a7ba2ea62cb1ce17be47148e7f9 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 8 Apr 2024 14:03:27 +0800 Subject: [PATCH 14/73] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/config/DruidWallConfigRegister.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java index 049d42105..ca6b936a5 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java @@ -12,6 +12,8 @@ import java.util.HashMap; import java.util.Map; /** + * 启动程序修改DruidWallConfig配置 + * 允许SELECT语句的WHERE子句是一个永真条件 * @author eightmonth@qq.com * @date 2024/4/8 11:37 */ From c117abb2d455787887600c9d41928ebea2777215 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 8 Apr 2024 14:23:49 +0800 Subject: [PATCH 15/73] =?UTF-8?q?=E5=8D=87=E7=BA=A7druid=E5=88=B01.2.22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 678fa5b30..26aca9b84 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 3.5.3.1 4.1.3 - 1.2.19 + 1.2.22 1.9.10 From 3091d5b6f0ab50e7e28058d4c1c05ca0e8c78f27 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 8 Apr 2024 15:03:13 +0800 Subject: [PATCH 16/73] =?UTF-8?q?=E7=BC=A9=E5=B0=8FIgnoreAuth=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E6=89=AB=E6=8F=8F=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/config/shiro/ShiroConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 602259a86..f226864f6 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -48,7 +48,7 @@ import java.util.*; @Slf4j @Configuration // 免认证注解 @IgnoreAuth 注解生效范围配置 -@ComponentScan(basePackages = {"org.jeecg"}) +@ComponentScan(basePackages = {"org.jeecg.**.controller"}) public class ShiroConfig { @Resource From 7b06715bffbd41228c4511b05b334cb1532750dc Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Thu, 11 Apr 2024 11:13:39 +0800 Subject: [PATCH 17/73] =?UTF-8?q?=E6=8E=92=E9=99=A4minidao=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E4=BE=9D=E8=B5=96jsqlparser=E5=92=8Cdruid=EF=BC=8C?= =?UTF-8?q?=E6=80=BB=E4=B8=8Emybatisplus=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-module-system/jeecg-system-biz/pom.xml | 14 ++---------- pom.xml | 24 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml index e111cedaa..571652cbf 100644 --- a/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-module-system/jeecg-system-biz/pom.xml @@ -29,25 +29,15 @@ org.jeecgframework jeewx-api - + org.jeecgframework.jimureport jimureport-spring-boot-starter - - - druid - com.alibaba - - - jsqlparser - com.github.jsqlparser - - + org.jeecgframework.jimureport jimureport-drag - 2.0.1 @@ -395,6 +405,14 @@ autopoi-web org.jeecgframework + + druid + com.alibaba + + + jsqlparser + com.github.jsqlparser + @@ -402,6 +420,12 @@ jimureport-nosql-starter 1.6.0 + + + org.jeecgframework.jimureport + jimureport-drag + 2.0.1 + org.jeecgframework.boot From f1496b5084ced263f74e76039125c6596287cd0e Mon Sep 17 00:00:00 2001 From: EightMonth Date: Fri, 12 Apr 2024 10:16:30 +0800 Subject: [PATCH 18/73] =?UTF-8?q?rocketmq-starter=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=BE=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg-system-cloud-start/pom.xml | 6 ++ .../jeecg-cloud-test-rocketmq/pom.xml | 22 +++++++ .../test/rocketmq/constant/CloudConstant.java | 28 +++++++++ .../controller/JeecgMqTestController.java | 61 +++++++++++++++++++ .../test/rocketmq/event/DemoBusEvent.java | 29 +++++++++ .../rocketmq/listener/HelloReceiver1.java | 27 ++++++++ .../rocketmq/listener/HelloReceiver2.java | 27 ++++++++ .../rocketmq/listener/HelloReceiver3.java | 27 ++++++++ .../rocketmq/listener/HelloTimeReceiver.java | 24 ++++++++ .../jeecg-visual/jeecg-cloud-test/pom.xml | 1 + pom.xml | 6 ++ 11 files changed, 258 insertions(+) create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/constant/CloudConstant.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/event/DemoBusEvent.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver1.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver2.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver3.java create mode 100644 jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloTimeReceiver.java diff --git a/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml b/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml index e444422b3..e4387cd25 100644 --- a/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml +++ b/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml @@ -49,6 +49,12 @@ jeecg-cloud-test-rabbitmq ${jeecgboot.version} --> + + + + org.jeecgframework.boot + jeecg-boot-starter-rocketmq + + + + \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/constant/CloudConstant.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/constant/CloudConstant.java new file mode 100644 index 000000000..bb60ac959 --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/constant/CloudConstant.java @@ -0,0 +1,28 @@ +package org.jeecg.modules.test.rocketmq.constant; + +/** + * 微服务单元测试常量定义 + * @author: zyf + * @date: 2022/04/21 + */ +public interface CloudConstant { + + + /** + * MQ测试队列名字 + */ + public final static String MQ_JEECG_PLACE_ORDER = "jeecg_place_order"; + public final static String MQ_JEECG_PLACE_ORDER_TIME = "jeecg_place_order_time"; + + /** + * MQ测试消息总线 + */ + public final static String MQ_DEMO_BUS_EVENT = "demoBusEvent"; + + /** + * 分布式锁lock key + */ + public final static String REDISSON_DEMO_LOCK_KEY1 = "demoLockKey1"; + public final static String REDISSON_DEMO_LOCK_KEY2 = "demoLockKey2"; + +} diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java new file mode 100644 index 000000000..b42bcbf12 --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java @@ -0,0 +1,61 @@ +package org.jeecg.modules.test.rocketmq.controller; + + +import cn.hutool.core.util.RandomUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +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.servlet.http.HttpServletRequest; + + +/** + * RocketMqClient发送消息 + * @author: zyf + * @date: 2022/04/21 + */ +@RestController +@RequestMapping("/sys/test") +@Api(tags = "【微服务】MQ单元测试") +public class JeecgMqTestController { + + @Autowired + private RabbitMqClient rabbitMqClient; + + + /** + * 测试方法:快速点击发送MQ消息 + * 观察三个接受者如何分配处理消息:HelloReceiver1、HelloReceiver2、HelloReceiver3,会均衡分配 + * + * @param req + * @return + */ + @GetMapping(value = "/rocketmq") + @ApiOperation(value = "测试rocketmq", notes = "测试rocketmq") + public Result rabbitMqClientTest(HttpServletRequest req) { + //rabbitmq消息队列测试 + BaseMap map = new BaseMap(); + map.put("orderId", RandomUtil.randomNumbers(10)); + rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map); + rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, map,2); + return Result.OK("MQ发送消息成功"); + } + + @GetMapping(value = "/rocketmq2") + @ApiOperation(value = "rocketmq消息总线测试", notes = "rocketmq消息总线测试") + public Result rabbitmq2(HttpServletRequest req) { + + //rabbitmq消息总线测试 + BaseMap params = new BaseMap(); + params.put("orderId", "123456"); + rabbitMqClient.publishEvent(CloudConstant.MQ_DEMO_BUS_EVENT, params); + return Result.OK("MQ发送消息成功"); + } +} diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/event/DemoBusEvent.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/event/DemoBusEvent.java new file mode 100644 index 000000000..76d248d49 --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/event/DemoBusEvent.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.test.rocketmq.event; + +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.boot.starter.rabbitmq.event.EventObj; +import org.jeecg.boot.starter.rabbitmq.event.JeecgBusEventHandler; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +import org.springframework.stereotype.Component; + +/** + * 消息处理器【发布订阅】 + * @author: zyf + * @date: 2022/04/21 + */ +@Slf4j +@Component(CloudConstant.MQ_DEMO_BUS_EVENT) +public class DemoBusEvent implements JeecgBusEventHandler { + + + @Override + public void onMessage(EventObj obj) { + if (ObjectUtil.isNotEmpty(obj)) { + BaseMap baseMap = obj.getBaseMap(); + String orderId = baseMap.get("orderId"); + log.info("业务处理----订单ID:" + orderId); + } + } +} diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver1.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver1.java new file mode 100644 index 000000000..2a3b07c0e --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver1.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.test.rocketmq.listener; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +import org.springframework.stereotype.Component; + +/** + * 定义接收者(可以定义N个接受者,消息会均匀的发送到N个接收者中) + * + * RabbitMq接受者1 + * (@RabbitListener声明类上,一个类只能监听一个队列) + * @author: zyf + * @date: 2022/04/21 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = "helloReceiver1") +public class HelloReceiver1 implements RocketMQListener { + + public void onMessage(BaseMap baseMap) { + log.info("helloReceiver1接收消息:" + baseMap); + } + +} \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver2.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver2.java new file mode 100644 index 000000000..c9fb1b134 --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver2.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.test.rocketmq.listener;//package org.jeecg.modules.cloud.rabbitmq; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +import org.springframework.stereotype.Component; + +/** + * 定义接收者(可以定义N个接受者,消息会均匀的发送到N个接收者中) + * + * RabbitMq接受者2 + * (@RabbitListener声明类上,一个类只能监听一个队列) + * @author: zyf + * @date: 2022/04/21 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = "helloReceiver2") +public class HelloReceiver2 implements RocketMQListener { + + public void onMessage(BaseMap baseMap) { + log.info("helloReceiver2接收消息:" + baseMap); + } + +} \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver3.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver3.java new file mode 100644 index 000000000..3362b796e --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver3.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.test.rocketmq.listener;//package org.jeecg.modules.cloud.rabbitmq; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +import org.springframework.stereotype.Component; + +/** + * 定义接收者(可以定义N个接受者,消息会均匀的发送到N个接收者中) + * + * RabbitMq接受者3【我是处理人3】 + * (@RabbitListener声明类方法上,一个类可以多监听多个队列) + * @author: zyf + * @date: 2022/04/21 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = "helloReceiver3") +public class HelloReceiver3 implements RocketMQListener { + + public void onMessage(BaseMap baseMap) { + log.info("helloReceiver3接收消息:" + baseMap); + } + +} \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloTimeReceiver.java b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloTimeReceiver.java new file mode 100644 index 000000000..3e6dfe78a --- /dev/null +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloTimeReceiver.java @@ -0,0 +1,24 @@ +package org.jeecg.modules.test.rocketmq.listener; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.jeecg.common.base.BaseMap; +import org.jeecg.modules.test.rocketmq.constant.CloudConstant; +import org.springframework.stereotype.Component; + +/** + * 定义接收者(可以定义N个接受者,消息会均匀的发送到N个接收者中) + * @author: zyf + * @date: 2022/04/21 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, consumerGroup = "helloTimeReceiver") +public class HelloTimeReceiver implements RocketMQListener { + + public void onMessage(BaseMap baseMap) { + log.info("helloTimeReceiver接收消息:" + baseMap); + } + +} \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml index dd27b9449..097532a20 100644 --- a/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml +++ b/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml @@ -24,5 +24,6 @@ jeecg-cloud-test-more jeecg-cloud-test-rabbitmq jeecg-cloud-test-seata + jeecg-cloud-test-rocketmq \ No newline at end of file diff --git a/pom.xml b/pom.xml index d8750a366..2885d4b71 100644 --- a/pom.xml +++ b/pom.xml @@ -225,6 +225,12 @@ jeecg-boot-starter-rabbitmq ${jeecgboot.version} + + + org.jeecgframework.boot + jeecg-boot-starter-rocketmq + ${jeecgboot.version} + org.jeecgframework.boot From 200adb84908d057e1a7f8e8a3e994f718268bbac Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Fri, 12 Apr 2024 15:42:37 +0800 Subject: [PATCH 19/73] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8=E7=94=9F=E6=88=90=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=8C=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=B6=E6=8A=A5=E9=94=99=EF=BC=8C=E5=9C=A8=E5=BE=88=E8=80=81?= =?UTF-8?q?=E7=9A=84jeecg,vue2=E7=89=88=E6=9C=AC=E5=B0=B1=E5=9C=A8?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BA=86=20#6043?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../${entityPackage}/vue3/${entityName}List.vuei | 2 +- .../${entityPackage}/vue3Native/${entityName}List.vuei | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei index 0278445df..53a4d00a6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -217,7 +217,7 @@ * 批量删除事件 */ async function batchHandleDelete() { - const ids = selectedRowKeys.value.filter(item => !item.includes('loading')) + const ids = selectedRowKeys.value.filter(item => !item.includes('loadChild')) await batchDelete${entityName}({id: ids}, importSuccess); } /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei index 4e6fe235d..d49052b65 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -261,7 +261,7 @@ * 批量删除事件 */ async function batchHandleDelete() { - const ids = selectedRowKeys.value.filter((item) => !item.includes('loading')); + const ids = selectedRowKeys.value.filter((item) => !item.includes('loadChild')); await batchDelete${entityName}({ id: ids }, success); } From 78f048fda5673dea6af993497abae80470799e59 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 15 Apr 2024 13:50:00 +0800 Subject: [PATCH 20/73] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0QQ=E7=BE=A4?= =?UTF-8?q?=E2=91=A8808791225?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-EN.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README-EN.md b/README-EN.md index 526e0c2b5..4ee23e421 100644 --- a/README-EN.md +++ b/README-EN.md @@ -87,7 +87,7 @@ Technical documentation - Doc: [http://help.jeecg.com](http://help.jeecg.com) - Newbie guide: [Quick start](http://www.jeecg.com/doc/quickstart) | [video](https://space.bilibili.com/454617261/channel/series) | [Q&A ](http://www.jeecg.com/doc/qa) | [help](http://jeecg.com/doc/help) | [1 minute experience](https://my.oschina.net/jeecg/blog/3083313) - Microservice Development: [Monomer upgrade to microservice](https://help.jeecg.com/java/springcloud/switchcloud/monomer.html) -- QQ group : ⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full) +- QQ group : ⑨808791225、⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full) - Demo : [Vue3](http://boot3.jeecg.com) | [Vue2](http://boot.jeecg.com) | [APP](http://jeecg.com/appIndex) > [please click obtain account password to obtain](http://jeecg.com/doc/demo) diff --git a/README.md b/README.md index 10bdedbc4..a8020093d 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Docker快速启动项目 - 在线演示 : [Vue3演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex) | [敲敲云零代码](https://qiaoqiaoyun.com) > 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取 > -- QQ交流群 : ⑧825232878、⑦791696430(满)、⑥730954414(满)、683903138(满)、⑤860162132(满)、④774126647(满)、③816531124(满)、②769925425(满)、①284271917(满) +- QQ交流群 : ⑨808791225、⑧825232878、⑦791696430(满)、⑥730954414(满)、683903138(满)、⑤860162132(满)、④774126647(满)、③816531124(满)、②769925425(满)、①284271917(满) > ` 提醒:【QQ群是自助服务群,建议给帮助您解决问题的同学发送指定红包,表示感谢!】 ` From fb95cf7f2f4beca55dd9151ef528dbd6fda0756e Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Wed, 17 Apr 2024 09:59:48 +0800 Subject: [PATCH 21/73] =?UTF-8?q?--=20=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=94=9F=E6=97=A5=E6=A0=BC=E5=BC=8F=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/jeecgboot-mysql-5.7.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/jeecgboot-mysql-5.7.sql b/db/jeecgboot-mysql-5.7.sql index 5fe2f9c0a..f1fdb48fa 100644 --- a/db/jeecgboot-mysql-5.7.sql +++ b/db/jeecgboot-mysql-5.7.sql @@ -8648,4 +8648,8 @@ INSERT INTO `tmp_report_data_income` VALUES ('中石油控股或有控股权', 3 INSERT INTO `tmp_report_data_income` VALUES ('中石油参股', 72062.45, 0.00, 0.00, 0.00, 0.00, 0.00, 72062.75); INSERT INTO `tmp_report_data_income` VALUES ('非中石油', 1486526.90, 212070.72, 0.00, 0.00, 0.00, 226415.09, 1698597.62); +-- 修复设置用户生日格式报错 +ALTER TABLE sys_user +MODIFY COLUMN birthday date NULL DEFAULT NULL COMMENT '生日'; + SET FOREIGN_KEY_CHECKS = 1; From 13d00a8bb475766fbb05b9df23ef06eb8afcd3de Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Wed, 17 Apr 2024 10:43:19 +0800 Subject: [PATCH 22/73] =?UTF-8?q?=E3=80=90issues/6113=E3=80=91online?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E7=94=9F=E6=88=90=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=20=E5=85=B3=E8=81=94=E8=A1=A8=E7=94=9F=E6=88=90vue3=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E9=87=8C=E7=9A=84=20*.data.ts=20=E8=BF=99=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BC=9A=E6=9C=89=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../${entityPackage}/vue3/${entityName}__data.tsi | 2 +- .../${entityPackage}/vue3/${entityName}__data.tsi | 2 +- .../${entityPackage}/vue3/${entityName}__data.tsi | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi index 2c893c10a..3c4eb950b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -842,7 +842,7 @@ export const superQuerySchema = { fields: { <#list sub.colums as subCol> <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> - <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && po.fieldName !='delFlag'> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> ${superQueryFieldListForVue3(subCol,subCol_index)}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi index 6bb1577a8..8cb45c881 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -783,7 +783,7 @@ export const superQuerySchema = { fields: { <#list sub.colums as subCol> <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> - <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && po.fieldName !='delFlag'> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> ${superQueryFieldListForVue3(subCol,subCol_index)}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi index 5d8dc5e7b..6c24026d1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -776,7 +776,7 @@ export const superQuerySchema = { fields: { <#list sub.colums as subCol> <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> - <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && po.fieldName !='delFlag'> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> ${superQueryFieldListForVue3(subCol,subCol_index)}, From 4dc4e87900259364a87c06966e2723e10d360277 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Sat, 20 Apr 2024 18:34:52 +0800 Subject: [PATCH 23/73] =?UTF-8?q?=E8=A7=A3=E5=86=B3SQL=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91=E5=BD=B1=E5=93=8D=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=20#6105?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/system/service/impl/SysDictServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index db94bd7fa..010bcd7d6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -84,7 +84,8 @@ public class SysDictServiceImpl extends ServiceImpl impl // 2.SQL注入check(只限制非法串改数据库) //关联表字典(举例:sys_user,realname,id) - SqlInjectionUtil.filterContent(table, fieldName); + SqlInjectionUtil.filterContent(table); + SqlInjectionUtil.filterContent(fieldName); String checkSql = table + SymbolConstant.COMMA + fieldName + SymbolConstant.COMMA; // 【QQYUN-6533】表字典白名单check @@ -268,7 +269,8 @@ public class SysDictServiceImpl extends ServiceImpl impl // 1.SQL注入校验(只限制非法串改数据库) SqlInjectionUtil.specialFilterContentForDictSql(table); - SqlInjectionUtil.filterContent(text, code); + SqlInjectionUtil.filterContent(text); + SqlInjectionUtil.filterContent(code); SqlInjectionUtil.specialFilterContentForDictSql(filterSql); String str = table+","+text+","+code; From 2fc672dfabf27e8a06bc44d3c5d613b1fbab51d4 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 22 Apr 2024 09:35:01 +0800 Subject: [PATCH 24/73] =?UTF-8?q?=E5=86=99=E9=94=99=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/config/shiro/ShiroConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index f226864f6..38b33c77e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -153,7 +153,7 @@ public class ShiroConfig { //大屏模板例子 filterChainDefinitionMap.put("/test/bigScreen/**", "anon"); filterChainDefinitionMap.put("/bigscreen/template1/**", "anon"); - filterChainDefinitionMap.put("/bigscreen/template1/**", "anon"); + filterChainDefinitionMap.put("/bigscreen/template2/**", "anon"); //filterChainDefinitionMap.put("/test/jeecgDemo/rabbitMqClientTest/**", "anon"); //MQ测试 //filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //模板页面 //filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis测试 From faebdee75508a91bbd7cb2b749c3b7a80bbb9bdf Mon Sep 17 00:00:00 2001 From: EightMonth Date: Thu, 25 Apr 2024 11:52:41 +0800 Subject: [PATCH 25/73] =?UTF-8?q?=E4=BF=AE=E5=A4=8D#6100=E3=80=81@IgnoreAu?= =?UTF-8?q?th=E6=89=AB=E6=8F=8F=E5=8A=A0=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/config/shiro/ShiroConfig.java | 83 +------------- .../jeecg/config/shiro/filters/JwtFilter.java | 5 + .../shiro/ignore/IgnoreAuthPostProcessor.java | 104 ++++++++++++++++++ .../shiro/ignore/InMemoryIgnoreAuth.java | 38 +++++++ .../org/jeecg/JeecgSystemApplication.java | 1 + .../swagger/SwaggerResourceController.java | 24 ++++ .../jeecg/JeecgSystemCloudApplication.java | 2 + 7 files changed, 176 insertions(+), 81 deletions(-) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index f226864f6..00d4151fe 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -27,6 +27,7 @@ import org.springframework.core.env.Environment; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.util.CollectionUtils; +import org.springframework.util.StopWatch; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.filter.DelegatingFilterProxy; @@ -48,7 +49,7 @@ import java.util.*; @Slf4j @Configuration // 免认证注解 @IgnoreAuth 注解生效范围配置 -@ComponentScan(basePackages = {"org.jeecg.**.controller"}) +@ComponentScan(basePackages = {"org.jeecg.**"}) public class ShiroConfig { @Resource @@ -173,16 +174,6 @@ public class ShiroConfig { // 企业微信证书排除 filterChainDefinitionMap.put("/WW_verify*", "anon"); - - // 通过注解免登录url - List ignoreAuthUrlList = collectIgnoreAuthUrl(); - if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) { - for (String url : ignoreAuthUrlList) { - filterChainDefinitionMap.put(url, "anon"); - } - } - - // 添加自己的过滤器并且取名为jwt Map filterMap = new HashMap(1); //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】 @@ -335,74 +326,4 @@ public class ShiroConfig { return manager; } - - @SneakyThrows - public List collectIgnoreAuthUrl() { - List ignoreAuthUrls = new ArrayList<>(); - ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); - provider.addIncludeFilter(new AnnotationTypeFilter(RestController.class)); - - // 获取当前类的扫描注解的配置 - Set components = new HashSet<>(); - for (String basePackage : AnnotationUtils.getAnnotation(ShiroConfig.class, ComponentScan.class).basePackages()) { - components.addAll(provider.findCandidateComponents(basePackage)); - } - - // 逐个匹配获取免认证路径 - for (BeanDefinition component : components) { - String beanClassName = component.getBeanClassName(); - Class clazz = Class.forName(beanClassName); - RequestMapping base = clazz.getAnnotation(RequestMapping.class); - String[] baseUrl = {}; - if (Objects.nonNull(base)) { - baseUrl = base.value(); - } - Method[] methods = clazz.getDeclaredMethods(); - - for (Method method : methods) { - if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(RequestMapping.class)) { - RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(GetMapping.class)) { - GetMapping requestMapping = method.getAnnotation(GetMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PostMapping.class)) { - PostMapping requestMapping = method.getAnnotation(PostMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PutMapping.class)) { - PutMapping requestMapping = method.getAnnotation(PutMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(DeleteMapping.class)) { - DeleteMapping requestMapping = method.getAnnotation(DeleteMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PatchMapping.class)) { - PatchMapping requestMapping = method.getAnnotation(PatchMapping.class); - String[] uri = requestMapping.value(); - ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); - } - } - } - - return ignoreAuthUrls; - } - - private List rebuildUrl(String[] bases, String[] uris) { - List urls = new ArrayList<>(); - for (String base : bases) { - for (String uri : uris) { - urls.add(prefix(base)+prefix(uri)); - } - } - return urls; - } - - private String prefix(String seg) { - return seg.startsWith("/") ? seg : "/"+seg; - } - } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java index 2e527c075..8f29dd28f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java @@ -8,6 +8,7 @@ import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.shiro.JwtToken; +import org.jeecg.config.shiro.ignore.InMemoryIgnoreAuth; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.RequestMethod; @@ -47,6 +48,10 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { try { + // 判断当前路径是不是注解了@IngoreAuth路径,如果是,则放开验证 + if (InMemoryIgnoreAuth.contains(((HttpServletRequest) request).getServletPath())) { + return true; + } executeLogin(request, response); return true; } catch (Exception e) { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java new file mode 100644 index 000000000..1be83b5f7 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java @@ -0,0 +1,104 @@ +package org.jeecg.config.shiro.ignore; + +import lombok.AllArgsConstructor; +import org.jeecg.config.shiro.IgnoreAuth; +import org.springframework.aop.framework.Advised; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StopWatch; +import org.springframework.web.bind.annotation.*; + +import java.lang.reflect.Method; +import java.util.*; + +/** + * 在spring boot初始化时,根据@RestController注解获取当前spring容器中的bean + * @author eightmonth@qq.com + * @date 2024/4/18 11:35 + */ +@Component +@AllArgsConstructor +public class IgnoreAuthPostProcessor implements ApplicationListener { + + private ApplicationContext applicationContext; + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + List ignoreAuthUrls = new ArrayList<>(); + if (event.getApplicationContext().getParent() == null) { + // 只处理根应用上下文的事件,避免在子上下文中重复处理 + Map restControllers = applicationContext.getBeansWithAnnotation(RestController.class); + for (Object restController : restControllers.values()) { + // 如 online系统的controller并不是spring 默认生成 + if (restController instanceof Advised) { + ignoreAuthUrls.addAll(postProcessRestController(restController)); + } + } + } + + if (!CollectionUtils.isEmpty(ignoreAuthUrls)) { + InMemoryIgnoreAuth.set(ignoreAuthUrls); + } + } + + private List postProcessRestController(Object restController) { + List ignoreAuthUrls = new ArrayList<>(); + Class clazz = ((Advised) restController).getTargetClass(); + RequestMapping base = clazz.getAnnotation(RequestMapping.class); + String[] baseUrl = Objects.nonNull(base) ? base.value() : new String[]{}; + Method[] methods = clazz.getDeclaredMethods(); + + for (Method method : methods) { + if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(RequestMapping.class)) { + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(GetMapping.class)) { + GetMapping requestMapping = method.getAnnotation(GetMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PostMapping.class)) { + PostMapping requestMapping = method.getAnnotation(PostMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PutMapping.class)) { + PutMapping requestMapping = method.getAnnotation(PutMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(DeleteMapping.class)) { + DeleteMapping requestMapping = method.getAnnotation(DeleteMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } else if (method.isAnnotationPresent(IgnoreAuth.class) && method.isAnnotationPresent(PatchMapping.class)) { + PatchMapping requestMapping = method.getAnnotation(PatchMapping.class); + String[] uri = requestMapping.value(); + ignoreAuthUrls.addAll(rebuildUrl(baseUrl, uri)); + } + } + + return ignoreAuthUrls; + } + + private List rebuildUrl(String[] bases, String[] uris) { + List urls = new ArrayList<>(); + if (bases.length > 0) { + for (String base : bases) { + for (String uri : uris) { + urls.add(prefix(base) + prefix(uri)); + } + } + } else { + Arrays.stream(uris).forEach(uri -> { + urls.add(prefix(uri)); + }); + } + return urls; + } + + private String prefix(String seg) { + return seg.startsWith("/") ? seg : "/"+seg; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java new file mode 100644 index 000000000..4c6788cb6 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java @@ -0,0 +1,38 @@ +package org.jeecg.config.shiro.ignore; + +import java.util.ArrayList; +import java.util.List; + +/** + * 使用内存存储通过@IgnoreAuth注解的url,配合JwtFilter进行免登录校验 + * PS:无法使用ThreadLocal进行存储,因为ThreadLocal装载时,JwtFilter已经初始化完毕,导致该类获取ThreadLocal为空 + * @author eightmonth@qq.com + * @date 2024/4/18 15:02 + */ +public class InMemoryIgnoreAuth { + private static final List IGNORE_AUTH_LIST = new ArrayList<>(); + + public InMemoryIgnoreAuth() {} + + public static void set(List list) { + IGNORE_AUTH_LIST.addAll(list); + } + + public static List get() { + return IGNORE_AUTH_LIST; + } + + public static void clear() { + IGNORE_AUTH_LIST.clear(); + } + + public static boolean contains(String url) { + for (String ignoreAuth : IGNORE_AUTH_LIST) { + if (url.endsWith(ignoreAuth)) { + return true; + } + } + + return false; + } +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java index 633249de9..d3c7e0919 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java @@ -2,6 +2,7 @@ package org.jeecg; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.shiro.ignore.InMemoryIgnoreAuth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java index 41424fbe0..be7667ccf 100644 --- a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java +++ b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java @@ -1,13 +1,16 @@ package org.jeecg.handler.swagger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.swagger.web.*; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; /** * swagger聚合接口,三个接口都是 doc.html需要访问的接口 @@ -19,6 +22,11 @@ import java.util.List; public class SwaggerResourceController { private MySwaggerResourceProvider swaggerResourceProvider; + @Autowired + private ApplicationContext applicationContext; + // 生产环境profile配置模型 + private static final String PRODUCTION_PROFILE_NAME = "prod*"; + @Autowired public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) { this.swaggerResourceProvider = swaggerResourceProvider; @@ -36,6 +44,22 @@ public class SwaggerResourceController { @RequestMapping public ResponseEntity> swaggerResources() { + // 如果激活的profile带有生产环境的profile,则屏蔽swagger资源 + if (isProd()) { + return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); + } return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK); } + + private boolean isProd() { + String[] profiles = applicationContext.getEnvironment().getActiveProfiles(); + Pattern pattern = Pattern.compile(PRODUCTION_PROFILE_NAME); + for (String profile : profiles) { + if (pattern.matcher(profile).find()) { + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java b/jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java index 4e37d4d8a..dc741e316 100644 --- a/jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java +++ b/jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java @@ -16,6 +16,7 @@ import org.springframework.core.env.Environment; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.EnableScheduling; +import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.UnknownHostException; @@ -35,6 +36,7 @@ public class JeecgSystemCloudApplication extends SpringBootServletInitializer im private RedisTemplate redisTemplate; @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(JeecgSystemCloudApplication.class); } From 9159b55096a1f7f88dba9e3876ff83f2673c11d5 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Fri, 26 Apr 2024 15:07:50 +0800 Subject: [PATCH 26/73] =?UTF-8?q?=E5=8F=91issue,=E8=AF=B7=E6=98=8E?= =?UTF-8?q?=E7=A1=AE=E9=82=A3=E4=B8=AA=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index bd12e72d5..1f11a10be 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,8 +1,10 @@ ##### 版本号: +##### 分支: +master?springboot3? 还是springboot3_sas -##### 前端版本:vue3版?还是 vue2版? - +##### 前端版本: +vue3版?还是 vue2版? ##### 问题描述: From d0406fcd839f934eb10b782c3997674e4160f1b3 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Sun, 28 Apr 2024 15:49:35 +0800 Subject: [PATCH 27/73] =?UTF-8?q?=E5=8F=91issue,=E8=AF=B7=E6=98=8E?= =?UTF-8?q?=E7=A1=AE=E9=82=A3=E4=B8=AA=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1f11a10be..7e38ed493 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,10 +1,9 @@ ##### 版本号: -##### 分支: -master?springboot3? 还是springboot3_sas +##### 分支: master?还是springboot3? -##### 前端版本: -vue3版?还是 vue2版? + +##### 前端版本: vue3版?还是 vue2版? ##### 问题描述: @@ -15,9 +14,9 @@ vue3版?还是 vue2版? #### 友情提示(为了提高issue处理效率): - - 未按格式要求发帖,会被直接删掉; - - 描述过于简单或模糊,导致无法处理的,会被直接删掉; + - 未按格式要求发帖、描述过于简抽象的,会被直接删掉; - 请自己初判问题描述是否清楚,是否方便我们调查处理; - 针对问题请说明是Online在线功能(需说明用的主题模板),还是生成的代码功能; + - springboot3_sas分支采用 `Spring Authorization Server` 替换 `Shiro`,目前是beta版不稳定,生产项目不要使用; From ad3d2eb3fc1ca372abd910b09d169ff40092c9b6 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Tue, 30 Apr 2024 13:49:34 +0800 Subject: [PATCH 28/73] =?UTF-8?q?=E4=BF=AE=E5=A4=8D#6169?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/common/aspect/AutoLogAspect.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java index 7738835c7..e07c9d45e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java @@ -158,6 +158,9 @@ public class AutoLogAspect { if(value!=null && value.toString().length()>length){ return false; } + if(value instanceof MultipartFile){ + return false; + } return true; } }; From fd0461644e3b96a6271a45e51beaf3eb33413af5 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Wed, 5 Jun 2024 19:05:16 +0800 Subject: [PATCH 29/73] =?UTF-8?q?=E5=85=8Dtoken=E6=B3=A8=E8=A7=A3@IgnoreAu?= =?UTF-8?q?th=E6=94=B9=E9=80=A0=E5=90=8E=EF=BC=8C=20=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E6=AD=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/config/shiro/ShiroConfig.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 2be21789a..183d9e660 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -48,8 +48,6 @@ import java.util.*; @Slf4j @Configuration -// 免认证注解 @IgnoreAuth 注解生效范围配置 -@ComponentScan(basePackages = {"org.jeecg.**"}) public class ShiroConfig { @Resource From 9db6c1a7acbaab4f814b77db2ce848b916fbf24c Mon Sep 17 00:00:00 2001 From: EightMonth Date: Thu, 6 Jun 2024 10:39:50 +0800 Subject: [PATCH 30/73] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=B1=8F=E8=94=BDswagger=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swagger/SwaggerResourceController.java | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java index be7667ccf..04ac769ab 100644 --- a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java +++ b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java @@ -1,7 +1,7 @@ package org.jeecg.handler.swagger; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,7 +10,6 @@ import springfox.documentation.swagger.web.*; import java.util.ArrayList; import java.util.List; -import java.util.regex.Pattern; /** * swagger聚合接口,三个接口都是 doc.html需要访问的接口 @@ -21,11 +20,11 @@ import java.util.regex.Pattern; @RequestMapping("/swagger-resources") public class SwaggerResourceController { private MySwaggerResourceProvider swaggerResourceProvider; - - @Autowired - private ApplicationContext applicationContext; - // 生产环境profile配置模型 - private static final String PRODUCTION_PROFILE_NAME = "prod*"; + /** + * 生产环境,关闭swagger文档 + */ + @Value("${knife4j.production:#{null}}") + private Boolean production; @Autowired public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) { @@ -44,22 +43,10 @@ public class SwaggerResourceController { @RequestMapping public ResponseEntity> swaggerResources() { - // 如果激活的profile带有生产环境的profile,则屏蔽swagger资源 - if (isProd()) { + // 是否开启生产环境屏蔽swagger + if (production != null && production) { return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); } return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK); } - - private boolean isProd() { - String[] profiles = applicationContext.getEnvironment().getActiveProfiles(); - Pattern pattern = Pattern.compile(PRODUCTION_PROFILE_NAME); - for (String profile : profiles) { - if (pattern.matcher(profile).find()) { - return true; - } - } - - return false; - } } \ No newline at end of file From a6b6e7c9d43fece7ca67e6eefc4fc85d64b8d9c7 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Tue, 11 Jun 2024 22:58:04 +0800 Subject: [PATCH 31/73] =?UTF-8?q?3.7.0=E5=A4=A7=E7=89=88=E6=9C=AC=E5=8F=91?= =?UTF-8?q?=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-EN.md | 4 +- README.md | 10 +- jeecg-boot-base-core/pom.xml | 21 +- .../java/org/jeecg/common/api/CommonAPI.java | 14 + .../java/org/jeecg/common/api/dto/LogDTO.java | 6 + .../org/jeecg/common/aspect/DictAspect.java | 7 +- .../jeecg/common/constant/CommonConstant.java | 40 +++ .../common/constant/DataBaseConstant.java | 25 +- .../common/constant/ServiceNameConstants.java | 25 +- .../common/constant/enums/CgformEnum.java | 2 +- .../enums/ClientTerminalTypeEnum.java | 23 ++ .../common/constant/enums/DateRangeEnum.java | 27 ++ .../common/constant/enums/DySmsEnum.java | 2 + .../exception/JeecgBootBizTipException.java | 40 +++ .../exception/JeecgBootExceptionHandler.java | 89 ++++++ .../system/enhance/UserFilterEnhance.java | 19 ++ .../common/system/query/QueryGenerator.java | 74 ++++- .../common/system/query/QueryRuleEnum.java | 18 +- .../org/jeecg/common/system/util/JwtUtil.java | 30 ++ .../common/system/util/ResourceUtil.java | 19 ++ .../org/jeecg/common/system/vo/LoginUser.java | 11 + .../common/system/vo/SysUserCacheInfo.java | 41 ++- .../org/jeecg/common/util/DateRangeUtils.java | 242 +++++++++++++++ .../java/org/jeecg/common/util/DateUtils.java | 54 ++++ .../org/jeecg/common/util/DySmsLimit.java | 96 ++++++ .../java/org/jeecg/common/util/IpUtils.java | 58 +++- .../jeecg/common/util/SqlInjectionUtil.java | 16 +- .../org/jeecg/common/util/TokenUtils.java | 4 + .../common/util/dynamic/db/DynamicDBUtil.java | 7 + .../org/jeecg/common/util/oConvertUtils.java | 95 +++++- .../sqlInjection/parse/ConstAnalyzer.java | 32 +- .../jeecg/config/DruidWallConfigRegister.java | 2 +- .../org/jeecg/config/WebMvcConfiguration.java | 18 +- .../interceptor/LowCodeModeInterceptor.java | 2 +- .../config/mybatis/MybatisInterceptor.java | 14 +- .../config/mybatis/MybatisPlusSaasConfig.java | 2 +- .../org/jeecg/config/shiro/IgnoreAuth.java | 6 +- .../org/jeecg/config/shiro/ShiroConfig.java | 22 +- .../org/jeecg/config/shiro/ShiroRealm.java | 2 +- .../jeecg/config/shiro/filters/JwtFilter.java | 1 + .../shiro/ignore/IgnoreAuthPostProcessor.java | 13 +- .../shiro/ignore/InMemoryIgnoreAuth.java | 2 +- .../org/jeecg/config/sign/util/HttpUtils.java | 6 +- .../base/mapper/xml/BaseCommonMapper.xml | 5 +- .../service/impl/BaseCommonServiceImpl.java | 15 +- .../org/jeecg/test/sqlparse/TestIpUtil.java | 41 +++ jeecg-module-demo/pom.xml | 2 +- .../demo/gpt/controller/ChatController.java | 2 +- .../test/controller/JeecgDemoController.java | 2 + .../jeecg-system-cloud-api/pom.xml | 2 +- .../jeecg/common/system/api/ISysBaseAPI.java | 44 ++- .../api/fallback/SysBaseAPIFallback.java | 25 ++ .../jeecg-system-local-api/pom.xml | 2 +- .../jeecg/common/system/api/ISysBaseAPI.java | 21 +- jeecg-module-system/jeecg-system-api/pom.xml | 2 +- jeecg-module-system/jeecg-system-biz/pom.xml | 7 +- .../config/init/CodeGenerateDbConfig.java | 4 + .../jimureport/JimuReportTokenService.java | 6 +- .../modules/aop/TenantPackUserLogAspect.java | 5 +- .../api/controller/SystemApiController.java | 53 +++- .../SysMessageTemplateController.java | 2 +- .../modules/message/enums/RangeDateEnum.java | 1 - .../modules/message/websocket/WebSocket.java | 10 +- .../actuator/CustomActuatorConfig.java | 38 +++ .../httptrace/CustomHttpTraceEndpoint.java | 44 +++ .../CustomInMemoryHttpTraceRepository.java | 94 ++++++ .../controller/ActuatorMemoryController.java | 52 ++++ .../controller/ActuatorRedisController.java | 15 + .../modules/monitor/service/RedisService.java | 8 + .../service/impl/RedisServiceImpl.java | 57 +++- .../controller/QuartzJobController.java | 14 +- .../system/cache/AuthStateRedisCache.java | 69 +++++ .../system/config/AuthStateConfiguration.java | 15 + .../system/controller/CommonController.java | 1 + .../system/controller/LoginController.java | 97 +++++- .../controller/SysAnnouncementController.java | 83 +++-- .../system/controller/SysDictController.java | 7 + .../system/controller/SysRoleController.java | 14 +- .../controller/SysTenantController.java | 44 ++- .../system/controller/SysUserController.java | 22 +- .../system/controller/ThirdAppController.java | 9 +- .../modules/system/entity/SysDepart.java | 2 + .../jeecg/modules/system/entity/SysLog.java | 6 + .../system/mapper/SysAnnouncementMapper.java | 11 +- .../system/mapper/SysDepartMapper.java | 8 + .../mapper/SysPackPermissionMapper.java | 8 + .../modules/system/mapper/SysRoleMapper.java | 11 +- .../system/mapper/SysTenantMapper.java | 7 + .../system/mapper/SysTenantPackMapper.java | 6 + .../mapper/SysTenantPackUserMapper.java | 14 +- .../modules/system/mapper/SysUserMapper.java | 17 ++ .../system/mapper/SysUserRoleMapper.java | 8 + .../system/mapper/SysUserTenantMapper.java | 8 + .../mapper/xml/SysAnnouncementMapper.xml | 13 +- .../system/mapper/xml/SysDepartMapper.xml | 11 + .../mapper/xml/SysPackPermissionMapper.xml | 12 +- .../system/mapper/xml/SysPermissionMapper.xml | 1 + .../system/mapper/xml/SysRoleMapper.xml | 11 +- .../system/mapper/xml/SysTenantMapper.xml | 7 + .../system/mapper/xml/SysTenantPackMapper.xml | 8 + .../mapper/xml/SysTenantPackUserMapper.xml | 18 ++ .../system/mapper/xml/SysUserMapper.xml | 7 +- .../service/ISysAnnouncementService.java | 10 +- .../system/service/ISysDepartService.java | 8 + .../system/service/ISysTenantPackService.java | 2 +- .../system/service/ISysTenantService.java | 15 + .../system/service/ISysUserService.java | 35 ++- .../impl/SysAnnouncementServiceImpl.java | 12 +- .../system/service/impl/SysBaseApiImpl.java | 80 ++++- .../service/impl/SysDepartServiceImpl.java | 6 + .../service/impl/SysDictServiceImpl.java | 24 +- .../impl/SysTenantPackServiceImpl.java | 13 +- .../service/impl/SysTenantServiceImpl.java | 89 +++++- .../impl/SysThirdAccountServiceImpl.java | 1 + .../service/impl/SysUserServiceImpl.java | 276 ++++++++++++++--- .../impl/ThirdAppDingtalkServiceImpl.java | 24 +- .../ThirdAppWechatEnterpriseServiceImpl.java | 17 +- .../vo/thirdapp/JdtDepartmentTreeVo.java | 15 +- .../vo/thirdapp/JwDepartmentTreeVo.java | 15 +- .../form/native/vue3NativeComponents.ftl | 2 +- .../common/form/native/vue3NativeForm.ftl | 200 ++++++------ .../form/native/vueNativeSearchStyle.ftl | 21 ++ .../init/native/vue3NativeInitValue.ftl | 2 +- .../init/native/vue3NativeMainInitValue.ftl | 2 +- .../init/native/vue3NativeSubInitValue.ftl | 2 +- .../code-template-online/common/utils.ftl | 2 +- .../common/validatorRulesTemplate/core.ftl | 4 +- .../native/vue3CoreNative.ftl | 4 +- .../vue/modules/${entityName}Form.vuei | 2 +- .../vue3/${entityName}List.vuei | 4 +- .../vue3/${entityName}__data.tsi | 22 +- .../vue3Native/${entityName}List.vuei | 21 +- .../vue3Native/${entityName}__data.tsi | 22 +- .../components/${entityName}Form.vuei | 27 +- .../components/${entityName}Modal.vuei | 8 +- .../vue/modules/${entityName}Form.vuei | 2 +- .../vue3/${entityName}List.vuei | 4 +- .../vue3/${entityName}__data.tsi | 28 +- .../vue3Native/${entityName}List.vuei | 21 +- .../vue3Native/${entityName}__data.tsi | 20 +- .../components/${entityName}Form.vuei | 65 ++-- .../components/${entityName}Modal.vuei | 8 +- .../vue3/${entityName}List.vuei | 26 +- .../vue3/${entityName}__data.tsi | 25 +- .../vue3Native/${entityName}List.vuei | 32 +- .../vue3Native/${entityName}__data.tsi | 37 ++- .../vue3Native/[1-n]List.vuei | 5 + .../components/${entityName}Form.vuei | 31 +- .../components/${entityName}Modal.vuei | 8 +- .../vue3Native/components/[1-n]Form.vuei | 33 +- .../vue3Native/components/[1-n]Modal.vuei | 8 +- .../vue/modules/${entityName}Form.vuei | 2 +- .../vue3/${entityName}List.vuei | 4 +- .../vue3/${entityName}__data.tsi | 33 +- .../vue/modules/${entityName}Form.vuei | 2 +- .../vue3/${entityName}List.vuei | 4 +- .../vue3/${entityName}__data.tsi | 33 +- .../vue3Native/${entityName}List.vuei | 21 +- .../vue3Native/${entityName}__data.tsi | 33 +- .../components/${entityName}Form.vuei | 35 ++- .../vue3Native/components/[1-n]Form.vuei | 32 +- .../vue3/${entityName}List.vuei | 4 +- .../vue3/${entityName}__data.tsi | 39 ++- .../vue3/components/${entityName}Modal.vuei | 113 ++++--- .../uniapp/${entityName}Form.vuei | 2 +- .../jeecg-system-start/Dockerfile | 4 +- .../jeecg-system-start/pom.xml | 24 +- .../org/jeecg/JeecgSystemApplication.java | 1 - .../org/jeecg/config/flyway/FlywayConfig.java | 8 +- .../src/main/resources/application-dev.yml | 11 +- .../src/main/resources/application-prod.yml | 13 +- .../src/main/resources/application-test.yml | 15 +- .../src/main/resources/banner.txt | 2 +- .../flyway/sql/mysql/V3.6.4__all_upgrade.sql | 286 ++++++++++++++++++ .../java/org/jeecg/smallTools/TestStr.java | 21 ++ jeecg-module-system/pom.xml | 2 +- .../jeecg-cloud-gateway/Dockerfile | 4 +- .../jeecg-cloud-gateway/pom.xml | 4 +- .../jeecg/filter/GlobalAccessTokenFilter.java | 7 +- .../swagger/SwaggerResourceController.java | 2 +- .../jeecg-cloud-nacos/Dockerfile | 4 +- jeecg-server-cloud/jeecg-cloud-nacos/pom.xml | 2 +- .../src/main/resources/application.yml | 6 +- .../jeecg-demo-cloud-start/Dockerfile | 4 +- .../jeecg-demo-cloud-start/pom.xml | 2 +- .../jeecg-system-cloud-start/Dockerfile | 4 +- .../jeecg-system-cloud-start/pom.xml | 2 +- .../jeecg/JeecgSystemCloudApplication.java | 2 - .../jeecg-visual/jeecg-cloud-monitor/pom.xml | 2 +- .../jeecg-cloud-sentinel/Dockerfile | 4 +- .../jeecg-visual/jeecg-cloud-sentinel/pom.xml | 2 +- .../jeecg-cloud-test-more/pom.xml | 2 +- .../jeecg-cloud-test-rabbitmq/pom.xml | 2 +- .../jeecg-cloud-test-rocketmq/pom.xml | 2 +- .../jeecg-cloud-test-seata-account/pom.xml | 2 +- .../jeecg-cloud-test-seata-order/pom.xml | 2 +- .../jeecg-cloud-test-seata-product/pom.xml | 2 +- .../jeecg-cloud-test-seata/pom.xml | 2 +- .../jeecg-cloud-test-shardingsphere/pom.xml | 2 +- .../jeecg-visual/jeecg-cloud-test/pom.xml | 2 +- .../jeecg-cloud-xxljob/Dockerfile | 4 +- .../jeecg-visual/jeecg-cloud-xxljob/pom.xml | 2 +- jeecg-server-cloud/jeecg-visual/pom.xml | 2 +- jeecg-server-cloud/pom.xml | 2 +- pom.xml | 43 +-- 205 files changed, 3807 insertions(+), 768 deletions(-) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ClientTerminalTypeEnum.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DateRangeEnum.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootBizTipException.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/system/enhance/UserFilterEnhance.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateRangeUtils.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsLimit.java create mode 100644 jeecg-boot-base-core/src/test/java/org/jeecg/test/sqlparse/TestIpUtil.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorMemoryController.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.6.4__all_upgrade.sql diff --git a/README-EN.md b/README-EN.md index 4ee23e421..7c6e71470 100644 --- a/README-EN.md +++ b/README-EN.md @@ -7,13 +7,13 @@ JEECG BOOT Low Code Development Platform =============== -当前最新版本: 3.6.3(发布日期:2024-03-11) +当前最新版本: 3.7.0(发布日期:2024-06-17) [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) [![](https://img.shields.io/badge/Author-guojusoft-orange.svg)](http://www.jeecg.com) [![](https://img.shields.io/badge/Blog-blog-blue.svg)](https://jeecg.blog.csdn.net) -[![](https://img.shields.io/badge/version-3.6.3-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) +[![](https://img.shields.io/badge/version-3.7.0-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) [![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot) [![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot) diff --git a/README.md b/README.md index a8020093d..9b5a89c52 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ JEECG BOOT 低代码开发平台 =============== -当前最新版本: 3.6.3(发布日期:2024-03-11) +当前最新版本: 3.7.0(发布日期:2024-06-17) [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) [![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](http://jeecg.com/aboutusIndex) [![](https://img.shields.io/badge/Blog-官方博客-blue.svg)](https://jeecg.blog.csdn.net) -[![](https://img.shields.io/badge/version-3.6.3-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) +[![](https://img.shields.io/badge/version-3.7.0-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) [![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot) [![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot) @@ -93,12 +93,6 @@ Docker快速启动项目 > ` 提醒:【QQ群是自助服务群,建议给帮助您解决问题的同学发送指定红包,表示感谢!】 ` -大龄码农的思考 ------------------------------------ -> 作为码农年纪大了写不动代码了怎么办??哎!! -所以我们团队在追求不写代码也可实现复杂业务系统!目前已经做到了,不信你到敲敲云零代码试试(通过流程串联修改业务数据) - -- https://www.qiaoqiaoyun.com 技术支持 diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml index 54498efd6..abad3b737 100644 --- a/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot-base-core/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-boot-parent - 3.6.3 + 3.7.0 4.0.0 jeecg-boot-base-core @@ -145,6 +145,24 @@ ${postgresql.version} runtime + + + org.jeecgframework + kingbase8 + 9.0.0 + runtime + + + + com.dameng + Dm8JdbcDriver18 + ${dm8.version} + + + com.dameng + DmDialect-for-hibernate5.0 + ${dm8.version} + @@ -271,5 +289,4 @@ hutool-crypto - \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java index 1c68bc15b..e087a61e1 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java @@ -18,6 +18,13 @@ public interface CommonAPI { * @return */ Set queryUserRoles(String username); + + /** + * 1查询用户角色信息 + * @param userId + * @return + */ + Set queryUserRolesById(String userId); /** @@ -49,6 +56,13 @@ public interface CommonAPI { * @return */ public LoginUser getUserByName(String username); + + /** + * 5根据用户账号查询用户Id + * @param username + * @return + */ + public String getUserIdByName(String username); /** diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java index e95943622..74dde4ff7 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java @@ -1,5 +1,6 @@ package org.jeecg.common.api.dto; import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; import org.jeecg.common.system.vo.LoginUser; import java.io.Serializable; import java.util.Date; @@ -55,6 +56,11 @@ public class LogDTO implements Serializable { */ private Integer tenantId; + /** + * 客户终端类型 pc:电脑端 app:手机端 h5:移动网页端 + */ + private String clientType; + public LogDTO(){ } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java index 5a736bda2..27967118d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java @@ -52,7 +52,9 @@ public class DictAspect { /** * 定义切点Pointcut */ - @Pointcut("execution(public * org.jeecg.modules..*.*Controller.*(..)) || @annotation(org.jeecg.common.aspect.annotation.AutoDict)") + @Pointcut("(@within(org.springframework.web.bind.annotation.RestController) || " + + "@within(org.springframework.stereotype.Controller) || @annotation(org.jeecg.common.aspect.annotation.AutoDict)) " + + "&& execution(public org.jeecg.common.api.vo.Result org.jeecg..*.*(..))") public void excudeService() { } @@ -92,7 +94,8 @@ public class DictAspect { * @param result */ private Object parseDictText(Object result) { - if (result instanceof Result) { + //if (result instanceof Result) { + if (true) { if (((Result) result).getResult() instanceof IPage) { List items = new ArrayList<>(); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 8e3299a93..1cfdb6f2e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -36,6 +36,16 @@ public interface CommonConstant { */ int LOG_TYPE_2 = 2; + /** + * 系统日志类型: 租户操作日志 + */ + int LOG_TYPE_3 = 3; + + /** + * 系统日志类型: 异常 + */ + int LOG_TYPE_4 = 4; + /** * 操作日志类型: 查询 */ @@ -286,6 +296,10 @@ public interface CommonConstant { * 在线聊天 用户好友缓存前缀 */ String IM_PREFIX_USER_FRIEND_CACHE = "sys:cache:im:im_prefix_user_friend_"; + /** + * 缓存用户id与用户名关系 + */ + String SYS_USER_ID_MAPPING_CACHE = "sys:cache:user:id_mapping"; /** * 考勤补卡业务状态 (1:同意 2:不同意) @@ -577,4 +591,30 @@ public interface CommonConstant { public static final String SAAS_MODE_TENANT = "tenant"; //update-end---author:scott ---date::2023-09-10 for:积木报表常量---- + //update-begin---author:wangshuai---date:2024-04-07---for:修改手机号常量--- + /** + * 修改手机号短信验证码redis-key的前缀 + */ + String CHANGE_PHONE_REDIS_KEY_PRE = "sys:cache:phone:change_phone_msg:"; + + /** + * 缓存用户最后一次收到消息通知的时间 KEY + */ + String CACHE_KEY_USER_LAST_ANNOUNT_TIME_1HOUR = "sys:cache:userinfo:user_last_annount_time::%s"; + + /** + * 验证原手机号 + */ + String VERIFY_ORIGINAL_PHONE = "verifyOriginalPhone"; + + /** + * 修改手机号 + */ + String UPDATE_PHONE = "updatePhone"; + //update-end---author:wangshuai---date:2024-04-07---for:修改手机号常量--- + + /** + * 修改手机号验证码请求次数超出 + */ + Integer PHONE_SMS_FAIL_CODE = 40002; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java index 2796a8413..b6d2be1ca 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java @@ -58,6 +58,22 @@ public interface DataBaseConstant { * 数据-所属机构编码 */ public static final String SYS_MULTI_ORG_CODE_TABLE = "sys_multi_org_code"; + /** + * 数据-所属机构ID + */ + public static final String SYS_ORG_ID = "sysOrgId"; + /** + * 数据-所属机构ID + */ + public static final String SYS_ORG_ID_TABLE = "sys_org_id"; + /** + * 数据-所属角色code(多个逗号分割) + */ + public static final String SYS_ROLE_CODE = "sysRoleCode"; + /** + * 数据-所属角色code(多个逗号分割) + */ + public static final String SYS_ROLE_CODE_TABLE = "sys_role_code"; /** * 数据-系统用户编码(对应登录用户账号) */ @@ -66,7 +82,14 @@ public interface DataBaseConstant { * 数据-系统用户编码(对应登录用户账号) */ public static final String SYS_USER_CODE_TABLE = "sys_user_code"; - + /** + * 登录用户ID + */ + public static final String SYS_USER_ID = "sysUserId"; + /** + * 登录用户ID + */ + public static final String SYS_USER_ID_TABLE = "sys_user_id"; /** * 登录用户真实姓名 */ diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java index 351d4127f..e4a1e8c0b 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java @@ -34,17 +34,22 @@ public interface ServiceNameConstants { */ String SERVICE_DEMO = "jeecg-demo"; /** - * 微服务名:online在线模块 + * 微服务名:joa模块 */ - String SERVICE_ONLINE = "jeecg-online"; - /** - * 微服务名:OA模块 - */ - String SERVICE_EOA = "jeecg-eoa"; - /** - * 微服务名:表单设计模块 - */ - String SERVICE_FORM = "jeecg-desform"; + String SERVICE_JOA = "jeecg-joa"; + +// /** +// * 微服务名:online在线模块 +// */ +// String SERVICE_ONLINE = "jeecg-online"; +// /** +// * 微服务名:OA模块 +// */ +// String SERVICE_EOA = "jeecg-eoa"; +// /** +// * 微服务名:表单设计模块 +// */ +// String SERVICE_FORM = "jeecg-desform"; /** * gateway通过header传递根路径 basePath diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java index 0f7f73c6d..cbd543667 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java @@ -23,7 +23,7 @@ public enum CgformEnum { /** * 多表(jvxe风格) * */ - JVXE_TABLE(2, "jvxe", "/jeecg/code-template-online", "jvxe.onetomany", "JVXE风格" ,new String[]{"vue3","vue","vue3Native"}), + JVXE_TABLE(2, "jvxe", "/jeecg/code-template-online", "jvxe.onetomany", "默认风格" ,new String[]{"vue3","vue","vue3Native"}), /** * 多表 (erp风格) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ClientTerminalTypeEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ClientTerminalTypeEnum.java new file mode 100644 index 000000000..380decb2e --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ClientTerminalTypeEnum.java @@ -0,0 +1,23 @@ +package org.jeecg.common.constant.enums; + +/** + * 客户终端类型 + */ +public enum ClientTerminalTypeEnum { + + PC("pc", "电脑终端"), + H5("h5", "移动网页端"), + APP("app", "手机app端"); + + private String key; + private String text; + + ClientTerminalTypeEnum(String value, String text) { + this.key = value; + this.text = text; + } + + public String getKey() { + return this.key; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DateRangeEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DateRangeEnum.java new file mode 100644 index 000000000..21c68b1da --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DateRangeEnum.java @@ -0,0 +1,27 @@ +package org.jeecg.common.constant.enums; + +/** + * 日期预设范围枚举 + */ +public enum DateRangeEnum { + // 今天 + TODAY, + // 昨天 + YESTERDAY, + // 明天 + TOMORROW, + // 本周 + THIS_WEEK, + // 上周 + LAST_WEEK, + // 下周 + NEXT_WEEK, + // 过去七天 + LAST_7_DAYS, + // 本月 + THIS_MONTH, + // 上月 + LAST_MONTH, + // 下月 + NEXT_MONTH, +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DySmsEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DySmsEnum.java index ba102b5c1..8034f0f31 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DySmsEnum.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DySmsEnum.java @@ -12,6 +12,8 @@ public enum DySmsEnum { LOGIN_TEMPLATE_CODE("SMS_175435174","敲敲云","code"), /**忘记密码短信模板编码*/ FORGET_PASSWORD_TEMPLATE_CODE("SMS_175435174","敲敲云","code"), + /**修改密码短信模板编码*/ + CHANGE_PASSWORD_TEMPLATE_CODE("SMS_465391221","敲敲云","code"), /**注册账号短信模板编码*/ REGISTER_TEMPLATE_CODE("SMS_175430166","敲敲云","code"), /**会议通知*/ diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootBizTipException.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootBizTipException.java new file mode 100644 index 000000000..7278709cf --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootBizTipException.java @@ -0,0 +1,40 @@ +package org.jeecg.common.exception; + +import org.jeecg.common.constant.CommonConstant; + +/** + * @Description: 业务提醒异常(用于操作业务提醒) + * @date: 2024-04-26 + * @author: scott + */ +public class JeecgBootBizTipException extends RuntimeException { + private static final long serialVersionUID = 1L; + + /** + * 返回给前端的错误code + */ + private int errCode = CommonConstant.SC_INTERNAL_SERVER_ERROR_500; + + public JeecgBootBizTipException(String message){ + super(message); + } + + public JeecgBootBizTipException(String message, int errCode){ + super(message); + this.errCode = errCode; + } + + public int getErrCode() { + return errCode; + } + + public JeecgBootBizTipException(Throwable cause) + { + super(cause); + } + + public JeecgBootBizTipException(String message, Throwable cause) + { + super(message,cause); + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java index 0c246f515..ea016ccbe 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java @@ -2,14 +2,27 @@ package org.jeecg.common.exception; import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; +import org.jeecg.common.api.dto.LogDTO; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.enums.ClientTerminalTypeEnum; import org.jeecg.common.enums.SentinelErrorInfoEnum; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.BrowserUtils; +import org.jeecg.common.util.IpUtils; +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.BeansException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.data.redis.connection.PoolException; import org.springframework.http.HttpStatus; +import org.springframework.util.CollectionUtils; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; @@ -17,6 +30,10 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.NoHandlerFoundException; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + /** * 异常处理器 * @@ -27,12 +44,25 @@ import org.springframework.web.servlet.NoHandlerFoundException; @Slf4j public class JeecgBootExceptionHandler { + @Resource + BaseCommonService baseCommonService; + /** * 处理自定义异常 */ @ExceptionHandler(JeecgBootException.class) public Result handleJeecgBootException(JeecgBootException e){ log.error(e.getMessage(), e); + addSysLog(e); + return Result.error(e.getErrCode(), e.getMessage()); + } + + /** + * 处理自定义异常 + */ + @ExceptionHandler(JeecgBootBizTipException.class) + public Result handleJeecgBootBizTipException(JeecgBootBizTipException e){ + log.error(e.getMessage()); return Result.error(e.getErrCode(), e.getMessage()); } @@ -42,6 +72,7 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(JeecgCloudException.class) public Result handleJeecgCloudException(JeecgCloudException e){ log.error(e.getMessage(), e); + addSysLog(e); return Result.error(e.getMessage()); } @@ -52,18 +83,21 @@ public class JeecgBootExceptionHandler { @ResponseStatus(HttpStatus.UNAUTHORIZED) public Result handleJeecgBoot401Exception(JeecgBoot401Exception e){ log.error(e.getMessage(), e); + addSysLog(e); return new Result(401,e.getMessage()); } @ExceptionHandler(NoHandlerFoundException.class) public Result handlerNoFoundException(Exception e) { log.error(e.getMessage(), e); + addSysLog(e); return Result.error(404, "路径不存在,请检查路径是否正确"); } @ExceptionHandler(DuplicateKeyException.class) public Result handleDuplicateKeyException(DuplicateKeyException e){ log.error(e.getMessage(), e); + addSysLog(e); return Result.error("数据库中已存在该记录"); } @@ -83,6 +117,7 @@ public class JeecgBootExceptionHandler { return Result.error(errorInfoEnum.getError()); } //update-end---author:zyf ---date:20220411 for:处理Sentinel限流自定义异常 + addSysLog(e); return Result.error("操作失败,"+e.getMessage()); } @@ -107,6 +142,7 @@ public class JeecgBootExceptionHandler { } log.error(sb.toString(), e); //return Result.error("没有权限,请联系管理员授权"); + addSysLog(e); return Result.error(405,sb.toString()); } @@ -116,12 +152,14 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public Result handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { log.error(e.getMessage(), e); + addSysLog(e); return Result.error("文件大小超出10MB限制, 请压缩或降低文件质量! "); } @ExceptionHandler(DataIntegrityViolationException.class) public Result handleDataIntegrityViolationException(DataIntegrityViolationException e) { log.error(e.getMessage(), e); + addSysLog(e); //【issues/3624】数据库执行异常handleDataIntegrityViolationException提示有误 #3624 return Result.error("执行数据库异常,违反了完整性例如:违反惟一约束、违反非空限制、字段内容超出长度等"); } @@ -129,6 +167,7 @@ public class JeecgBootExceptionHandler { @ExceptionHandler(PoolException.class) public Result handlePoolException(PoolException e) { log.error(e.getMessage(), e); + addSysLog(e); return Result.error("Redis 连接异常!"); } @@ -149,7 +188,57 @@ public class JeecgBootExceptionHandler { log.error("校验失败,存在SQL注入风险!{}", msg); return Result.error("校验失败,存在SQL注入风险!"); } + addSysLog(exception); return Result.error("校验失败,存在SQL注入风险!" + msg); } + //update-begin---author:chenrui ---date:20240423 for:[QQYUN-8732]把错误的日志都抓取了 方便后续处理,单独弄个日志类型------------ + /** + * 添加异常新系统日志 + * @param e 异常 + * @author chenrui + * @date 2024/4/22 17:16 + */ + private void addSysLog(Throwable e) { + LogDTO log = new LogDTO(); + log.setLogType(CommonConstant.LOG_TYPE_4); + log.setLogContent(e.getClass().getName()+":"+e.getMessage()); + log.setRequestParam(ExceptionUtils.getStackTrace(e)); + //获取request + HttpServletRequest request = null; + try { + request = SpringContextUtils.getHttpServletRequest(); + } catch (NullPointerException | BeansException ignored) { + } + if (null != request) { + //请求的参数 + Map parameterMap = request.getParameterMap(); + if(!CollectionUtils.isEmpty(parameterMap)){ + log.setMethod(oConvertUtils.mapToString(request.getParameterMap())); + } + // 请求地址 + log.setRequestUrl(request.getRequestURI()); + //设置IP地址 + log.setIp(IpUtils.getIpAddr(request)); + //设置客户端 + if(BrowserUtils.isDesktop(request)){ + log.setClientType(ClientTerminalTypeEnum.PC.getKey()); + }else{ + log.setClientType(ClientTerminalTypeEnum.APP.getKey()); + } + } + + + //获取登录用户信息 + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser!=null){ + log.setUserid(sysUser.getUsername()); + log.setUsername(sysUser.getRealname()); + + } + + baseCommonService.addLog(log); + } + //update-end---author:chenrui ---date:20240423 for:[QQYUN-8732]把错误的日志都抓取了 方便后续处理,单独弄个日志类型------------ + } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/enhance/UserFilterEnhance.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/enhance/UserFilterEnhance.java new file mode 100644 index 000000000..9f5c3a1cf --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/enhance/UserFilterEnhance.java @@ -0,0 +1,19 @@ +package org.jeecg.common.system.enhance; + +import java.util.List; + +/** + * 用户增强 + */ +public interface UserFilterEnhance { + + /** + * 获取用户id + * @param loginUserId 当前登录的用户id + * + * @return List 返回多个用户id + */ + default List getUserIds(String loginUserId) { + return null; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java index ee35b59da..ca0f5b680 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java @@ -2,7 +2,6 @@ package org.jeecg.common.system.query; import java.beans.PropertyDescriptor; import java.io.UnsupportedEncodingException; -import java.lang.reflect.Field; import java.math.BigDecimal; import java.net.URLDecoder; import java.text.ParseException; @@ -15,7 +14,6 @@ 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.exception.JeecgBootException; import org.jeecg.common.system.util.JeecgDataAutorUtils; import org.jeecg.common.system.util.JwtUtil; @@ -25,7 +23,6 @@ import org.jeecg.common.util.*; import org.springframework.util.NumberUtils; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; @@ -94,10 +91,27 @@ public class QueryGenerator { public static QueryWrapper initQueryWrapper(T searchObj,Map parameterMap){ long start = System.currentTimeMillis(); QueryWrapper queryWrapper = new QueryWrapper(); - installMplus(queryWrapper, searchObj, parameterMap); + installMplus(queryWrapper, searchObj, parameterMap, null); log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); return queryWrapper; } + + //update-begin---author:chenrui ---date:20240527 for:[TV360X-378]增加自定义字段查询规则功能------------ + /** + * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 + * @param searchObj 查询实体 + * @param parameterMap request.getParameterMap() + * @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum} + * @return QueryWrapper实例 + */ + public static QueryWrapper initQueryWrapper(T searchObj,Map parameterMap, Map customRuleMap){ + long start = System.currentTimeMillis(); + QueryWrapper queryWrapper = new QueryWrapper(); + installMplus(queryWrapper, searchObj, parameterMap, customRuleMap); + log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); + return queryWrapper; + } + //update-end---author:chenrui ---date:20240527 for:[TV360X-378]增加自定义字段查询规则功能------------ /** * 组装Mybatis Plus 查询条件 @@ -108,8 +122,7 @@ public class QueryGenerator { *
正确示例:QueryWrapper queryWrapper = new QueryWrapper(); *
3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 */ - private static void installMplus(QueryWrapper queryWrapper,Object searchObj,Map parameterMap) { - + private static void installMplus(QueryWrapper queryWrapper, Object searchObj, Map parameterMap, Map customRuleMap) { /* * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} 但是不支持在自定义SQL中写orgCode in #{sys_org_code} @@ -174,8 +187,16 @@ public class QueryGenerator { queryWrapper.and(j -> j.like(field,vals[0])); } }else { - //根据参数值带什么关键字符串判断走什么类型的查询 - QueryRuleEnum rule = convert2Rule(value); + //update-begin---author:chenrui ---date:20240527 for:[TV360X-378]增加自定义字段查询规则功能------------ + QueryRuleEnum rule; + if(null != customRuleMap && customRuleMap.containsKey(name)) { + // 有自定义规则,使用自定义规则. + rule = customRuleMap.get(name); + }else { + //根据参数值带什么关键字符串判断走什么类型的查询 + rule = convert2Rule(value); + } + //update-end---author:chenrui ---date:20240527 for:[TV360X-378]增加自定义字段查询规则功能------------ value = replaceValue(rule,value); // add -begin 添加判断为字符串时设为全模糊查询 //if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) { @@ -274,7 +295,7 @@ public class QueryGenerator { //update-end-author:scott date:2022-10-10 for:【jeecg-boot/issues/I5FJU6】doMultiFieldsOrder() 多字段排序方法存在问题 //SQL注入check - SqlInjectionUtil.filterContent(column); + SqlInjectionUtil.filterContentMulti(column); //update-begin--Author:scott Date:20210531 for:36 多条件排序无效问题修正------- // 排序规则修改 @@ -678,9 +699,40 @@ public class QueryGenerator { case LEFT_LIKE: queryWrapper.likeLeft(name, value); break; + case NOT_LEFT_LIKE: + queryWrapper.notLikeLeft(name, value); + break; case RIGHT_LIKE: queryWrapper.likeRight(name, value); break; + case NOT_RIGHT_LIKE: + queryWrapper.notLikeRight(name, value); + break; + //update-begin---author:chenrui ---date:20240527 for:[TV360X-378]下拉多框根据条件查询不出来:增加自定义字段查询规则功能------------ + case LIKE_WITH_OR: + final String nameFinal = name; + Object[] vals; + if (value instanceof String) { + vals = value.toString().split(COMMA); + } else if (value instanceof String[]) { + vals = (Object[]) value; + } + //update-begin-author:taoyan date:20200909 for:【bug】in 类型多值查询 不适配postgresql #1671 + else if (value.getClass().isArray()) { + vals = (Object[]) value; + } else { + vals = new Object[]{value}; + } + queryWrapper.and(j -> { + log.info("---查询过滤器,Query规则---field:{}, rule:{}, value:{}", nameFinal, "like", vals[0]); + j = j.like(nameFinal, vals[0]); + for (int k = 1; k < vals.length; k++) { + j = j.or().like(nameFinal, vals[k]); + log.info("---查询过滤器,Query规则 .or()---field:{}, rule:{}, value:{}", nameFinal, "like", vals[k]); + } + }); + break; + //update-end---author:chenrui ---date:20240527 for:[TV360X-378]下拉多框根据条件查询不出来:增加自定义字段查询规则功能------------ default: log.info("--查询规则未匹配到---"); break; @@ -856,7 +908,9 @@ public class QueryGenerator { Class propType = origDescriptors[i].getPropertyType(); boolean isString = propType.equals(String.class); Object value; - if(isString) { + //update-begin---author:chenrui ---date:20240527 for:[TV360X-539]数据权限,配置日期等于条件时后端报转换错误------------ + if(isString || Date.class.equals(propType)) { + //update-end---author:chenrui ---date:20240527 for:[TV360X-539]数据权限,配置日期等于条件时后端报转换错误------------ value = converRuleValue(dataRule.getRuleValue()); }else { value = NumberUtils.parseNumber(dataRule.getRuleValue(),propType); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java index a413dc2d7..c89de71f1 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java @@ -33,12 +33,21 @@ public enum QueryRuleEnum { RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"), /**查询规则 带加号等于*/ EQ_WITH_ADD("EQWITHADD","eq_with_add","带加号等于"), - /**查询规则 多词模糊匹配*/ + /**查询规则 多词模糊匹配(and)*/ LIKE_WITH_AND("LIKEWITHAND","like_with_and","多词模糊匹配————暂时未用上"), + /**查询规则 多词模糊匹配(or)*/ + LIKE_WITH_OR("LIKEWITHOR","like_with_or","多词模糊匹配(or)"), /**查询规则 自定义SQL片段*/ SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段"), - + + /** 查询工作表 */ + LINKAGE("LINKAGE","linkage","查询工作表"), + // ------- 当前表单设计器内专用 ------- + /**查询规则 不以…结尾*/ + NOT_LEFT_LIKE("NOT_LEFT_LIKE","not_left_like","不以…结尾"), + /**查询规则 不以…开头*/ + NOT_RIGHT_LIKE("NOT_RIGHT_LIKE","not_right_like","不以…开头"), /** 值为空 */ EMPTY("EMPTY","empty","值为空"), /** 值不为空 */ @@ -49,7 +58,10 @@ public enum QueryRuleEnum { ELE_MATCH("ELE_MATCH","elemMatch","多词匹配"), /**查询规则 范围查询*/ RANGE("RANGE","range","范围查询"), - NOT_RANGE("NOT_RANGE","not_range","不在范围查询"); + /**查询规则 不在范围内查询*/ + NOT_RANGE("NOT_RANGE","not_range","不在范围查询"), + /** 自定义mongodb查询语句 */ + CUSTOM_MONGODB("CUSTOM_MONGODB","custom_mongodb","自定义mongodb查询语句"); // ------- 当前表单设计器内专用 ------- private String value; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java index 5d5475106..d2f560841 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java @@ -221,6 +221,16 @@ public class JwtUtil { returnValue = user.getSysUserCode(); } } + + // 替换为系统登录用户ID + else if (key.equals(DataBaseConstant.SYS_USER_ID) || key.equalsIgnoreCase(DataBaseConstant.SYS_USER_ID_TABLE)) { + if(user==null) { + returnValue = sysUser.getId(); + }else { + returnValue = user.getSysUserId(); + } + } + //替换为系统登录用户真实名字 else if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) { if(user==null) { @@ -238,6 +248,16 @@ public class JwtUtil { returnValue = user.getSysOrgCode(); } } + + // 替换为系统用户登录所使用的机构ID + else if (key.equals(DataBaseConstant.SYS_ORG_ID) || key.equalsIgnoreCase(DataBaseConstant.SYS_ORG_ID_TABLE)) { + if (user == null) { + returnValue = sysUser.getOrgId(); + } else { + returnValue = user.getSysOrgId(); + } + } + //替换为系统用户所拥有的所有机构编码 else if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) { if(user==null){ @@ -251,6 +271,16 @@ public class JwtUtil { } } } + + // 替换为当前登录用户的角色code(多个逗号分割) + else if (key.equals(DataBaseConstant.SYS_ROLE_CODE) || key.equalsIgnoreCase(DataBaseConstant.SYS_ROLE_CODE_TABLE)) { + if (user == null) { + returnValue = sysUser.getRoleCode(); + } else { + returnValue = user.getSysRoleCode(); + } + } + //update-begin-author:taoyan date:20210330 for:多租户ID作为系统变量 else if (key.equals(TenantConstant.TENANT_ID) || key.toLowerCase().equals(TenantConstant.TENANT_ID_TABLE)){ try { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/ResourceUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/ResourceUtil.java index ce97d6406..b2805df69 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/ResourceUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/ResourceUtil.java @@ -3,7 +3,9 @@ package org.jeecg.common.system.util; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.system.annotation.EnumDict; import org.jeecg.common.system.vo.DictModel; +import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; @@ -114,4 +116,21 @@ public class ResourceUtil { return map; } + /** + * 获取实现类 + * + * @param classPath + */ + public static Object getImplementationClass(String classPath){ + try { + Class aClass = Class.forName(classPath); + return SpringContextUtils.getBean(aClass); + } catch (ClassNotFoundException e) { + log.error("类没有找到",e); + return null; + } catch (NoSuchBeanDefinitionException e){ + log.error(classPath + "没有实现",e); + return null; + } + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java index 44656a7f8..32d4b493a 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java @@ -51,6 +51,17 @@ public class LoginUser { */ @SensitiveField private String orgCode; + /** + * 当前登录部门id + */ + @SensitiveField + private String orgId; + /** + * 当前登录角色code(多个逗号分割) + */ + @SensitiveField + private String roleCode; + /** * 头像 */ diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java index a6e117ab1..fd9796d2c 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java @@ -9,17 +9,29 @@ import org.jeecg.common.util.DateUtils; * @author: jeecg-boot */ public class SysUserCacheInfo { - + + private String sysUserId; + private String sysUserCode; private String sysUserName; private String sysOrgCode; - + + /** + * 当前用户部门ID + */ + private String sysOrgId; + private List sysMultiOrgCode; private boolean oneDepart; - + + /** + * 当前用户角色code(多个逗号分割) + */ + private String sysRoleCode; + public boolean isOneDepart() { return oneDepart; } @@ -68,4 +80,27 @@ public class SysUserCacheInfo { this.sysMultiOrgCode = sysMultiOrgCode; } + public String getSysUserId() { + return sysUserId; + } + + public void setSysUserId(String sysUserId) { + this.sysUserId = sysUserId; + } + + public String getSysOrgId() { + return sysOrgId; + } + + public void setSysOrgId(String sysOrgId) { + this.sysOrgId = sysOrgId; + } + + public String getSysRoleCode() { + return sysRoleCode; + } + + public void setSysRoleCode(String sysRoleCode) { + this.sysRoleCode = sysRoleCode; + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateRangeUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateRangeUtils.java new file mode 100644 index 000000000..9af469058 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateRangeUtils.java @@ -0,0 +1,242 @@ +package org.jeecg.common.util; + +import cn.hutool.core.date.DateUtil; +import org.jeecg.common.constant.enums.DateRangeEnum; + +import java.util.Calendar; +import java.util.Date; + +/** + * 日期范围工具类 + * + * @author scott + * @date 20230801 + */ +public class DateRangeUtils { + + /** + * 根据日期范围枚举获取日期范围 + * + * @param rangeEnum + * @return Date[] + */ + public static Date[] getDateRangeByEnum(DateRangeEnum rangeEnum) { + if (rangeEnum == null) { + return null; + } + Date[] ranges = new Date[2]; + switch (rangeEnum) { + case TODAY: + ranges[0] = getTodayStartTime(); + ranges[1] = getTodayEndTime(); + break; + case YESTERDAY: + ranges[0] = getYesterdayStartTime(); + ranges[1] = getYesterdayEndTime(); + break; + case TOMORROW: + ranges[0] = getTomorrowStartTime(); + ranges[1] = getTomorrowEndTime(); + break; + case THIS_WEEK: + ranges[0] = getThisWeekStartDay(); + ranges[1] = getThisWeekEndDay(); + break; + case LAST_WEEK: + ranges[0] = getLastWeekStartDay(); + ranges[1] = getLastWeekEndDay(); + break; + case NEXT_WEEK: + ranges[0] = getNextWeekStartDay(); + ranges[1] = getNextWeekEndDay(); + break; + case LAST_7_DAYS: + ranges[0] = getLast7DaysStartTime(); + ranges[1] = getLast7DaysEndTime(); + break; + case THIS_MONTH: + ranges[0] = getThisMonthStartDay(); + ranges[1] = getThisMonthEndDay(); + break; + case LAST_MONTH: + ranges[0] = getLastMonthStartDay(); + ranges[1] = getLastMonthEndDay(); + break; + case NEXT_MONTH: + ranges[0] = getNextMonthStartDay(); + ranges[1] = getNextMonthEndDay(); + break; + default: + return null; + } + return ranges; + } + + /** + * 获得下月第一天 周日 00:00:00 + */ + public static Date getNextMonthStartDay() { + return DateUtil.beginOfMonth(DateUtil.nextMonth()); + } + + /** + * 获得下月最后一天 23:59:59 + */ + public static Date getNextMonthEndDay() { + return DateUtil.endOfMonth(DateUtil.nextMonth()); + } + + /** + * 获得本月第一天 周日 00:00:00 + */ + public static Date getThisMonthStartDay() { + return DateUtil.beginOfMonth(DateUtil.date()); + } + + /** + * 获得本月最后一天 23:59:59 + */ + public static Date getThisMonthEndDay() { + return DateUtil.endOfMonth(DateUtil.date()); + } + + /** + * 获得上月第一天 周日 00:00:00 + */ + public static Date getLastMonthStartDay() { + return DateUtil.beginOfMonth(DateUtil.lastMonth()); + } + + /** + * 获得上月最后一天 23:59:59 + */ + public static Date getLastMonthEndDay() { + return DateUtil.endOfMonth(DateUtil.lastMonth()); + } + + /** + * 获得上周第一天 周一 00:00:00 + */ + public static Date getLastWeekStartDay() { + return DateUtil.beginOfWeek(DateUtil.lastWeek()); + } + + /** + * 获得上周最后一天 周日 23:59:59 + */ + public static Date getLastWeekEndDay() { + return DateUtil.endOfWeek(DateUtil.lastWeek()); + } + + /** + * 获得本周第一天 周一 00:00:00 + */ + public static Date getThisWeekStartDay() { + Date today = new Date(); + return DateUtil.beginOfWeek(today); + } + + /** + * 获得本周最后一天 周日 23:59:59 + */ + public static Date getThisWeekEndDay() { + Date today = new Date(); + return DateUtil.endOfWeek(today); + } + + /** + * 获得下周第一天 周一 00:00:00 + */ + public static Date getNextWeekStartDay() { + return DateUtil.beginOfWeek(DateUtil.nextWeek()); + } + + /** + * 获得下周最后一天 周日 23:59:59 + */ + public static Date getNextWeekEndDay() { + return DateUtil.endOfWeek(DateUtil.nextWeek()); + } + + /** + * 过去七天开始时间(不含今天) + * + * @return + */ + public static Date getLast7DaysStartTime() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DATE, -7); + return DateUtil.beginOfDay(calendar.getTime()); + } + + /** + * 过去七天结束时间(不含今天) + * + * @return + */ + public static Date getLast7DaysEndTime() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getLast7DaysStartTime()); + calendar.add(Calendar.DATE, 6); + return DateUtil.endOfDay(calendar.getTime()); + } + + /** + * 昨天开始时间 + * + * @return + */ + public static Date getYesterdayStartTime() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DATE, -1); + return DateUtil.beginOfDay(calendar.getTime()); + } + + /** + * 昨天结束时间 + * + * @return + */ + public static Date getYesterdayEndTime() { + return DateUtil.endOfDay(getYesterdayStartTime()); + } + + /** + * 明天开始时间 + * + * @return + */ + public static Date getTomorrowStartTime() { + return DateUtil.beginOfDay(DateUtil.tomorrow()); + } + + /** + * 明天结束时间 + * + * @return + */ + public static Date getTomorrowEndTime() { + return DateUtil.endOfDay(DateUtil.tomorrow()); + } + + /** + * 今天开始时间 + * + * @return + */ + public static Date getTodayStartTime() { + return DateUtil.beginOfDay(new Date()); + } + + /** + * 今天结束时间 + * + * @return + */ + public static Date getTodayEndTime() { + return DateUtil.endOfDay(new Date()); + } + +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java index e063da5db..4e929a144 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java @@ -8,6 +8,11 @@ import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -116,6 +121,17 @@ public class DateUtils extends PropertyEditorSupport { public static Date getDate() { return new Date(); } + + + /** + * 当前日期 + * + * @return 系统当前日期(不带时分秒) + */ + public static LocalDate getLocalDate() { + LocalDate today = LocalDate.now(); + return today; + } /** * 指定毫秒数表示的日期 @@ -704,6 +720,44 @@ public class DateUtils extends PropertyEditorSupport { return isSameMonth && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); } + /** + * 计算与当前日期的时间差 + * + * @param targetDate + * @return + */ + public static long calculateTimeDifference(Date targetDate) { + // 获取当前时间 + LocalDateTime currentTime = LocalDateTime.now(); + + // 将java.util.Date转换为java.time.LocalDateTime + LocalDateTime convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + + // 计算时间差 + Duration duration = Duration.between(currentTime, convertedTargetDate); + + // 获取时间差的毫秒数 + long timeDifferenceInMillis = duration.toMillis(); + + return timeDifferenceInMillis; + } + + /** + * 计算与当前日期的日期天数差 + * + * @param targetDate + * @return + */ + public static long calculateDaysDifference(Date targetDate) { + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + // 将java.util.Date转换为java.time.LocalDate + LocalDate convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + // 计算日期差 + long daysDifference = ChronoUnit.DAYS.between(currentDate, convertedTargetDate); + return daysDifference; + } + /** * 判断两个时间是否是同一周 * diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsLimit.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsLimit.java new file mode 100644 index 000000000..b7a24c8a9 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsLimit.java @@ -0,0 +1,96 @@ +package org.jeecg.common.util; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * 防止刷短信接口(只针对绑定手机号模板:SMS_175430166) + * + * 1、同一IP,1分钟内发短信不允许超过5次(每一分钟重置每个IP请求次数) + * 2、同一IP,1分钟内发短信超过20次,进入黑名单,不让使用短信接口 + * + * 3、短信接口加签和时间戳 + * 涉及接口: + * /sys/sms + * /desform/api/sendVerifyCode + * /sys/sendChangePwdSms + */ +@Slf4j +public class DySmsLimit { + + // 1分钟内最大发短信数量(单一IP) + private static final int MAX_MESSAGE_PER_MINUTE = 5; + // 1分钟 + private static final int MILLIS_PER_MINUTE = 60000; + // 一分钟内报警线最大短信数量,超了进黑名单(单一IP) + private static final int MAX_TOTAL_MESSAGE_PER_MINUTE = 20; + + private static ConcurrentHashMap ipLastRequestTime = new ConcurrentHashMap<>(); + private static ConcurrentHashMap ipRequestCount = new ConcurrentHashMap<>(); + private static ConcurrentHashMap ipBlacklist = new ConcurrentHashMap<>(); + + /** + * @param ip 请求发短信的IP地址 + * @return + */ + public static boolean canSendSms(String ip) { + long currentTime = System.currentTimeMillis(); + long lastRequestTime = ipLastRequestTime.getOrDefault(ip, 0L); + int requestCount = ipRequestCount.getOrDefault(ip, 0); + log.info("IP:{}, Msg requestCount:{} ", ip, requestCount); + + if (ipBlacklist.getOrDefault(ip, false)) { + // 如果IP在黑名单中,则禁止发送短信 + log.error("IP:{}, 进入黑名单,禁止发送请求短信!", ip); + return false; + } + + if (currentTime - lastRequestTime >= MILLIS_PER_MINUTE) { + // 如果距离上次请求已经超过一分钟,则重置计数 + ipRequestCount.put(ip, 1); + ipLastRequestTime.put(ip, currentTime); + return true; + } else { + // 如果距离上次请求不到一分钟 + ipRequestCount.put(ip, requestCount + 1); + if (requestCount < MAX_MESSAGE_PER_MINUTE) { + // 如果请求次数小于5次,允许发送短信 + return true; + } else if (requestCount >= MAX_TOTAL_MESSAGE_PER_MINUTE) { + // 如果请求次数超过报警线短信数量,将IP加入黑名单 + ipBlacklist.put(ip, true); + return false; + } else { + log.error("IP:{}, 1分钟内请求短信超过5次,请稍后重试!", ip); + return false; + } + } + } + + /** + * 图片二维码验证成功之后清空数量 + * + * @param ip IP地址 + */ + public static void clearSendSmsCount(String ip) { + long currentTime = System.currentTimeMillis(); + ipRequestCount.put(ip, 0); + ipLastRequestTime.put(ip, currentTime); + } + +// public static void main(String[] args) { +// String ip = "192.168.1.1"; +// for (int i = 1; i < 50; i++) { +// if (canSendSms(ip)) { +// System.out.println("Send SMS successfully"); +// } else { +// //System.out.println("Exceed SMS limit for IP " + ip); +// } +// } +// +// System.out.println(ipLastRequestTime); +// System.out.println(ipRequestCount); +// System.out.println(ipBlacklist); +// } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java index 01b9d6be5..22a9395b4 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java @@ -7,6 +7,11 @@ import org.jeecg.common.constant.CommonConstant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * IP地址 * @@ -45,15 +50,52 @@ public class IpUtils { } catch (Exception e) { logger.error("IPUtils ERROR ", e); } - -// //使用代理,则获取第一个IP地址 -// if(StringUtils.isEmpty(ip) && ip.length() > 15) { -// if(ip.indexOf(",") > 0) { -// ip = ip.substring(0, ip.indexOf(",")); -// } -// } + + //logger.info("获取客户端 ip:{} ", ip); + // 使用代理,则获取第一个IP地址 + if (StringUtils.isNotEmpty(ip) && ip.length() > 15) { + if (ip.indexOf(",") > 0) { + //ip = ip.substring(0, ip.indexOf(",")); + String[] ipAddresses = ip.split(","); + for (String ipAddress : ipAddresses) { + ipAddress = ipAddress.trim(); + if (isValidIpAddress(ipAddress)) { + return ipAddress; + } + } + } + } return ip; } - + + + /** + * 判断是否是IP格式 + * @param ipAddress + * @return + */ + public static boolean isValidIpAddress(String ipAddress) { + String ipPattern = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + Pattern pattern = Pattern.compile(ipPattern); + Matcher matcher = pattern.matcher(ipAddress); + return matcher.matches(); + } + + /** + * 获取服务器上的ip + * @return + */ + public static String getServerIp(){ + InetAddress inetAddress = null; + try { + inetAddress = InetAddress.getLocalHost(); + String ipAddress = inetAddress.getHostAddress(); + //System.out.println("IP地址: " + ipAddress); + return ipAddress; + } catch (UnknownHostException e) { + logger.error("获取ip地址失败", e); + } + return ""; + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java index de2dd3873..c11c62e9b 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java @@ -75,7 +75,7 @@ public class SqlInjectionUtil { * sql注入过滤处理,遇到注入关键字抛异常 * @param values */ - public static void filterContent(String... values) { + public static void filterContentMulti(String... values) { filterContent(values, null); } @@ -291,7 +291,15 @@ public class SqlInjectionUtil { if(oConvertUtils.isEmpty(table)){ return table; } - + + //update-begin---author:scott ---date:2024-05-28 for:表单设计器列表翻译存在表名带条件,导致翻译出问题---- + int index = table.toLowerCase().indexOf(" where "); + if (index != -1) { + table = table.substring(0, index); + log.info("截掉where之后的新表名:" + table); + } + //update-end---author:scott ---date::2024-05-28 for:表单设计器列表翻译存在表名带条件,导致翻译出问题---- + table = table.trim(); /** * 检验表名是否合法 @@ -308,7 +316,7 @@ public class SqlInjectionUtil { } //进一步验证是否存在SQL注入风险 - filterContent(table); + filterContentMulti(table); return table; } @@ -345,7 +353,7 @@ public class SqlInjectionUtil { } //进一步验证是否存在SQL注入风险 - filterContent(field); + filterContentMulti(field); return field; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java index 7d1e61151..83efa1914 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java @@ -28,6 +28,10 @@ public class TokenUtils { * @return */ public static String getTokenByRequest(HttpServletRequest request) { + if (request == null) { + return null; + } + String token = request.getParameter("token"); if (token == null) { token = request.getHeader("X-Access-Token"); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java index 38b172f99..ffcc553d2 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java @@ -38,6 +38,11 @@ public class DynamicDBUtil { String driverClassName = dbSource.getDbDriver(); String url = dbSource.getDbUrl(); + // url配置成 “123” 会触发Druid死循环,一直去重复尝试连接 + if (oConvertUtils.isEmpty(url) || !url.toLowerCase().startsWith("jdbc:")) { + throw new JeecgBootException("数据源URL配置格式不正确!"); + } + String dbUser = dbSource.getDbUsername(); String dbPassword = dbSource.getDbPassword(); dataSource.setDriverClassName(driverClassName); @@ -47,6 +52,8 @@ public class DynamicDBUtil { dataSource.setTestOnBorrow(false); dataSource.setTestOnReturn(false); dataSource.setBreakAfterAcquireFailure(true); + //设置超时时间60秒 + dataSource.setLoginTimeout(60); dataSource.setConnectionErrorRetryAttempts(0); dataSource.setUsername(dbUser); dataSource.setMaxWait(30000); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java index 064359247..a7a975a0d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java @@ -2,7 +2,9 @@ package org.jeecg.common.util; import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; import org.springframework.beans.BeanUtils; @@ -14,10 +16,7 @@ import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.BigInteger; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; +import java.net.*; import java.sql.Date; import java.util.*; import java.util.regex.Matcher; @@ -50,6 +49,27 @@ public class oConvertUtils { return (false); } + + /** + * 返回decode解密字符串 + * + * @param inStr + * @return + */ + public static String decodeString(String inStr) { + if (oConvertUtils.isEmpty(inStr)) { + return null; + } + + try { + inStr = URLDecoder.decode(inStr, "UTF-8"); + } catch (Exception e) { + // 解决:URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "自动" + //e.printStackTrace(); + } + return inStr; + } + public static String decode(String strIn, String sourceCode, String targetCode) { String temp = code2code(strIn, sourceCode, targetCode); return temp; @@ -238,6 +258,20 @@ public class oConvertUtils { return (String.valueOf(i)); } + /** + * 返回常规字符串(只保留字符串中的数字、字母、中文) + * + * @param input + * @return + */ + public static String getNormalString(String input) { + if (oConvertUtils.isEmpty(input)) { + return null; + } + String result = input.replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5]", ""); + return result; + } + public static String getString(String s, String defval) { if (isEmpty(s)) { return (defval); @@ -287,6 +321,22 @@ public class oConvertUtils { return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive()); } + /** + * 解码base64 + * + * @param base64Str base64字符串 + * @return 被加密后的字符串 + */ + public static String decodeBase64Str(String base64Str) { + byte[] byteContent = Base64.decodeBase64(base64Str); + if (byteContent == null) { + return null; + } + String decodedString = new String(byteContent); + return decodedString; + } + + /** * @param request * IP @@ -750,6 +800,16 @@ public class oConvertUtils { } return obj.getClass().isArray(); } + + /** + * 获取集合的大小 + * + * @param collection + * @return + */ + public static int getCollectionSize(Collection collection) { + return collection != null ? collection.size() : 0; + } /** * 判断两个数组是否相等(数组元素不分顺序) @@ -941,5 +1001,32 @@ public class oConvertUtils { } return count; } + + /** + * map转str + * + * @param map + * @return + */ + public static String mapToString(Map map) { + if (map == null || map.size() == 0) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String[] values = entry.getValue(); + sb.append(key).append("="); + sb.append(values != null ? StringUtils.join(values, ",") : ""); + sb.append("&"); + } + + String result = sb.toString(); + if (result.endsWith("&")) { + result = result.substring(0, sb.length() - 1); + } + return result; + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java index 50551e406..9b7345c07 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java @@ -166,22 +166,22 @@ public class ConstAnalyzer implements ExpressionVisitor, ItemsListVisitor { expr.getBetweenExpressionEnd().accept(this); } -// /** -// * 用于处理 OverlapsCondition 类型的表达式 -// * @param overlapsCondition -// */ -// @Override -// public void visit(OverlapsCondition overlapsCondition) { -// constFlag.set(false); -// } -// /** -// * 用于处理 SafeCastExpression 类型的表达式。 -// * @param safeCastExpression -// */ -// @Override -// public void visit(SafeCastExpression safeCastExpression) { -// constFlag.set(false); -// } + /** + * 用于处理 OverlapsCondition 类型的表达式 + * @param overlapsCondition + */ + @Override + public void visit(OverlapsCondition overlapsCondition) { + constFlag.set(false); + } + /** + * 用于处理 SafeCastExpression 类型的表达式。 + * @param safeCastExpression + */ + @Override + public void visit(SafeCastExpression safeCastExpression) { + constFlag.set(false); + } @Override public void visit(EqualsTo expr) { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java index ca6b936a5..6c3c1a1d9 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java @@ -14,7 +14,7 @@ import java.util.Map; /** * 启动程序修改DruidWallConfig配置 * 允许SELECT语句的WHERE子句是一个永真条件 - * @author eightmonth@qq.com + * @author eightmonth * @date 2024/4/8 11:37 */ public class DruidWallConfigRegister implements SpringApplicationRunListener { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java index 3e55b7373..92628df3c 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -128,14 +128,16 @@ public class WebMvcConfiguration implements WebMvcConfigurer { return objectMapper; } - /** - * SpringBootAdmin的Httptrace不见了 - * https://blog.csdn.net/u013810234/article/details/110097201 - */ - @Bean - public InMemoryHttpTraceRepository getInMemoryHttpTrace(){ - return new InMemoryHttpTraceRepository(); - } + //update-begin---author:chenrui ---date:20240514 for:[QQYUN-9247]系统监控功能优化------------ +// /** +// * SpringBootAdmin的Httptrace不见了 +// * https://blog.csdn.net/u013810234/article/details/110097201 +// */ +// @Bean +// public InMemoryHttpTraceRepository getInMemoryHttpTrace(){ +// return new InMemoryHttpTraceRepository(); +// } + //update-end---author:chenrui ---date:20240514 for:[QQYUN-9247]系统监控功能优化------------ /** diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java index 1e27df155..7b03a657d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java @@ -71,7 +71,7 @@ public class LowCodeModeInterceptor implements HandlerInterceptor { if (loginUser == null) { loginUser = commonAPI.getUserByName(JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest())); //当前登录人拥有的角色 - hasRoles = commonAPI.queryUserRoles(loginUser.getUsername()); + hasRoles = commonAPI.queryUserRolesById(loginUser.getId()); } log.info("get loginUser info: {}", loginUser); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java index 90cca20bb..59f643a16 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java @@ -10,6 +10,8 @@ import org.apache.shiro.SecurityUtils; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.TenantConstant; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; import org.springframework.stereotype.Component; @@ -94,7 +96,17 @@ public class MybatisInterceptor implements Interceptor { field.setAccessible(false); if (localTenantId == null) { field.setAccessible(true); - field.set(parameter, oConvertUtils.getInt(TenantContext.getTenant(),0)); + + String tenantId = TenantContext.getTenant(); + //如果通过线程获取租户ID为空,则通过当前请求的request获取租户(shiro排除拦截器的请求会获取不到租户ID) + if(oConvertUtils.isEmpty(tenantId) && MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ + try { + tenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest()); + } catch (Exception e) { + //e.printStackTrace(); + } + } + field.set(parameter, tenantId); field.setAccessible(false); } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java index 24cfef988..b170fe09f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java @@ -30,7 +30,7 @@ import net.sf.jsqlparser.expression.LongValue; * */ @Configuration -@MapperScan(value={"org.jeecg.modules.**.mapper*"}) +@MapperScan(value={"org.jeecg.**.mapper*"}) public class MybatisPlusSaasConfig { /** diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/IgnoreAuth.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/IgnoreAuth.java index 15a6de792..53062739d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/IgnoreAuth.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/IgnoreAuth.java @@ -6,8 +6,10 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 免认证注解,认证系统结合spring MVC的@RequestMapping获取请求路径进行免登录配置 - * @author eightmonth@qq.com + * 免Token认证注解 + * + * 认证系统结合spring MVC的@RequestMapping获取请求路径进行免登录配置 + * @author eightmonth * @date 2024/2/28 9:58 */ @Target(ElementType.METHOD) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 183d9e660..59bef2e15 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -19,15 +19,14 @@ import org.jeecg.config.shiro.filters.JwtFilter; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.*; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.env.Environment; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.util.CollectionUtils; -import org.springframework.util.StopWatch; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.filter.DelegatingFilterProxy; @@ -58,6 +57,7 @@ public class ShiroConfig { private JeecgBaseConfig jeecgBaseConfig; @Autowired(required = false) private RedisProperties redisProperties; + /** * Filter Chain定义说明 * @@ -87,6 +87,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas验证登录 filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //登录验证码接口排除 filterChainDefinitionMap.put("/sys/checkCaptcha", "anon"); //登录验证码接口排除 + filterChainDefinitionMap.put("/sys/smsCheckCaptcha", "anon"); //短信次数发送太多验证码排除 filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除 filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除 @@ -270,6 +271,9 @@ public class ShiroConfig { } /** + * RedisConfig在项目starter项目中 + * jeecg-boot-starter-github\jeecg-boot-common\src\main\java\org\jeecg\common\modules\redis\config\RedisConfig.java + * * 配置shiro redisManager * 使用的是shiro-redis开源插件 * @@ -324,4 +328,18 @@ public class ShiroConfig { return manager; } + private List rebuildUrl(String[] bases, String[] uris) { + List urls = new ArrayList<>(); + for (String base : bases) { + for (String uri : uris) { + urls.add(prefix(base)+prefix(uri)); + } + } + return urls; + } + + private String prefix(String seg) { + return seg.startsWith("/") ? seg : "/"+seg; + } + } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java index 5aa048de3..9314d39e7 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java @@ -71,7 +71,7 @@ public class ShiroRealm extends AuthorizingRealm { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 设置用户拥有的角色集合,比如“admin,test” - Set roleSet = commonApi.queryUserRoles(username); + Set roleSet = commonApi.queryUserRolesById(userId); //System.out.println(roleSet.toString()); info.setRoles(roleSet); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java index 8f29dd28f..095f0db6f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java @@ -52,6 +52,7 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { if (InMemoryIgnoreAuth.contains(((HttpServletRequest) request).getServletPath())) { return true; } + executeLogin(request, response); return true; } catch (Exception e) { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java index 1be83b5f7..fdfe6c3b9 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java @@ -1,6 +1,7 @@ package org.jeecg.config.shiro.ignore; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.jeecg.config.shiro.IgnoreAuth; import org.springframework.aop.framework.Advised; import org.springframework.context.ApplicationContext; @@ -8,7 +9,6 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import org.springframework.util.StopWatch; import org.springframework.web.bind.annotation.*; import java.lang.reflect.Method; @@ -16,9 +16,10 @@ import java.util.*; /** * 在spring boot初始化时,根据@RestController注解获取当前spring容器中的bean - * @author eightmonth@qq.com + * @author eightmonth * @date 2024/4/18 11:35 */ +@Slf4j @Component @AllArgsConstructor public class IgnoreAuthPostProcessor implements ApplicationListener { @@ -27,6 +28,8 @@ public class IgnoreAuthPostProcessor implements ApplicationListener ignoreAuthUrls = new ArrayList<>(); if (event.getApplicationContext().getParent() == null) { // 只处理根应用上下文的事件,避免在子上下文中重复处理 @@ -39,9 +42,15 @@ public class IgnoreAuthPostProcessor implements ApplicationListener postProcessRestController(Object restController) { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java index 4c6788cb6..bd6a5805c 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java @@ -6,7 +6,7 @@ import java.util.List; /** * 使用内存存储通过@IgnoreAuth注解的url,配合JwtFilter进行免登录校验 * PS:无法使用ThreadLocal进行存储,因为ThreadLocal装载时,JwtFilter已经初始化完毕,导致该类获取ThreadLocal为空 - * @author eightmonth@qq.com + * @author eightmonth * @date 2024/4/18 15:02 */ public class InMemoryIgnoreAuth { diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java index 6eb2c149d..0f6389e4d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java @@ -59,7 +59,8 @@ public class HttpUtils { // 获取URL上的参数 Map urlParams = getUrlParams(request); for (Map.Entry entry : urlParams.entrySet()) { - result.put((String)entry.getKey(), (String)entry.getValue()); + //不能直接转成String,否则会有类型转换错误 + result.put((String)entry.getKey(), String.valueOf(entry.getValue())); } Map allRequestParam = new HashMap<>(16); // get请求不需要拿body参数 @@ -69,7 +70,8 @@ public class HttpUtils { // 将URL的参数和body参数进行合并 if (allRequestParam != null) { for (Map.Entry entry : allRequestParam.entrySet()) { - result.put((String)entry.getKey(), (String)entry.getValue()); + //不能直接转成String,否则会有类型转换错误 + result.put((String)entry.getKey(), String.valueOf(entry.getValue())); } } return result; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/BaseCommonMapper.xml b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/BaseCommonMapper.xml index 2ed1f4ef5..8f5d80c2e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/BaseCommonMapper.xml +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/BaseCommonMapper.xml @@ -4,7 +4,7 @@ - insert into sys_log (id, log_type, log_content, method, operate_type, request_url, request_type, request_param, ip, userid, username, cost_time, create_time,create_by, tenant_id) + insert into sys_log (id, log_type, log_content, method, operate_type, request_url, request_type, request_param, ip, userid, username, cost_time, create_time,create_by, tenant_id, client_type) values( #{dto.id,jdbcType=VARCHAR}, #{dto.logType,jdbcType=INTEGER}, @@ -20,7 +20,8 @@ #{dto.costTime,jdbcType=BIGINT}, #{dto.createTime,jdbcType=TIMESTAMP}, #{dto.createBy,jdbcType=VARCHAR}, - #{dto.tenantId,jdbcType=INTEGER} + #{dto.tenantId,jdbcType=INTEGER}, + #{dto.clientType,jdbcType=VARCHAR} ) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java index 3bd057c51..bce29d0e2 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java @@ -4,6 +4,8 @@ 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.enums.ClientTerminalTypeEnum; +import org.jeecg.common.util.BrowserUtils; import org.jeecg.modules.base.mapper.BaseCommonMapper; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.common.system.vo.LoginUser; @@ -33,7 +35,7 @@ public class BaseCommonServiceImpl implements BaseCommonService { logDTO.setId(String.valueOf(IdWorker.getId())); } //保存日志(异常捕获处理,防止数据太大存储失败,导致业务失败)JT-238 - try { + try { logDTO.setCreateTime(new Date()); baseCommonMapper.saveLog(logDTO); } catch (Exception e) { @@ -55,6 +57,17 @@ public class BaseCommonServiceImpl implements BaseCommonService { HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); //设置IP地址 sysLog.setIp(IpUtils.getIpAddr(request)); + + try { + //设置客户端 + if(BrowserUtils.isDesktop(request)){ + sysLog.setClientType(ClientTerminalTypeEnum.PC.getKey()); + }else{ + sysLog.setClientType(ClientTerminalTypeEnum.APP.getKey()); + } + } catch (Exception e) { + //e.printStackTrace(); + } } catch (Exception e) { sysLog.setIp("127.0.0.1"); } diff --git a/jeecg-boot-base-core/src/test/java/org/jeecg/test/sqlparse/TestIpUtil.java b/jeecg-boot-base-core/src/test/java/org/jeecg/test/sqlparse/TestIpUtil.java new file mode 100644 index 000000000..8617c48c0 --- /dev/null +++ b/jeecg-boot-base-core/src/test/java/org/jeecg/test/sqlparse/TestIpUtil.java @@ -0,0 +1,41 @@ +package org.jeecg.test.sqlparse; + +import net.sf.jsqlparser.JSQLParserException; +import org.jeecg.common.util.IpUtils; +import org.jeecg.common.util.oConvertUtils; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * @author: scott + * @date: 2024年04月29日 16:48 + */ +public class TestIpUtil { + public static void main(String[] args) { + Map map = new HashMap<>(); + map.put("key1", new String[]{"value1", "value2", "value3"}); + map.put("key4", null); + map.put("key2", new String[]{"value4", "value5"}); + map.put("key3", new String[]{"value6"}); + System.out.println(oConvertUtils.mapToString(map)); + } + + @Test + public void test() { + String ip = "2408:8207:1851:10e0:50bd:1a50:60c8:b030, 115.231.101.180"; + String[] ipAddresses = ip.split(","); + for (String ipAddress : ipAddresses) { + System.out.println(ipAddress); + ipAddress = ipAddress.trim(); + if (IpUtils.isValidIpAddress(ipAddress)) { + System.out.println("ipAddress= " + ipAddress); + } + } + } +} diff --git a/jeecg-module-demo/pom.xml b/jeecg-module-demo/pom.xml index 817ca8cce..41f8c6fee 100644 --- a/jeecg-module-demo/pom.xml +++ b/jeecg-module-demo/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-parent org.jeecgframework.boot - 3.6.3 + 3.7.0 4.0.0 diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/controller/ChatController.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/controller/ChatController.java index e4728b0ed..fe808c202 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/controller/ChatController.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/controller/ChatController.java @@ -16,7 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; * @Date: 2024/1/9 16:30 */ @Controller -@RequestMapping("/ai/chat") +@RequestMapping("/test/ai/chat") public class ChatController { @Autowired diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java index 3a1e51bba..39439e16c 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java @@ -23,6 +23,7 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.DateUtils; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.UUIDGenerator; +import org.jeecg.config.shiro.IgnoreAuth; import org.jeecg.modules.demo.test.entity.JeecgDemo; import org.jeecg.modules.demo.test.service.IJeecgDemoService; import org.springframework.beans.factory.annotation.Autowired; @@ -232,6 +233,7 @@ public class JeecgDemoController extends JeecgController jeecg-system-api org.jeecgframework.boot - 3.6.3 + 3.7.0 4.0.0 diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index b11095ef0..60ee7359d 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -85,6 +85,14 @@ public interface ISysBaseAPI extends CommonAPI { */ @GetMapping("/sys/api/getRolesByUsername") List getRolesByUsername(@RequestParam("username") String username); + + /** + * 7通过用户账号查询角色集合 + * @param userId + * @return + */ + @GetMapping("/sys/api/getRolesByUserId") + List getRolesByUserId(@RequestParam("userId") String userId); /** * 8通过用户账号查询部门集合 @@ -93,6 +101,14 @@ public interface ISysBaseAPI extends CommonAPI { */ @GetMapping("/sys/api/getDepartIdsByUsername") List getDepartIdsByUsername(@RequestParam("username") String username); + + /** + * 8通过用户账号查询部门集合 + * @param userId + * @return 部门 id + */ + @GetMapping("/sys/api/getDepartIdsByUserId") + List getDepartIdsByUserId(@RequestParam("userId") String userId); /** * 8.2 通过用户账号查询部门父ID集合 @@ -304,6 +320,14 @@ public interface ISysBaseAPI extends CommonAPI { */ @GetMapping("/sys/api/getUserRoleSet") Set getUserRoleSet(@RequestParam("username")String username); + + /** + * 30获取用户的角色集合 + * @param userId + * @return + */ + @GetMapping("/sys/api/getUserRoleSetById") + Set getUserRoleSetById(@RequestParam("userId")String userId); /** * 31获取用户的权限集合 @@ -348,6 +372,15 @@ public interface ISysBaseAPI extends CommonAPI { @Override @GetMapping("/sys/api/queryUserRoles") Set queryUserRoles(@RequestParam("username")String username); + + /** + * 35查询用户角色信息 + * @param userId + * @return + */ + @Override + @GetMapping("/sys/api/queryUserRolesById") + Set queryUserRolesById(@RequestParam("userId")String userId); /** * 36查询用户权限信息 @@ -387,6 +420,15 @@ public interface ISysBaseAPI extends CommonAPI { @SensitiveDecode @GetMapping("/sys/api/getUserByName") LoginUser getUserByName(@RequestParam("username") String username); + + /** + * 39根据用户账号查询用户ID CommonAPI中定义 + * @param username + * @return 用户ID + */ + @Override + @GetMapping("/sys/api/getUserIdByName") + String getUserIdByName(@RequestParam("username") String username); /** * 40字典表的 翻译 @@ -609,7 +651,7 @@ public interface ISysBaseAPI extends CommonAPI { * @param dataLogDto */ @PostMapping("/sys/api/saveDataLog") - void saveDataLog(DataLogDTO dataLogDto); + void saveDataLog(@RequestBody DataLogDTO dataLogDto); /** * 更新头像 diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java index ec04e2263..ce54f8858 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java @@ -60,11 +60,21 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public List getRolesByUserId(String userId) { + return null; + } + @Override public List getDepartIdsByUsername(String username) { return null; } + @Override + public List getDepartIdsByUserId(String userId) { + return null; + } + @Override public Set getDepartParentIdsByUsername(String username) { return null; @@ -193,6 +203,11 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public Set getUserRoleSetById(String userId) { + return null; + } + @Override public Set getUserPermissionSet(String userId) { return null; @@ -218,6 +233,11 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public Set queryUserRolesById(String userId) { + return null; + } + @Override public Set queryUserAuths(String userId) { return null; @@ -239,6 +259,11 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public String getUserIdByName(String username) { + return null; + } + @Override public String translateDictFromTable(String table, String text, String code, String key) { return null; diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml index cfaaefe54..beaac48f0 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml @@ -5,7 +5,7 @@ jeecg-system-api org.jeecgframework.boot - 3.6.3 + 3.7.0 4.0.0 diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index b5a27223f..fd5e8c0c1 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -81,6 +81,13 @@ public interface ISysBaseAPI extends CommonAPI { * @return */ List getRolesByUsername(String username); + + /** + * 7通过用户账号查询角色集合 + * @param userId + * @return + */ + List getRolesByUserId(String userId); /** * 8通过用户账号查询部门集合 @@ -88,6 +95,12 @@ public interface ISysBaseAPI extends CommonAPI { * @return 部门 id */ List getDepartIdsByUsername(String username); + /** + * 8通过用户账号查询部门集合 + * @param userId + * @return 部门 id + */ + List getDepartIdsByUserId(String userId); /** * 8.2 通过用户账号查询部门父ID集合 @@ -299,7 +312,13 @@ public interface ISysBaseAPI extends CommonAPI { * @return */ Set getUserRoleSet(String username); - + /** + * 31获取用户的角色集合 + * @param useId + * @return + */ + Set getUserRoleSetById(String useId); + /** * 32获取用户的权限集合 * @param userId diff --git a/jeecg-module-system/jeecg-system-api/pom.xml b/jeecg-module-system/jeecg-system-api/pom.xml index 65cc3569c..576bfa5c4 100644 --- a/jeecg-module-system/jeecg-system-api/pom.xml +++ b/jeecg-module-system/jeecg-system-api/pom.xml @@ -5,7 +5,7 @@ jeecg-module-system org.jeecgframework.boot - 3.6.3 + 3.7.0 4.0.0 diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml index 571652cbf..6c21b2bdf 100644 --- a/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-module-system/jeecg-system-biz/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-module-system - 3.6.3 + 3.7.0 4.0.0 @@ -29,17 +29,16 @@ org.jeecgframework jeewx-api - + org.jeecgframework.jimureport jimureport-spring-boot-starter - org.jeecgframework.jimureport jimureport-drag - + + + + + - + + + + delete from sys_tenant_pack_perms + where pack_id in( + select id from sys_tenant_pack where tenant_id in + + #{tenantId} + + ) + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml index 104d79a97..dc5e411b6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml @@ -136,6 +136,7 @@ SELECT distinct a.permission_id FROM sys_tenant_pack_perms a INNER JOIN sys_tenant_pack b ON a.pack_id = b.id AND b.STATUS = '1' + INNER JOIN sys_tenant st ON st.id = b.tenant_id and st.del_flag = 0 INNER JOIN sys_tenant_pack_user c ON c.pack_id = b.id AND c.STATUS = '1' AND c.user_id = #{userId,jdbcType=VARCHAR} ) and p.del_flag = 0 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml index fe9098247..831bc2b5f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml @@ -20,5 +20,14 @@ SELECT * from sys_role WHERE role_code = #{roleCode} - + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml index 9747d3e06..49dbb4fc4 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml @@ -132,5 +132,12 @@ and a.tenant_id = #{tenantId} and b.user_id = #{userId} + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackMapper.xml index 85b5a67c5..b59f61da0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackMapper.xml @@ -2,4 +2,12 @@ + + + delete from sys_tenant_pack + where tenant_id in + + #{tenantId} + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackUserMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackUserMapper.xml index 4bed11ce3..e9c7f13df 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackUserMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackUserMapper.xml @@ -23,4 +23,22 @@ and stpu.user_id = #{userId} and stp.pack_code in('superAdmin','accountAdmin') + + + + delete from sys_tenant_pack_user where tenant_id = #{tenantId} + and user_id in + + #{userId} + + + + + + delete from sys_tenant_pack_user + where tenant_id in + + #{tenantId} + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml index 1c0772e15..2472f7518 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml @@ -6,6 +6,11 @@ + + + - select su.id,su.username,su.realname,su.sex,su.avatar from sys_user su + select su.id,su.username,su.realname,su.sex,su.avatar,su.create_time,sut.create_by from sys_user su join sys_user_tenant sut on sut.user_id = su.id and sut.status = '2' where su.status = 1 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java index c7d0ba29a..612404532 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java @@ -43,7 +43,15 @@ public interface ISysAnnouncementService extends IService { * @param msgCategory 消息类型 * @return Page */ - public Page querySysCementPageByUserId(Page page, String userId, String msgCategory); + public Page querySysCementPageByUserId(Page page, String userId, String msgCategory, Integer tenantId, Date beginDate); + + /** + * 获取用户未读消息数量 + * + * @param userId 用户id + * @return + */ + public Integer getUnreadMessageCountByUserId(String userId, Date beginDate); /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index 04caf35ea..b0bd587e8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -103,6 +103,14 @@ public interface ISysDepartService extends IService{ * @return */ List queryDepartsByUsername(String username); + + /** + * 根据用户ID查询部门 + * + * @param userId + * @return + */ + List queryDepartsByUserId(String userId); /** * 根据部门id批量删除并删除其可能存在的子级部门 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantPackService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantPackService.java index f669238ea..057a72936 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantPackService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantPackService.java @@ -37,7 +37,7 @@ public interface ISysTenantPackService extends IService { * 删除租户产品包 * @param ids */ - void deletePackPermissions(String ids); + void deleteTenantPack(String ids); /** * 退出租户 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java index e9cc6b9cd..035c69fc8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java @@ -217,4 +217,19 @@ public interface ISysTenantService extends IService { * @param content */ void sendMsgForAgreeAndRefuseJoin(SysUser user, String content); + + /** + * 根据密码删除当前用户 + * + * @param sysUser + * @param tenantId + */ + void deleteUserByPassword(SysUser sysUser, Integer tenantId); + + /** + * 根据用户id获取租户信息 + * @param userId + * @return + */ + List getTenantListByUserId(String userId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index 83afd030c..8a9a0b70f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java @@ -89,7 +89,7 @@ public interface ISysUserService extends IService { * @param user * @param roles */ - public void addUserWithRole(SysUser user,String roles); + public void addUserWithRole(SysUser user, String roles); /** @@ -97,7 +97,7 @@ public interface ISysUserService extends IService { * @param user * @param roles */ - public void editUserWithRole(SysUser user,String roles); + public void editUserWithRole(SysUser user, String roles); /** * 获取用户的授权角色 @@ -113,7 +113,7 @@ public interface ISysUserService extends IService { * @param version 前端UI版本 * @return */ - public SysRoleIndex getDynamicIndexByUserRole(String username,String version); + public SysRoleIndex getDynamicIndexByUserRole(String username, String version); /** * 查询用户信息包括 部门信息 @@ -177,7 +177,7 @@ public interface ISysUserService extends IService { * @param username 用户账户名称 * @return */ - public IPage getUserByRoleId(Page page,String roleId, String username); + public IPage getUserByRoleId(Page page, String roleId, String username); /** * 通过用户名获取用户角色集合 @@ -186,6 +186,14 @@ public interface ISysUserService extends IService { * @return 角色集合 */ Set getUserRolesSet(String username); + + /** + * 通过用户名获取用户角色集合 + * + * @param userId 用户id + * @return 角色集合 + */ + Set getUserRoleSetById(String userId); /** * 通过用户名获取用户权限集合 @@ -347,7 +355,7 @@ public interface ISysUserService extends IService { * @param sysUser * @return */ - Result setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result result); + Result setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result result); //--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 --- /** @@ -417,4 +425,21 @@ public interface ISysUserService extends IService { * @param ids */ void checkUserAdminRejectDel(String ids); + + /** + * 修改手机号 + * + * @param json + * @param username + */ + void changePhone(JSONObject json, String username); + + /** + * 发送短信验证码 + * + * @param jsonObject + * @param username 用户名 + * @param ipAddress ip地址 + */ + void sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java index 4fa03b565..4127474bc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.DateRangeUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.system.entity.SysAnnouncement; @@ -139,14 +140,19 @@ public class SysAnnouncementServiceImpl extends ServiceImpl querySysCementPageByUserId(Page page, String userId, String msgCategory) { + public Page querySysCementPageByUserId(Page page, String userId, String msgCategory, Integer tenantId, Date beginDate) { if (page.getSize() == -1) { - return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(null, userId, msgCategory)); + return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(null, userId, msgCategory,tenantId,beginDate)); } else { - return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(page, userId, msgCategory)); + return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(page, userId, msgCategory,tenantId,beginDate)); } } + @Override + public Integer getUnreadMessageCountByUserId(String userId, Date beginDate) { + return sysAnnouncementMapper.getUnreadMessageCountByUserId(userId, beginDate); + } + @Override public void completeAnnouncementSendInfo() { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index c68e6724f..6231e5ba1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -157,6 +157,18 @@ public class SysBaseApiImpl implements ISysBaseAPI { return user; } + + @Override + @Cacheable(cacheNames=CommonConstant.SYS_USER_ID_MAPPING_CACHE, key="#username") + public String getUserIdByName(String username) { + if (oConvertUtils.isEmpty(username)) { + return null; + } + String userId = userMapper.getUserIdByName(username); + return userId; + } + + @Override public String translateDictFromTable(String table, String text, String code, String key) { return sysDictService.queryTableDictTextByKey(table, text, code, key); @@ -265,9 +277,12 @@ public class SysBaseApiImpl implements ISysBaseAPI { // } if(user!=null) { + info.setSysUserId(user.getId()); info.setSysUserCode(user.getUsername()); info.setSysUserName(user.getRealname()); info.setSysOrgCode(user.getOrgCode()); + info.setSysOrgId(user.getOrgId()); + info.setSysRoleCode(user.getRoleCode()); }else{ return null; } @@ -311,6 +326,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { public List getRolesByUsername(String username) { return sysUserRoleMapper.getRoleByUserName(username); } + + @Override + public List getRolesByUserId(String userId) { + return sysUserRoleMapper.getRoleCodeByUserId(userId); + } @Override public List getDepartIdsByUsername(String username) { @@ -321,6 +341,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { } return result; } + + @Override + public List getDepartIdsByUserId(String userId) { + return sysDepartService.queryDepartsByUserId(userId); + } @Override public Set getDepartParentIdsByUsername(String username) { @@ -1092,6 +1117,20 @@ public class SysBaseApiImpl implements ISysBaseAPI { log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size())); return new HashSet<>(roles); } + + + /** + * 查询用户拥有的角色集合 + * @param useId + * @return + */ + @Override + public Set getUserRoleSetById(String useId) { + // 查询用户拥有的角色集合 + List roles = sysUserRoleMapper.getRoleCodeByUserId(useId); + log.info("-------通过数据库读取用户拥有的角色Rules------useId: " + useId + ",Roles size: " + (roles == null ? 0 : roles.size())); + return new HashSet<>(roles); + } /** * 查询用户拥有的权限集合 @@ -1175,6 +1214,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { return getUserRoleSet(username); } + @Override + public Set queryUserRolesById(String userId) { + return getUserRoleSetById(userId); + } + /** * 查询用户拥有的权限集合 common api 里面的接口实现 * @param userId @@ -1588,25 +1632,33 @@ public class SysBaseApiImpl implements ISysBaseAPI { @Override public void saveDataLog(DataLogDTO dataLogDto) { - SysDataLog entity = new SysDataLog(); - entity.setDataTable(dataLogDto.getTableName()); - entity.setDataId(dataLogDto.getDataId()); - entity.setDataContent(dataLogDto.getContent()); - entity.setType(dataLogDto.getType()); - entity.setDataVersion("1"); - if (oConvertUtils.isNotEmpty(dataLogDto.getCreateName())) { - entity.setCreateBy(dataLogDto.getCreateName()); - } else { - entity.autoSetCreateName(); + try { + SysDataLog entity = new SysDataLog(); + entity.setDataTable(dataLogDto.getTableName()); + entity.setDataId(dataLogDto.getDataId()); + entity.setDataContent(dataLogDto.getContent()); + entity.setType(dataLogDto.getType()); + entity.setDataVersion("1"); + if (oConvertUtils.isNotEmpty(dataLogDto.getCreateName())) { + entity.setCreateBy(dataLogDto.getCreateName()); + } else { + entity.autoSetCreateName(); + } + sysDataLogService.save(entity); + } catch (Exception e) { + log.warn(e.getMessage(), e); + //e.printStackTrace(); } - sysDataLogService.save(entity); } @Override public void updateAvatar(LoginUser loginUser) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(loginUser, sysUser); - sysUserService.updateById(sysUser); + SysUser sysUser = new SysUser(); + // 创建UpdateWrapper对象 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", loginUser.getId()); // 设置更新条件 + sysUser.setAvatar(loginUser.getAvatar()); // 设置要更新的字段 + sysUserService.update(sysUser, updateWrapper); } @Override diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index edbc814ba..5a3b414f9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -489,6 +489,12 @@ public class SysDepartServiceImpl extends ServiceImpl queryDepartsByUsername(String username) { return baseMapper.queryDepartsByUsername(username); } + + @Override + public List queryDepartsByUserId(String userId) { + List list = baseMapper.queryDepartsByUserId(userId); + return list; + } /** * 根据用户所负责部门ids获取父级部门编码 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index 010bcd7d6..b044c0498 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -84,8 +84,7 @@ public class SysDictServiceImpl extends ServiceImpl impl // 2.SQL注入check(只限制非法串改数据库) //关联表字典(举例:sys_user,realname,id) - SqlInjectionUtil.filterContent(table); - SqlInjectionUtil.filterContent(fieldName); + SqlInjectionUtil.filterContentMulti(table, fieldName); String checkSql = table + SymbolConstant.COMMA + fieldName + SymbolConstant.COMMA; // 【QQYUN-6533】表字典白名单check @@ -251,7 +250,7 @@ public class SysDictServiceImpl extends ServiceImpl impl } // 3.SQL注入check - SqlInjectionUtil.filterContent(table, text, code); + SqlInjectionUtil.filterContentMulti(table, text, code); SqlInjectionUtil.specialFilterContentForDictSql(filterSql); // 4.针对采用 ${}写法的表名和字段进行转义和check @@ -269,8 +268,7 @@ public class SysDictServiceImpl extends ServiceImpl impl // 1.SQL注入校验(只限制非法串改数据库) SqlInjectionUtil.specialFilterContentForDictSql(table); - SqlInjectionUtil.filterContent(text); - SqlInjectionUtil.filterContent(code); + SqlInjectionUtil.filterContentMulti(text, code); SqlInjectionUtil.specialFilterContentForDictSql(filterSql); String str = table+","+text+","+code; @@ -313,7 +311,7 @@ public class SysDictServiceImpl extends ServiceImpl impl return null; } // 2.sql注入check - SqlInjectionUtil.filterContent(table, text, code, key); + SqlInjectionUtil.filterContentMulti(table, text, code, key); // 3.针对采用 ${}写法的表名和字段进行转义和check table = SqlInjectionUtil.getSqlInjectTableName(table); @@ -358,7 +356,7 @@ public class SysDictServiceImpl extends ServiceImpl impl } // 3.SQL注入check - SqlInjectionUtil.filterContent(table, text, code); + SqlInjectionUtil.filterContentMulti(table, text, code); SqlInjectionUtil.specialFilterContentForDictSql(filterSql); // 4.针对采用 ${}写法的表名和字段进行转义和check @@ -420,7 +418,7 @@ public class SysDictServiceImpl extends ServiceImpl impl } // 2.SQL注入check - SqlInjectionUtil.filterContent(table, text, code); + SqlInjectionUtil.filterContentMulti(table, text, code); SqlInjectionUtil.specialFilterContentForDictSql(filterSql); String str = table+","+text+","+code; @@ -626,9 +624,15 @@ public class SysDictServiceImpl extends ServiceImpl impl pidField = SqlInjectionUtil.getSqlInjectField(pidField); hasChildField = SqlInjectionUtil.getSqlInjectField(hasChildField); + if(oConvertUtils.isEmpty(text) || oConvertUtils.isEmpty(code)){ + log.warn("text={},code={}", text, code); + log.warn("加载树字典参数有误,text和code不允许为空!"); + return null; + } + // 2.检测最终SQL是否存在SQL注入风险 String dictCode = table + "," + text + "," + code; - SqlInjectionUtil.filterContent(dictCode); + SqlInjectionUtil.filterContentMulti(dictCode); // 【QQYUN-6533】表字典白名单check sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); @@ -697,7 +701,7 @@ public class SysDictServiceImpl extends ServiceImpl impl } // 3.SQL注入check - SqlInjectionUtil.filterContent(dictCode); + SqlInjectionUtil.filterContentMulti(dictCode); Page pageList = baseMapper.queryDictTablePageList(page, query); return pageList.getRecords(); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java index bc73d1600..e3123be95 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java @@ -113,10 +113,12 @@ public class SysTenantPackServiceImpl extends ServiceImpl query = new LambdaQueryWrapper<>(); + query.eq(SysTenantPackUser::getPackId, packId); + sysTenantPackUserMapper.delete(query); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java index 01368fecc..7ce355772 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.message.BusMessageDTO; import org.jeecg.common.api.dto.message.MessageDTO; @@ -14,18 +15,18 @@ import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.exception.JeecgBootBizTipException; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.DateUtils; +import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.constant.enums.SysAnnmentTypeEnum; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.aop.TenantLog; import org.jeecg.modules.system.entity.*; -import org.jeecg.modules.system.mapper.SysTenantMapper; -import org.jeecg.modules.system.mapper.SysTenantPackUserMapper; -import org.jeecg.modules.system.mapper.SysUserDepartMapper; -import org.jeecg.modules.system.mapper.SysUserTenantMapper; +import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.service.ISysTenantPackService; import org.jeecg.modules.system.service.ISysTenantService; import org.jeecg.modules.system.service.ISysUserService; @@ -67,6 +68,12 @@ public class SysTenantServiceImpl extends ServiceImpl queryEffectiveTenant(Collection idList) { if(oConvertUtils.listIsEmpty(idList)){ @@ -143,6 +150,8 @@ public class SysTenantServiceImpl extends ServiceImpl tenantIdList) { + //1.删除产品包下的用户 + sysTenantPackUserMapper.deletePackUserByTenantIds(tenantIdList); + //2.删除产品包对应的菜单权限 + sysPackPermissionMapper.deletePackPermByTenantIds(tenantIdList); + //3.删除产品包 + sysTenantPackMapper.deletePackByTenantIds(tenantIdList); + } + + @Override + public void deleteUserByPassword(SysUser sysUser, Integer tenantId) { + //被删除人的用户id + String userId = sysUser.getId(); + //被删除人的密码 + String password = sysUser.getPassword(); + //当前登录用户 + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + //step1 判断当前用户是否为当前租户的管理员(只有超级管理员和账号管理员可以删除) + Long isHaveAdmin = sysTenantPackUserMapper.izHaveBuyAuth(user.getId(), tenantId); + if(null == isHaveAdmin || 0 == isHaveAdmin){ + throw new JeecgBootException("您不是当前组织的管理员,无法删除用户!"); + } + //step2 离职状态下,并且无其他组织情况下,可以删除 + SysUserTenant sysUserTenant = userTenantMapper.getUserTenantByTenantId(userId, tenantId); + if(null == sysUserTenant || !CommonConstant.USER_TENANT_QUIT.equals(sysUserTenant.getStatus())){ + throw new JeecgBootException("用户没有离职,不允许删除!"); + } + List tenantIdsByUserId = userTenantMapper.getTenantIdsByUserId(userId); + if(CollectionUtils.isNotEmpty(tenantIdsByUserId) && tenantIdsByUserId.size()>0){ + throw new JeecgBootException("用户尚有未退出的组织,无法删除!"); + } + //step3 当天创建的用户和创建人可以删除 + SysUser sysUserData = userService.getById(userId); + if(!sysUserData.getCreateBy().equals(user.getUsername())){ + throw new JeecgBootException("您不是该用户的创建人,无法删除!"); + } + Date createTime = sysUserData.getCreateTime(); + boolean sameDay = DateUtils.isSameDay(createTime, new Date()); + if(!sameDay){ + throw new JeecgBootException("用户不是今天创建的,无法删除!"); + } + //step4 验证密码 + String passwordEncode = PasswordUtil.encrypt(sysUserData.getUsername(), password, sysUserData.getSalt()); + if(!passwordEncode.equals(sysUserData.getPassword())){ + throw new JeecgBootException("您输入的密码不正确,无法删除该用户!"); + } + //step5 逻辑删除用户 + userService.deleteUser(userId); + //step6 真实删除用户 + userService.removeLogicDeleted(Collections.singletonList(userId)); + } + + @Override + public List getTenantListByUserId(String userId) { + return tenantMapper.getTenantListByUserId(userId); + } + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java index 730626c6b..a33ddccfa 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java @@ -72,6 +72,7 @@ public class SysThirdAccountServiceImpl extends ServiceImpl impl @Autowired private SysThirdAccountMapper sysThirdAccountMapper; @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; + ThirdAppDingtalkServiceImpl dingtalkService; @Autowired - SysRoleIndexMapper sysRoleIndexMapper; + ISysRoleIndexService sysRoleIndexService; @Autowired - SysTenantMapper sysTenantMapper; + SysTenantMapper sysTenantMapper; @Autowired private SysUserTenantMapper relationMapper; @Autowired @@ -123,6 +125,9 @@ public class SysUserServiceImpl extends ServiceImpl impl @Autowired private ISysThirdAccountService sysThirdAccountService; + + @Autowired + private RedisUtil redisUtil; @Override public Result> queryPageList(HttpServletRequest req, QueryWrapper queryWrapper, Integer pageSize, Integer pageNo) { @@ -158,6 +163,20 @@ public class SysUserServiceImpl extends ServiceImpl impl } //update-end-author:taoyan--date:20220104--for: JTC-372 【用户冻结问题】 online授权、用户组件,选择用户都能看到被冻结的用户 + //update-begin---author:wangshuai---date:2024-03-08---for:【QQYUN-8110】在线通讯录支持设置权限(只能看分配的技术支持)--- + String tenantId = TokenUtils.getTenantIdByRequest(req); + String lowAppId = TokenUtils.getLowAppIdByRequest(req); +// Object bean = ResourceUtil.getImplementationClass(DataEnhanceEnum.getClassPath(tenantId,lowAppId)); +// if(null != bean){ +// UserFilterEnhance userEnhanceService = (UserFilterEnhance) bean; +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// List userIds = userEnhanceService.getUserIds(sysUser.getId()); +// if(CollectionUtil.isNotEmpty(userIds)){ +// queryWrapper.in("id", userIds); +// } +// } + //update-end---author:wangshuai---date:2024-03-08---for:【QQYUN-8110】在线通讯录支持设置权限(只能看分配的技术支持)--- + //TODO 外部模拟登陆临时账号,列表不显示 queryWrapper.ne("username", "_reserve_user_external"); Page page = new Page(pageNo, pageSize); @@ -169,7 +188,6 @@ public class SysUserServiceImpl extends ServiceImpl impl List userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList()); if (userIds != null && userIds.size() > 0) { Map useDepNames = this.getDepNamesByUserIds(userIds); - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); pageList.getRecords().forEach(item -> { item.setOrgCodeTxt(useDepNames.get(item.getId())); //查询用户的租户ids @@ -181,14 +199,14 @@ public class SysUserServiceImpl extends ServiceImpl impl } Integer posTenantId = null; if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - posTenantId = tenantId; + posTenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);; } //查询用户职位关系表(获取租户下面的) //update-begin---author:wangshuai---date:2023-11-15---for:【QQYUN-7028】用户职务保存后未回显--- List positionList = sysUserPositionMapper.getPositionIdByUserTenantId(item.getId(),posTenantId); //update-end---author:wangshuai---date:2023-11-15---for:【QQYUN-7028】用户职务保存后未回显--- //update-end---author:wangshuai ---date:20230228 for:[QQYUN-4354]加入更多字段:当前加入时间应该取当前租户的/职位也是当前租户下的------------ - item.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA)); + item.setPost(CommonUtils.getSplitText(positionList, SymbolConstant.COMMA)); //update-begin---author:wangshuai---date:2023-10-08---for:【QQYUN-6668】钉钉部门和用户同步,我怎么知道哪些用户是双向绑定成功的--- //是否根据租户隔离(敲敲云用户列表专用,用于展示是否同步钉钉) @@ -251,7 +269,13 @@ public class SysUserServiceImpl extends ServiceImpl impl @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) @Transactional(rollbackFor = Exception.class) public boolean deleteUser(String userId) { - //1.删除用户 + //update-begin---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】admin用户禁止删除--- + //1.验证当前用户是管理员账号 admin + //验证用户是否为管理员 + this.checkUserAdminRejectDel(userId); + //update-end---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】admin用户禁止删除--- + + //2.删除用户 this.removeById(userId); return false; } @@ -260,7 +284,9 @@ public class SysUserServiceImpl extends ServiceImpl impl @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) @Transactional(rollbackFor = Exception.class) public boolean deleteBatchUsers(String userIds) { - //1.删除用户 + //1.验证当前用户是管理员账号 admin + this.checkUserAdminRejectDel(userIds); + //2.删除用户 this.removeByIds(Arrays.asList(userIds.split(","))); return false; } @@ -318,33 +344,40 @@ public class SysUserServiceImpl extends ServiceImpl impl /** * 获取动态首页路由配置 + * * @param username * @param version * @return */ @Override - public SysRoleIndex getDynamicIndexByUserRole(String username,String version) { + public SysRoleIndex getDynamicIndexByUserRole(String username, String version) { List roles = sysUserRoleMapper.getRoleByUserName(username); String componentUrl = RoleIndexConfigEnum.getIndexByRoles(roles); SysRoleIndex roleIndex = new SysRoleIndex(componentUrl); + boolean isV3 = CommonConstant.VERSION_V3.equals(version); //只有 X-Version=v3 的时候,才读取sys_role_index表获取角色首页配置 - if (oConvertUtils.isNotEmpty(version) && roles!=null && roles.size()>0) { - LambdaQueryWrapper routeIndexQuery = new LambdaQueryWrapper(); + if (isV3 && CollectionUtils.isNotEmpty(roles)) { + LambdaQueryWrapper routeIndexQuery = new LambdaQueryWrapper<>(); //用户所有角色 routeIndexQuery.in(SysRoleIndex::getRoleCode, roles); //角色首页状态0:未开启 1:开启 routeIndexQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1); //优先级正序排序 routeIndexQuery.orderByAsc(SysRoleIndex::getPriority); - List list = sysRoleIndexMapper.selectList(routeIndexQuery); - if (null != list && list.size() > 0) { + List list = sysRoleIndexService.list(routeIndexQuery); + if (CollectionUtils.isNotEmpty(list)) { roleIndex = list.get(0); } } - - //如果componentUrl为空,则返回空 - if(oConvertUtils.isEmpty(roleIndex.getComponent())){ - return null; + + if (oConvertUtils.isEmpty(roleIndex.getComponent())) { + if (isV3) { + // 如果角色没有配置首页,则使用默认首页 + return sysRoleIndexService.queryDefaultIndex(); + } else { + // 非v3返回null + return null; + } } return roleIndex; } @@ -361,17 +394,30 @@ public class SysUserServiceImpl extends ServiceImpl impl log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size())); return new HashSet<>(roles); } + + /** + * 通过用户名获取用户角色集合 + * @param userId 用户ID + * @return 角色集合 + */ + @Override + public Set getUserRoleSetById(String userId) { + // 查询用户拥有的角色集合 + List roles = sysUserRoleMapper.getRoleCodeByUserId(userId); + log.info("-------通过数据库读取用户拥有的角色Rules------userId: " + userId + ",Roles size: " + (roles == null ? 0 : roles.size())); + return new HashSet<>(roles); + } /** * 通过用户名获取用户权限集合 * - * @param username 用户名 + * @param userId 用户ID * @return 权限集合 */ @Override - public Set getUserPermissionsSet(String username) { + public Set getUserPermissionsSet(String userId) { Set permissionSet = new HashSet<>(); - List permissionList = sysPermissionMapper.queryByUser(username); + List permissionList = sysPermissionMapper.queryByUser(userId); //================= begin 开启租户的时候 如果没有test角色,默认加入test角色================ if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { if (permissionList == null) { @@ -390,7 +436,7 @@ public class SysUserServiceImpl extends ServiceImpl impl permissionSet.add(po.getPerms()); } } - log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) ); + log.info("-------通过数据库读取用户拥有的权限Perms------userId: "+ userId+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) ); return permissionSet; } @@ -444,7 +490,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public IPage getUserByDepId(Page page, String departId,String username) { + public IPage getUserByDepId(Page page, String departId, String username) { return userMapper.getUserByDepId(page, departId,username); } @@ -487,7 +533,7 @@ public class SysUserServiceImpl extends ServiceImpl impl //根据部门orgCode查询部门,需要将职位id进行传递 for (SysUserSysDepartModel model:list) { List positionList = sysUserPositionMapper.getPositionIdByUserId(model.getId()); - model.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA)); + model.setPost(CommonUtils.getSplitText(positionList, SymbolConstant.COMMA)); } Integer total = baseMapper.getUserByOrgCodeTotal(orgCode, userParams); @@ -796,7 +842,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } @Override - @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") + @Cacheable(cacheNames= CacheConstant.SYS_USERS_CACHE, key="#username") @SensitiveEncode public LoginUser getEncodeUserInfo(String username){ if(oConvertUtils.isEmpty(username)) { @@ -812,6 +858,10 @@ public class SysUserServiceImpl extends ServiceImpl impl return null; } BeanUtils.copyProperties(sysUser, loginUser); + // 查询当前登录用户的部门id + loginUser.setOrgId(this.getDepartIdByOrCode(sysUser.getOrgCode())); + // 查询当前登录用户的角色code(多个逗号分割) + loginUser.setRoleCode(this.getJoinRoleCodeByUserId(sysUser.getId())); return loginUser; } @@ -835,7 +885,6 @@ public class SysUserServiceImpl extends ServiceImpl impl SysUserTenant userTenant = new SysUserTenant(); userTenant.setStatus(CommonConstant.USER_TENANT_QUIT); userTenantMapper.update(userTenant,query); - //update-end---author:wangshuai ---date:20230111 for:[QQYUN-3951]租户用户离职重构------------ } @Override @@ -854,7 +903,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public Result setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result result){ + public Result setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result result){ // update-begin--Author:sunjianlei Date:20210802 for:获取用户租户信息 //用户有哪些租户 // List tenantList = null; @@ -1294,7 +1343,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * @param orgName * @param orgId */ - private void getParentDepart(SysDepart depart,List orgName,List orgId){ + private void getParentDepart(SysDepart depart, List orgName, List orgId){ String pid = depart.getParentId(); orgName.add(0, depart.getDepartName()); orgId.add(0, depart.getId()); @@ -1422,17 +1471,58 @@ public class SysUserServiceImpl extends ServiceImpl impl private void userPositionId(SysUser sysUser) { if(null != sysUser){ List positionList = sysUserPositionMapper.getPositionIdByUserId(sysUser.getId()); - sysUser.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA)); + sysUser.setPost(CommonUtils.getSplitText(positionList, SymbolConstant.COMMA)); } } + /** + * 查询用户当前登录部门的id + * + * @param orgCode + */ + private @Nullable String getDepartIdByOrCode(String orgCode) { + if (oConvertUtils.isEmpty(orgCode)) { + return null; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDepart::getOrgCode, orgCode); + queryWrapper.select(SysDepart::getId); + SysDepart depart = sysDepartMapper.selectOne(queryWrapper); + if (depart == null || oConvertUtils.isEmpty(depart.getId())) { + return null; + } + return depart.getId(); + } + + /** + * 查询用户的角色code(多个逗号分割) + * + * @param userId + */ + private @Nullable String getJoinRoleCodeByUserId(String userId) { + if (oConvertUtils.isEmpty(userId)) { + return null; + } + // 判断是否开启saas模式,根据租户id过滤 + Integer tenantId = null; + if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { + // 开启了但是没有租户ID,默认-1,使其查询不到任何数据 + tenantId = oConvertUtils.getInt(TenantContext.getTenant(), -1); + } + List roleList = sysRoleMapper.getRoleCodeListByUserId(userId, tenantId); + if (CollectionUtils.isEmpty(roleList)) { + return null; + } + return roleList.stream().map(SysRole::getRoleCode).collect(Collectors.joining(SymbolConstant.COMMA)); + } + /** * 移除部门负责人 * @param departChargeUserIdList * @param departChargeUsers * @param departId */ - private void removeDepartmentManager(List departChargeUserIdList,List departChargeUsers,String departId){ + private void removeDepartmentManager(List departChargeUserIdList, List departChargeUsers, String departId){ //移除部门负责人 for(String chargeUserId: departChargeUserIdList){ for(SysUser chargeUser: departChargeUsers){ @@ -1796,6 +1886,9 @@ public class SysUserServiceImpl extends ServiceImpl impl String title = sysUser.getRealname() + " 邀请您加入 " + tenantName + "。"; messageDTO.setTitle(title); Map data = new HashMap<>(); + //update-begin---author:wangshuai---date:2024-03-11---for:【QQYUN-8425】用户导入成功后 消息提醒 跳转至同意页面--- + data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, SysAnnmentTypeEnum.TENANT_INVITE.getType()); + //update-end---author:wangshuai---date:2024-03-11---for:【QQYUN-8425】用户导入成功后 消息提醒 跳转至同意页面--- messageDTO.setData(data); messageDTO.setContent(title); messageDTO.setToUser(invitedUsername); @@ -1804,6 +1897,7 @@ public class SysUserServiceImpl extends ServiceImpl impl //update-end---author:wangshuai ---date:20230710 for:【QQYUN-5731】导入用户时,没有提醒------------ } //======================================= end 用户与部门 用户列表导入 ========================================= + @Override public void checkUserAdminRejectDel(String userIds) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); @@ -1815,4 +1909,118 @@ public class SysUserServiceImpl extends ServiceImpl impl throw new JeecgBootException("admin用户,不允许删除!"); } } + + @Override + public void changePhone(JSONObject json, String username) { + String smscode = json.getString("smscode"); + String phone = json.getString("phone"); + String type = json.getString("type"); + if(oConvertUtils.isEmpty(phone)){ + throw new JeecgBootException("请填写原手机号!"); + } + if(oConvertUtils.isEmpty(smscode)){ + throw new JeecgBootException("请填写验证码!"); + } + //step1 验证原手机号是否和当前用户匹配 + SysUser sysUser = userMapper.getUserByNameAndPhone(phone,username); + if (null == sysUser){ + throw new JeecgBootException("原手机号不匹配,无法修改密码!"); + } + //step2 根据类型判断是验证原手机号的验证码还是新手机号的验证码 + //验证原手机号 + if(CommonConstant.VERIFY_ORIGINAL_PHONE.equals(type)){ + this.verifyPhone(phone, smscode); + }else if(CommonConstant.UPDATE_PHONE.equals(type)){ + //修改手机号 + String newPhone = json.getString("newPhone"); + //需要验证新手机号和原手机号是否一致,一致不让修改 + if(newPhone.equals(phone)){ + throw new JeecgBootException("新手机号与原手机号一致,无法修改!"); + } + this.verifyPhone(newPhone, smscode); + //step3 新手机号验证码验证成功之后即可修改手机号 + sysUser.setPhone(newPhone); + userMapper.updateById(sysUser); + } + } + + /** + * 验证手机号 + * + * @param phone + * @param smsCode + * @return + */ + public void verifyPhone(String phone, String smsCode){ + String phoneKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE + phone; + Object phoneCode = redisUtil.get(phoneKey); + if(null == phoneCode){ + throw new JeecgBootException("验证码失效,请重新发送验证码!"); + } + if(!smsCode.equals(phoneCode.toString())) { + throw new JeecgBootException("短信验证码不匹配!"); + } + //验证完成之后清空手机验证码 + redisUtil.removeAll(phoneKey); + } + + @Override + public void sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress) { + String type = jsonObject.getString("type"); + String phone = jsonObject.getString("phone"); + if(oConvertUtils.isEmpty(phone)){ + throw new JeecgBootException("请填写手机号!"); + } + //step1 根据类型判断是发送旧手机号验证码还是新的手机号验证码 + if(CommonConstant.VERIFY_ORIGINAL_PHONE.equals(type)){ + //step2 旧手机号验证码需要验证手机号是否匹配 + SysUser sysUser = userMapper.getUserByNameAndPhone(phone, username); + if(null == sysUser){ + throw new JeecgBootException("旧手机号不匹配,无法修改手机号!"); + } + }else if(CommonConstant.UPDATE_PHONE.equals(type)){ + //step3 新手机号需要验证手机号码是否已注册过 + SysUser userByPhone = userMapper.getUserByPhone(phone); + if(null != userByPhone){ + throw new JeecgBootException("手机号已被注册,请尝试其他手机号!"); + } + } + //step4 发送短信验证码 + this.sendPhoneSms(phone, ipAddress); + } + + /** + * 发送短信验证码 + * @param phone + */ + private void sendPhoneSms(String phone, String clientIp) { + String redisKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE+phone; + Object object = redisUtil.get(redisKey); + + if (object != null) { + throw new JeecgBootException("验证码10分钟内,仍然有效!"); + } + + //增加 check防止恶意刷短信接口 + if(!DySmsLimit.canSendSms(clientIp)){ + log.warn("--------[警告] IP地址:{}, 短信接口请求太多-------", clientIp); + throw new JeecgBootException("短信接口请求太多,请稍后再试!", CommonConstant.PHONE_SMS_FAIL_CODE); + } + + //随机数 + String captcha = RandomUtil.randomNumbers(6); + JSONObject obj = new JSONObject(); + obj.put("code", captcha); + try { + boolean sendSmsSuccess = DySmsHelper.sendSms(phone, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); + if(!sendSmsSuccess){ + throw new JeecgBootException("短信验证码发送失败,请稍后重试!"); + } + //验证码10分钟内有效 + redisUtil.set(redisKey, captcha, 600); + } catch (ClientException e) { + log.error(e.getMessage(),e); + throw new JeecgBootException("短信接口未配置,请联系管理员!"); + } + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java index b224d3230..7cf5ff6a5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java @@ -30,10 +30,7 @@ import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.constant.enums.MessageTypeEnum; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.PasswordUtil; -import org.jeecg.common.util.RestUtil; -import org.jeecg.common.util.SpringContextUtils; -import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.util.*; import org.jeecg.config.JeecgBaseConfig; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.system.entity.*; @@ -233,7 +230,9 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { for (JdtDepartmentTreeVo departmentTree : departmentTreeList) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 根据 source_identifier 字段查询 - queryWrapper.eq(SysDepart::getId, departmentTree.getSource_identifier()); + //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- + queryWrapper.and(item -> item.eq(SysDepart::getId, departmentTree.getSource_identifier()).or().eq(SysDepart::getDingIdentifier,departmentTree.getDept_id())); + //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- SysDepart sysDepart = sysDepartService.getOne(queryWrapper); if (sysDepart != null) { // 执行更新操作 @@ -270,14 +269,21 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { newSysDepart.setOrgCategory("1"); } try { + if(oConvertUtils.isEmpty(departmentTree.getParent_id())){ + newSysDepart.setDingIdentifier(departmentTree.getDept_id().toString()); + } + newSysDepart.setTenantId(tenantId); sysDepartService.saveDepartData(newSysDepart, username); // 更新钉钉 source_identifier Department updateDtDepart = new Department(); updateDtDepart.setDept_id(departmentTree.getDept_id()); updateDtDepart.setSource_identifier(newSysDepart.getId()); - Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken); - if (!response.isSuccess()) { - throw new RuntimeException(response.getErrmsg()); + //为空说明是最顶级部门,最顶级部门不允许修改操作 + if(oConvertUtils.isNotEmpty(newSysDepart.getParentId())){ + Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken); + if (!response.isSuccess()) { + throw new RuntimeException(response.getErrmsg()); + } } String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); syncInfo.addSuccessInfo(str); @@ -1234,7 +1240,7 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ Long count = tenantMapper.tenantIzExist(tenantId); if(ObjectUtil.isEmpty(count) || 0 == count){ - throw new JeecgBootException("租户不存在!"); + throw new JeecgBootException("租户ID:" + tenantId + "无效,平台中不存在!"); } } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java index 63a0464f1..02cda71eb 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java @@ -284,7 +284,9 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { if (sysDepart != null) { // 执行更新操作 SysDepart updateSysDepart = this.qwDepartmentToSysDepart(departmentTree, sysDepart); - if (sysParentId != null) { + //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- + if (sysParentId != null && !"0".equals(sysParentId)) { + //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- updateSysDepart.setParentId(sysParentId); } try { @@ -302,7 +304,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { } else { // 执行新增操作 SysDepart newSysDepart = this.qwDepartmentToSysDepart(departmentTree, null); - if (sysParentId != null) { + if (sysParentId != null && !"0".equals(sysParentId)) { newSysDepart.setParentId(sysParentId); // 2 = 组织机构 newSysDepart.setOrgCategory("2"); @@ -390,7 +392,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { int errCode = JwUserAPI.updateUser(qwUser, accessToken); // 收集错误信息 this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); - this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName()); + this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName(), null); // 更新完成,直接跳到下一次外部循环继续 continue for1; } @@ -400,7 +402,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { // 收集错误信息 boolean apiSuccess = this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); if (apiSuccess) { - this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName()); + this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName(), null); } } return syncInfo; @@ -471,13 +473,16 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { * @param qwUserId 企业微信用户ID * @param wechatRealName 企业微信用户真实姓名 */ - private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String qwUserId, String wechatRealName) { + private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String qwUserId, String wechatRealName, Integer tenantId) { if (sysThirdAccount == null) { sysThirdAccount = new SysThirdAccount(); sysThirdAccount.setSysUserId(sysUserId); sysThirdAccount.setStatus(1); sysThirdAccount.setDelFlag(0); sysThirdAccount.setThirdType(THIRD_TYPE); + if(oConvertUtils.isNotEmpty(tenantId)){ + sysThirdAccount.setTenantId(tenantId); + } } sysThirdAccount.setThirdUserId(qwUserId); sysThirdAccount.setThirdUserUuid(qwUserId); @@ -1184,7 +1189,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { this.createUserTenant(sysUserId,false,tenantId); //step 3 新建或更新第三方账号表 SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(wechatUserId, THIRD_TYPE, tenantId, wechatUserId); - this.thirdAccountSaveOrUpdate(sysThirdAccount,sysUserId,wechatUserId,wechatRealName); + this.thirdAccountSaveOrUpdate(sysThirdAccount,sysUserId,wechatUserId,wechatRealName,tenantId); //step 4 新建或更新用户部门关系表 if(oConvertUtils.isNotEmpty(wechatDepartId)){ String wechatDepartIds = wechatDepartId.toString(); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java index 15619e3ae..9726ca8ab 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java @@ -5,6 +5,7 @@ import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * 钉钉树结构的部门 @@ -48,8 +49,20 @@ public class JdtDepartmentTreeVo extends Department { public static List listToTree(List allDepartment) { // 先找出所有的父级 List treeList = getByParentId(1, allDepartment); + Optional departmentOptional = allDepartment.stream().filter(item -> item.getParent_id() == null).findAny(); + Department department = new Department(); + //判断是否找到数据 + if(departmentOptional.isPresent()){ + department = departmentOptional.get(); + } getChildrenRecursion(treeList, allDepartment); - return treeList; + //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- + JdtDepartmentTreeVo treeVo = new JdtDepartmentTreeVo(department); + treeVo.setChildren(treeList); + List list = new ArrayList<>(); + list.add(treeVo); + return list; + //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- } private static List getByParentId(Integer parentId, List allDepartment) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java index 450ed8dfa..d7d3de1ff 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java @@ -5,6 +5,7 @@ import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * 企业微信树结构的部门 @@ -48,8 +49,20 @@ public class JwDepartmentTreeVo extends Department { public static List listToTree(List allDepartment) { // 先找出所有的父级 List treeList = getByParentId("1", allDepartment); + Optional departmentOptional = allDepartment.stream().filter(item -> "0".equals(item.getParentid())).findAny(); + Department department = new Department(); + //判断是否找到数据 + if(departmentOptional.isPresent()){ + department = departmentOptional.get(); + } getChildrenRecursion(treeList, allDepartment); - return treeList; + //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- + JwDepartmentTreeVo treeVo = new JwDepartmentTreeVo(department); + treeVo.setChildren(treeList); + List list = new ArrayList<>(); + list.add(treeVo); + return list; + //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- } private static List getByParentId(String parentId, List allDepartment) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl index d38ed3694..1d61d2b9d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl @@ -31,7 +31,7 @@ TimePicker, <#if need_pca> - JAreaLinkage, + JAreaSelect, <#if need_upload> JUpload, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl index 0371ea0af..0ac5c9711 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl @@ -8,104 +8,104 @@ <#elseif po.dictField?default("")?trim?length gt 1> <#assign form_field_dictCode="${po.dictField}"> - - - <#if po.classType =='date'> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType =='datetime'> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType =='time'> - <#assign need_time = true> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType =='popup'> - <#assign need_popup = true> - <#assign sourceFields = po.dictField?default("")?trim?split(",")/> - <#assign targetFields = po.dictText?default("")?trim?split(",")/> - disabled<#else>:disabled="disabled"<#rt> - /> - <#elseif po.classType =='sel_depart'> - <#assign need_dept = true> - disabled<#else>:disabled="disabled" /> - <#elseif po.classType =='switch'> - <#assign need_switch = true> - :options="${po.dictField}" <#if po.readonly=='Y'>disabled<#else>:disabled="disabled"> - <#elseif po.classType =='pca'> - <#assign need_pca = true> - disabled<#else>:disabled="disabled" /> - <#elseif po.classType =='markdown'> - <#assign need_markdown = true> - disabled<#else>:disabled="disabled"> - <#elseif po.classType =='password'> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType =='sel_user'> - <#assign need_dept_user = true> - <#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> - disabled<#else>:disabled="disabled"/> - <#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> - <#elseif po.classType =='textarea'> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType=='radio'> - <#assign need_select_tag = true> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType=='list'> - <#assign need_select_tag = true> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType=='list_multi'> - <#assign need_multi = true> - disabled<#else>:disabled="disabled" :triggerChange="false"/> - <#elseif po.classType=='checkbox'> - <#assign need_checkbox = true> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType=='sel_search'> - <#assign need_search = true> - disabled<#else>:disabled="disabled" /> - <#elseif po.classType=='cat_tree'> - <#assign need_category = true> - back="${dashedToCamel(po.dictText)}" <#if po.readonly=='Y'>disabled<#else>:disabled="disabled" @change="(value) => handleFormChange('${po.fieldName}', value)" /> - <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> - disabled<#else>:disabled="disabled"/> - <#elseif po.classType=='file'> - <#assign need_upload = true> - disabled<#else>:disabled="disabled" <#if po.uploadnum??>:maxCount=${po.uploadnum}> - <#elseif po.classType=='image'> - <#assign need_image_upload = true> - :fileMax=${po.uploadnum} v-model:value="formData.${po.fieldName}" <#if po.readonly=='Y'>disabled<#else>:disabled="disabled"> - <#elseif po.classType=='umeditor'> - <#assign need_editor = true> - disabled<#else>:disabled="disabled"/> - <#elseif po.fieldDbType=='Blob'> - disabled<#else>:disabled="disabled"> - <#elseif po.classType == 'sel_tree'> - <#assign need_select_tree = true> - - <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> - dict="${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}" - <#elseif po.dictText?split(',')[1]??> - pidField="${po.dictText?split(',')[1]}" - <#elseif po.dictText?split(',')[3]??> - hasChildField="${po.dictText?split(',')[3]}" - - - pidValue="${po.dictField}" - <#if po.readonly=='Y'>disabled<#else>:disabled="disabled" - v-model:value="formData.${po.fieldName}" - @change="(value) => handleFormChange('${po.fieldName}', value)"> - - <#else> - disabled<#else>:disabled="disabled"> - - - + + + <#if po.classType =='date'> + disabled/> + <#elseif po.classType =='datetime'> + disabled/> + <#elseif po.classType =='time'> + <#assign need_time = true> + disabled/> + <#elseif po.classType =='popup'> + <#assign need_popup = true> + <#assign sourceFields = po.dictField?default("")?trim?split(",")/> + <#assign targetFields = po.dictText?default("")?trim?split(",")/> + disabled<#rt> + /> + <#elseif po.classType =='sel_depart'> + <#assign need_dept = true> + disabled /> + <#elseif po.classType =='switch'> + <#assign need_switch = true> + :options="${po.dictField}" <#if po.readonly=='Y'>disabled> + <#elseif po.classType =='pca'> + <#assign need_pca = true> + disabled /> + <#elseif po.classType =='markdown'> + <#assign need_markdown = true> + disabled> + <#elseif po.classType =='password'> + disabled/> + <#elseif po.classType =='sel_user'> + <#assign need_dept_user = true> + <#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + disabled/> + <#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + <#elseif po.classType =='textarea'> + disabled/> + <#elseif po.classType=='radio'> + <#assign need_select_tag = true> + disabled/> + <#elseif po.classType=='list'> + <#assign need_select_tag = true> + disabled/> + <#elseif po.classType=='list_multi'> + <#assign need_multi = true> + disabled :triggerChange="false"/> + <#elseif po.classType=='checkbox'> + <#assign need_checkbox = true> + disabled/> + <#elseif po.classType=='sel_search'> + <#assign need_search = true> + disabled /> + <#elseif po.classType=='cat_tree'> + <#assign need_category = true> + back="${dashedToCamel(po.dictText)}" <#if po.readonly=='Y'>disabled @change="(value) => handleFormChange('${po.fieldName}', value)" /> + <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + disabled/> + <#elseif po.classType=='file'> + <#assign need_upload = true> + disabled <#if po.uploadnum??>:maxCount=${po.uploadnum}> + <#elseif po.classType=='image'> + <#assign need_image_upload = true> + :fileMax=${po.uploadnum} v-model:value="formData.${po.fieldName}" <#if po.readonly=='Y'>disabled> + <#elseif po.classType=='umeditor'> + <#assign need_editor = true> + disabled/> + <#elseif po.fieldDbType=='Blob'> + disabled> + <#elseif po.classType == 'sel_tree'> + <#assign need_select_tree = true> + + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict="${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}" + <#elseif po.dictText?split(',')[1]??> + pidField="${po.dictText?split(',')[1]}" + <#elseif po.dictText?split(',')[3]??> + hasChildField="${po.dictText?split(',')[3]}" + + + pidValue="${po.dictField}" + <#if po.readonly=='Y'>disabled + v-model:value="formData.${po.fieldName}" + @change="(value) => handleFormChange('${po.fieldName}', value)"> + + <#else> + disabled> + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl new file mode 100644 index 000000000..07c5a0f53 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl @@ -0,0 +1,21 @@ + <#-- 原生查询区域样式 --> + .jeecg-basic-table-form-container { + padding: 0; + .table-page-search-submitButtons { + display: block; + margin-bottom: 24px; + white-space: nowrap; + } + .query-group-cust{ + min-width: 100px !important; + } + .query-group-split-cust{ + width: 30px; + display: inline-block; + text-align: center + } + .ant-form-item:not(.ant-form-item-with-help){ + margin-bottom: 16px; + height: 32px; + } + } \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl index a7b51839b..ae41b7372 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl @@ -3,7 +3,7 @@ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined, <#elseif po.fieldDbType=='Blob'> - ${po.fieldName}String: <#if po.defaultVal??>${po.defaultVal}<#else>'', + ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', <#else> ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl index f7c08282e..177c9220f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl @@ -3,7 +3,7 @@ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined, <#elseif po.fieldDbType=='Blob'> - ${po.fieldName}String: <#if po.defaultVal??>${po.defaultVal}<#else>'', + ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', <#else> ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl index 1513c4448..4281561a6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl @@ -3,7 +3,7 @@ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined, <#elseif po.fieldDbType=='Blob'> - ${po.fieldName}String: <#if po.defaultVal??>${po.defaultVal}<#else>'', + ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', <#else> ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>'', diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl index 89d8a3ccf..f0dd8f0e6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl @@ -151,7 +151,7 @@ <#assign dictCode="dictCode: '${po.dictField}'"> - <#if po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='checkbox'> + <#if po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='checkbox' || po.classType=='radio'> <#assign extAttrs="${dictCode},"> <#elseif po.classType=='cat_tree'> <#-- 分类字典树 --> diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl index c3a2143d5..4684a88a7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl @@ -14,13 +14,13 @@ { validator: (rule, value, callback) => validateDuplicateValue(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}', value, this.model.id, callback)}, <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'}, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, <#-- 6到18位字符串 --> <#elseif fieldValidType == 's6-18'> - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'}, + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, <#-- 网址 --> <#elseif fieldValidType == 'url'> { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl index 2c395d5e4..3764205aa 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl @@ -10,13 +10,13 @@ { validator: ${po.fieldName}Duplicatevalidate }<#rt> <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'}<#rt>, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}<#rt>, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}<#rt>, <#-- 6到18位字符串 --> <#elseif fieldValidType == 's6-18'> - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'}<#rt>, + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},<#rt>, <#-- 网址 --> <#elseif fieldValidType == 'url'> { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}<#rt>, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei index 3a46fab0c..3cfbb1d88 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -132,7 +132,7 @@ //流程表单data formData: { type: Object, - default: ()=>{}, + default: () => ({}), required: false }, //表单模式:true流程表单 false普通表单 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei index 13d8b162e..86b7ab568 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -116,7 +116,9 @@ <#list columns as po> <#if po.isQuery=='Y'> <#if po.queryMode!='single'> - <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + <#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> + <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'> + <#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']], diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi index 10f9782d9..04e922cae 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -122,6 +122,9 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.classType=='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType=='datetime'> component: 'DatePicker', componentProps: { @@ -169,6 +172,10 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> <#else> component: 'Input', //TODO 范围查询 @@ -215,6 +222,9 @@ export const formSchema: FormSchema[] = [ <#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> <#if po.classType =='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType =='datetime'> component: 'DatePicker', componentProps: { @@ -252,12 +262,18 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='textarea'> component: 'InputTextArea', - <#elseif po.classType=='list' || po.classType=='radio'> + <#elseif po.classType=='list'> component: 'JDictSelectTag', componentProps:{ dictCode:"${form_field_dictCode}" }, - <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio" + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> <#elseif po.classType=='list_multi'> component: 'JSelectMultiple', componentProps:{ @@ -334,7 +350,7 @@ export const formSchema: FormSchema[] = [ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'}, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei index 4cfed1259..77fee7a56 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -355,7 +355,9 @@ * @param value */ function handleFormJoinChange(key, value) { - queryParam[key] = value.join(','); + if (typeof value != 'string') { + queryParam[key] = value.join(','); + } } @@ -408,20 +410,5 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi index f84c6e2d4..e6b1e5eba 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -121,6 +121,9 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.classType=='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType=='datetime'> component: 'DatePicker', componentProps: { @@ -201,6 +204,9 @@ export const formSchema: FormSchema[] = [ field: ${autoStringSuffix(po)}, <#if po.classType =='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType =='datetime'> component: 'DatePicker', componentProps: { @@ -238,11 +244,17 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='textarea'> component: 'InputTextArea', - <#elseif po.classType=='list' || po.classType=='radio'> + <#elseif po.classType=='list'> component: 'JDictSelectTag', componentProps:{ - dictCode: "${form_field_dictCode}" - }, + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio" + }, <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> <#elseif po.classType=='list_multi'> component: 'JSelectMultiple', @@ -320,13 +332,13 @@ export const formSchema: FormSchema[] = [ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'}, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, <#-- 6到18位字符串 --> <#elseif fieldValidType == 's6-18'> - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'}, + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, <#-- 网址 --> <#elseif fieldValidType == 'url'> { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei index d2c97c203..ce9d8f8a5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -1,8 +1,10 @@ <#include "/common/utils.ftl"> @@ -56,13 +60,14 @@ import { getValueType } from '/@/utils'; import { saveOrUpdate } from '../${entityName}.api'; import { Form } from 'ant-design-vue'; + import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue'; <#if hasOnlyValidate == true> import { duplicateValidate } from '/@/utils/helper/validator' const props = defineProps({ formDisabled: { type: Boolean, default: false }, - formData: { type: Object, default: ()=>{} }, + formData: { type: Object, default: () => ({})}, formBpm: { type: Boolean, default: true } }); const formRef = ref(); @@ -77,9 +82,9 @@ const wrapperCol = ref({ xs: { span: 24 }, sm: { span: 16 } }); const confirmLoading = ref(false); //表单验证 - const validatorRules = { + const validatorRules = reactive({ <#include "/common/validatorRulesTemplate/native/vue3MainNative.ftl"> - }; + }); const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false }); // 表单禁用 @@ -218,8 +223,6 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei index 52096e9fa..5307ad2df 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -1,12 +1,13 @@ - + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei index 255ab0a7b..d922311b5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -405,7 +405,7 @@ //流程表单data formData: { type: Object, - default: ()=>{}, + default: () => ({}), required: false }, //表单模式:false流程表单 true普通表单 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei index 53a4d00a6..9b8e46604 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -119,7 +119,9 @@ <#list columns as po> <#if po.isQuery=='Y'> <#if po.queryMode!='single'> - <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + <#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> + <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'> + <#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']], diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi index 61f781835..d9fcb07aa 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -125,11 +125,20 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.classType=='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType=='datetime'> component: 'DatePicker', componentProps: { showTime:true }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, <#elseif po.classType=='pca'> component: 'JAreaLinkage', <#elseif po.classType=='popup'> @@ -187,6 +196,10 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> <#else> component: 'Input', //TODO 范围查询 @@ -241,11 +254,14 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType =='datetime'> component: 'DatePicker', componentProps: { showTime:true, - valueFormat: 'YYYY-MM-DD hh:mm:ss' + valueFormat: 'YYYY-MM-DD HH:mm:ss' }, <#elseif po.classType =='time'> component: 'TimePicker', @@ -278,11 +294,17 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='textarea'> component: 'InputTextArea', - <#elseif po.classType=='list' || po.classType=='radio'> + <#elseif po.classType=='list'> component: 'JDictSelectTag', componentProps:{ dictCode:"${form_field_dictCode}" }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio" + }, <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> <#elseif po.classType=='list_multi'> component: 'JSelectMultiple', @@ -363,7 +385,7 @@ export const formSchema: FormSchema[] = [ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'}, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei index d49052b65..671d1e273 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -527,7 +527,9 @@ * @param value */ function handleFormJoinChange(key, value) { - queryParam[key] = value.join(','); + if (typeof value != 'string') { + queryParam[key] = value.join(','); + } } @@ -565,20 +567,5 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi index 03e3b7184..9c8e68513 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -127,6 +127,9 @@ export const searchFormSchema: FormSchema[] = [ }, <#elseif po.classType=='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType=='datetime'> component: 'DatePicker', componentProps: { @@ -231,11 +234,14 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='date'> component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD' + }, <#elseif po.classType =='datetime'> component: 'DatePicker', componentProps: { showTime:true, - valueFormat: 'YYYY-MM-DD hh:mm:ss' + valueFormat: 'YYYY-MM-DD HH:mm:ss' }, <#elseif po.classType =='time'> component: 'TimePicker', @@ -268,10 +274,16 @@ export const formSchema: FormSchema[] = [ }, <#elseif po.classType =='textarea'> component: 'InputTextArea', - <#elseif po.classType=='list' || po.classType=='radio'> + <#elseif po.classType=='list'> component: 'JDictSelectTag', componentProps:{ - dictCode: "${form_field_dictCode}" + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio" }, <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> <#elseif po.classType=='list_multi'> @@ -353,7 +365,7 @@ export const formSchema: FormSchema[] = [ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, <#-- 6到16位数字 --> <#elseif fieldValidType == 'n6-16'> - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!' }, + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!' }, <#-- 6到16位任意字符 --> <#elseif fieldValidType == '*6-16'> { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!' }, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei index 2ea447fd0..5ea178df2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -1,8 +1,10 @@ <#include "/common/utils.ftl"> @@ -74,6 +78,7 @@ import { getValueType } from '/@/utils'; import {loadTreeData, saveOrUpdateDict} from '../${entityName}.api'; import { Form } from 'ant-design-vue'; + import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue'; <#if hasOnlyValidate == true> import { duplicateValidate } from '/@/utils/helper/validator' @@ -95,13 +100,13 @@ const wrapperCol = ref({ xs: { span: 24 }, sm: { span: 16 } }); const confirmLoading = ref(false); //表单验证 - const validatorRules = { + const validatorRules = reactive({ <#include "/common/validatorRulesTemplate/native/vue3MainNative.ftl"> - }; + }); const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false }); const props = defineProps({ formDisabled: { type: Boolean, default: false }, - formData: { type: Object, default: ()=>{} }, + formData: { type: Object, default: () => ({}) }, formBpm: { type: Boolean, default: true } }); @@ -270,8 +275,6 @@ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei index 89dd6eb7d..9c2157b99 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -1,12 +1,13 @@ - + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei index 7530d3a89..581f61f41 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -1,5 +1,5 @@