From 96b29b84b3d0410663dacdd07e00a3608a23b656 Mon Sep 17 00:00:00 2001 From: wuy <1311695042@qq.com> Date: Tue, 18 May 2021 17:17:04 +0800 Subject: [PATCH 01/83] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=84=E4=BB=B6=E6=A8=A1=E7=89=88=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/message/service/impl/MessageTemplateServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-message-starter/src/main/java/com/diboot/message/service/impl/MessageTemplateServiceImpl.java b/diboot-message-starter/src/main/java/com/diboot/message/service/impl/MessageTemplateServiceImpl.java index 799e1611..93393576 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/service/impl/MessageTemplateServiceImpl.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/service/impl/MessageTemplateServiceImpl.java @@ -55,7 +55,7 @@ public class MessageTemplateServiceImpl extends BaseServiceImpl Date: Fri, 21 May 2021 09:13:52 +0800 Subject: [PATCH 02/83] =?UTF-8?q?*=20=E5=8D=87=E7=BA=A7Spring=20boot?= =?UTF-8?q?=E8=87=B32.5.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 4 ++-- diboot-core/pom.xml | 4 ++-- diboot-file-starter/pom.xml | 6 +++--- diboot-iam-starter/pom.xml | 4 ++-- diboot-message-starter/pom.xml | 4 ++-- diboot-scheduler-starter/pom.xml | 4 ++-- pom.xml | 8 ++++---- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index e976c435..160f7717 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-core-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot core starter project diff --git a/diboot-core/pom.xml b/diboot-core/pom.xml index a0a71766..9a77620a 100644 --- a/diboot-core/pom.xml +++ b/diboot-core/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-core - 2.2.1 + 2.3.0 jar diboot core project diff --git a/diboot-file-starter/pom.xml b/diboot-file-starter/pom.xml index 458da247..eaba93d5 100644 --- a/diboot-file-starter/pom.xml +++ b/diboot-file-starter/pom.xml @@ -7,11 +7,11 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 diboot-file-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot file component project @@ -32,7 +32,7 @@ com.alibaba easyexcel - 2.2.8 + 2.2.10 diff --git a/diboot-iam-starter/pom.xml b/diboot-iam-starter/pom.xml index a79c3fa7..f30f1f6d 100644 --- a/diboot-iam-starter/pom.xml +++ b/diboot-iam-starter/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-iam-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot IAM project diff --git a/diboot-message-starter/pom.xml b/diboot-message-starter/pom.xml index 99d622c5..fded314f 100644 --- a/diboot-message-starter/pom.xml +++ b/diboot-message-starter/pom.xml @@ -5,12 +5,12 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 4.0.0 diboot-message-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot消息组件 diff --git a/diboot-scheduler-starter/pom.xml b/diboot-scheduler-starter/pom.xml index 02a5b360..ba31c8a0 100644 --- a/diboot-scheduler-starter/pom.xml +++ b/diboot-scheduler-starter/pom.xml @@ -5,13 +5,13 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 4.0.0 com.diboot diboot-scheduler-spring-boot-starter - 2.2.1 + 2.3.0 diff --git a/pom.xml b/pom.xml index bcb9ca33..a12fec6c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,13 @@ org.springframework.boot spring-boot-starter-parent - 2.4.5 + 2.5.0 com.diboot diboot-root - 2.2.1 + 2.3.0 pom @@ -27,11 +27,11 @@ 1.8 - 2.4.5 + 2.5.0 6.2.0.Final 3.4.2 4.9.1 - 2.2.1 + 2.3.0 -- Gitee From f4f8f3694188f0e86483a05ad74003389e755b2b Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Mon, 24 May 2021 10:38:55 +0800 Subject: [PATCH 03/83] =?UTF-8?q?+=20=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B32.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 4 ++-- diboot-core/pom.xml | 4 ++-- diboot-file-starter/pom.xml | 4 ++-- diboot-iam-starter/pom.xml | 4 ++-- diboot-message-starter/pom.xml | 4 ++-- diboot-scheduler-starter/pom.xml | 4 ++-- pom.xml | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index e976c435..160f7717 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-core-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot core starter project diff --git a/diboot-core/pom.xml b/diboot-core/pom.xml index a0a71766..9a77620a 100644 --- a/diboot-core/pom.xml +++ b/diboot-core/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-core - 2.2.1 + 2.3.0 jar diboot core project diff --git a/diboot-file-starter/pom.xml b/diboot-file-starter/pom.xml index 458da247..c43fb829 100644 --- a/diboot-file-starter/pom.xml +++ b/diboot-file-starter/pom.xml @@ -7,11 +7,11 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 diboot-file-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot file component project diff --git a/diboot-iam-starter/pom.xml b/diboot-iam-starter/pom.xml index a79c3fa7..f30f1f6d 100644 --- a/diboot-iam-starter/pom.xml +++ b/diboot-iam-starter/pom.xml @@ -7,11 +7,11 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 diboot-iam-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot IAM project diff --git a/diboot-message-starter/pom.xml b/diboot-message-starter/pom.xml index 99d622c5..fded314f 100644 --- a/diboot-message-starter/pom.xml +++ b/diboot-message-starter/pom.xml @@ -5,12 +5,12 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 4.0.0 diboot-message-spring-boot-starter - 2.2.1 + 2.3.0 jar diboot消息组件 diff --git a/diboot-scheduler-starter/pom.xml b/diboot-scheduler-starter/pom.xml index 02a5b360..ba31c8a0 100644 --- a/diboot-scheduler-starter/pom.xml +++ b/diboot-scheduler-starter/pom.xml @@ -5,13 +5,13 @@ diboot-root com.diboot - 2.2.1 + 2.3.0 4.0.0 com.diboot diboot-scheduler-spring-boot-starter - 2.2.1 + 2.3.0 diff --git a/pom.xml b/pom.xml index bcb9ca33..ed63eae6 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.diboot diboot-root - 2.2.1 + 2.3.0 pom @@ -31,7 +31,7 @@ 6.2.0.Final 3.4.2 4.9.1 - 2.2.1 + 2.3.0 -- Gitee From a995ae0583a95d050ea04625e31d1f35092a5fc0 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 25 May 2021 20:14:08 +0800 Subject: [PATCH 04/83] =?UTF-8?q?*=20=E5=85=B3=E8=81=94=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=97=E5=90=8D=E5=B8=A6=E8=BD=AC=E4=B9=89?= =?UTF-8?q?=E7=AC=A6=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/binder/TestFieldBinder.java | 1 + .../core/test/binder/entity/Department.java | 2 +- .../java/diboot/core/test/binder/entity/User.java | 2 +- .../java/diboot/core/test/binder/vo/UserVO.java | 3 +++ .../com/diboot/core/binding/parser/PropInfo.java | 5 +++-- .../src/main/java/com/diboot/core/util/S.java | 15 +++++++++++++++ 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java index a9d813aa..68b90027 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java @@ -96,6 +96,7 @@ public class TestFieldBinder { if(V.notEmpty(voList)){ for(UserVO vo : voList){ Assert.assertNotNull(vo.getDeptName()); + Assert.assertNotNull(vo.getDeptName2()); } } } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java index 90d9b8f2..9da1cf04 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java @@ -42,6 +42,6 @@ public class Department extends BaseEntity { private Long orgId; @BindQuery(comparison = Comparison.CONTAINS) - @TableField + @TableField(value = "`name`") private String name; } \ No newline at end of file diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java index f264cfa9..8017926b 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java @@ -38,7 +38,7 @@ import java.util.Date; public class User extends BaseEntity { private static final long serialVersionUID = 3050761344045195972L; - @TableField + @TableField("`department_id`") private Long departmentId; @TableField diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java index b56736e1..f4f1f800 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java @@ -43,4 +43,7 @@ public class UserVO extends User { @BindDict(type = "GENDER", field = "gender") private String genderLabel; + @BindField(entity= Department.class, field="name", condition="this.department_id=id") + private String deptName2; + } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java index 6346f072..7c4fdaa1 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java @@ -80,7 +80,7 @@ public class PropInfo { else if(columnName == null){ columnName = S.toSnakeCase(fldName); } - this.idColumn = columnName; + this.idColumn = S.removeEsc(columnName); } else{ TableLogic tableLogic = fld.getAnnotation(TableLogic.class); @@ -91,9 +91,10 @@ public class PropInfo { else if(columnName == null){ columnName = S.toSnakeCase(fldName); } - this.deletedColumn = columnName; + this.deletedColumn = S.removeEsc(columnName); } } + columnName = S.removeEsc(columnName); this.fieldToColumnMap.put(fldName, columnName); if(V.notEmpty(columnName)){ this.columnToFieldMap.put(columnName, fldName); diff --git a/diboot-core/src/main/java/com/diboot/core/util/S.java b/diboot-core/src/main/java/com/diboot/core/util/S.java index 138a5a52..8ecd21c1 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/S.java +++ b/diboot-core/src/main/java/com/diboot/core/util/S.java @@ -362,4 +362,19 @@ public class S extends StringUtils{ return list; } + /** + * 移除转义符 + * @param columnName + * @return + */ + public static String removeEsc(String columnName){ + if(V.isEmpty(columnName)){ + return columnName; + } + if(startsWithAny(columnName, "`", "\"", "[")){ + return substring(columnName, 1, columnName.length()-1); + } + return columnName; + } + } -- Gitee From 8d23563e09339767eba6d0a0dfb4a3aa84d4c8f2 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 25 May 2021 20:23:42 +0800 Subject: [PATCH 05/83] =?UTF-8?q?*=20=E9=A2=84=E8=A7=88=E6=97=B6=E4=BC=A0?= =?UTF-8?q?=E9=80=92=E6=95=B0=E6=8D=AE=E6=80=BB=E6=95=B0=E9=87=8FtotalCoun?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/BaseExcelFileController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java index 3b016b69..a5968bbf 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java @@ -180,11 +180,16 @@ public abstract class BaseExcelFileController extends BaseFileController { dataMap.put(ORIGIN_FILE_NAME, originFileName); dataMap.put(PREVIEW_FILE_NAME, FileHelper.getFileName(uploadFile.getStoragePath())); List dataList = listener.getDataList(); - if (V.notEmpty(dataList) && dataList.size() > BaseConfig.getPageSize()) { - dataList = dataList.subList(0, BaseConfig.getPageSize()); + int totalCount = 0; + if (V.notEmpty(dataList)) { + totalCount = dataList.size(); + if(dataList.size() > BaseConfig.getPageSize()){ + dataList = dataList.subList(0, BaseConfig.getPageSize()); + } } - //最多返回前端十条数据 + //最多返回前端1页数据 dataMap.put("dataList", dataList); + dataMap.put("totalCount", totalCount); return dataMap; } -- Gitee From 57e64950fd033acabecb3d7f9012841f1bcb96a9 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 26 May 2021 13:32:28 +0800 Subject: [PATCH 06/83] =?UTF-8?q?*=20=E6=94=AF=E6=8C=81=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E4=B8=8B=E7=9A=84=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/test/binder/TestFieldBinder.java | 17 ++++++- .../core/test/binder/entity/Department.java | 5 +- .../diboot/core/test/binder/entity/User.java | 5 +- .../diboot/core/test/binder/vo/UserEscVO.java | 48 +++++++++++++++++++ .../diboot/core/test/binder/vo/UserVO.java | 3 -- .../core/test/service/BaseServiceTest.java | 23 +++++++++ .../src/test/resources/init-mysql.sql | 6 ++- .../core/binding/binder/BaseBinder.java | 12 +---- .../core/binding/helper/ResultAssembler.java | 25 +++++++++- .../diboot/core/binding/parser/PropInfo.java | 5 +- 10 files changed, 126 insertions(+), 23 deletions(-) create mode 100644 diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java index 68b90027..634caa1e 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestFieldBinder.java @@ -96,11 +96,26 @@ public class TestFieldBinder { if(V.notEmpty(voList)){ for(UserVO vo : voList){ Assert.assertNotNull(vo.getDeptName()); - Assert.assertNotNull(vo.getDeptName2()); } } } + @Test + public void testBinderWithEscCol(){ + // 加载测试数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(User::getId, 1001L, 1002L); + List userList = userService.getEntityList(queryWrapper); + // 自动绑定 + List voList = Binder.convertAndBindRelations(userList, UserEscVO.class); + if(V.notEmpty(voList)){ + for(UserEscVO vo : voList){ + Assert.assertNotNull(vo.getDeptCharacter()); + Assert.assertNotNull(vo.getDeptName()); + Assert.assertNotNull(vo.getOrgName()); + } + } + } @Test public void testDictVoBind(){ diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java index 9da1cf04..2715d376 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/Department.java @@ -42,6 +42,9 @@ public class Department extends BaseEntity { private Long orgId; @BindQuery(comparison = Comparison.CONTAINS) - @TableField(value = "`name`") + @TableField private String name; + + @TableField("`character`") + private String character; } \ No newline at end of file diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java index 8017926b..53fdff22 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/User.java @@ -38,7 +38,7 @@ import java.util.Date; public class User extends BaseEntity { private static final long serialVersionUID = 3050761344045195972L; - @TableField("`department_id`") + @TableField private Long departmentId; @TableField @@ -53,4 +53,7 @@ public class User extends BaseEntity { @JsonFormat(pattern = D.FORMAT_DATE_Y4MD) private LocalDateTime localDatetime; + + @TableField("`character`") + private String character; } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java new file mode 100644 index 00000000..2409d830 --- /dev/null +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package diboot.core.test.binder.vo; + +import com.diboot.core.binding.annotation.BindDict; +import com.diboot.core.binding.annotation.BindField; +import diboot.core.test.binder.entity.Department; +import diboot.core.test.binder.entity.Organization; +import diboot.core.test.binder.entity.User; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * + * + * @author mazc@dibo.ltd + * @version v2.0 + * @date 2019/06/22 + */ +@Getter +@Setter +@Accessors(chain = true) +public class UserEscVO extends User { + private static final long serialVersionUID = -5566013299475080343L; + + @BindField(entity= Department.class, field="character", condition="this.department_id=id") + private String deptCharacter; + + @BindField(entity = Department.class, field="name", condition="this.`character`=`character`") + private String deptName; + + @BindField(entity = Organization.class, field="name", condition="this.`character`=department.`character` AND department.org_id=id") + private String orgName; +} diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java index f4f1f800..b56736e1 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserVO.java @@ -43,7 +43,4 @@ public class UserVO extends User { @BindDict(type = "GENDER", field = "gender") private String genderLabel; - @BindField(entity= Department.class, field="name", condition="this.department_id=id") - private String deptName2; - } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java index 690317cf..134a34cd 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java @@ -32,7 +32,10 @@ import com.diboot.core.util.*; import com.diboot.core.vo.*; import diboot.core.test.StartupApplication; import diboot.core.test.binder.entity.CcCityInfo; +import diboot.core.test.binder.entity.Department; +import diboot.core.test.binder.entity.User; import diboot.core.test.binder.entity.UserRole; +import diboot.core.test.binder.service.DepartmentService; import diboot.core.test.binder.service.UserService; import diboot.core.test.config.SpringMvcConfig; import org.junit.Assert; @@ -63,6 +66,9 @@ public class BaseServiceTest { @Autowired UserService userService; + @Autowired + DepartmentService departmentService; + @Test public void testGet(){ // 查询总数 @@ -243,6 +249,23 @@ public class BaseServiceTest { Assert.assertTrue(V.isEmpty(dictionaryList2)); } + @Test + public void testEscInService(){ + LambdaQueryWrapper queryWrapper = new QueryWrapper() + .lambda().isNotNull(Department::getCharacter); + List departments = departmentService.list(queryWrapper); + Assert.assertTrue(departments != null); + Department dept = (Department) departments.get(0); + Assert.assertTrue(dept.getCharacter() != null); + + LambdaQueryWrapper queryWrapperUser = new QueryWrapper() + .lambda().isNotNull(User::getCharacter); + List users = userService.getEntityList(queryWrapperUser); + Assert.assertTrue(users != null); + User user = (User) users.get(0); + Assert.assertTrue(user.getCharacter() != null); + } + @Test public void testJsonResult(){ Map map = new HashMap(); diff --git a/diboot-core-starter/src/test/resources/init-mysql.sql b/diboot-core-starter/src/test/resources/init-mysql.sql index 24b760a4..74204d02 100644 --- a/diboot-core-starter/src/test/resources/init-mysql.sql +++ b/diboot-core-starter/src/test/resources/init-mysql.sql @@ -25,6 +25,7 @@ create table department org_id bigint not null comment '单位ID', name varchar(50) not null comment '名称', extdata varchar(100) null comment '扩展字段', + `character` varchar(100) null comment '关键字', is_deleted tinyint(1) default 0 not null comment '已删除', create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间' ) @@ -59,6 +60,7 @@ create table user username varchar(20) null, gender varchar(20) null, birthdate date null, + `character` varchar(100) null comment '关键字', is_deleted tinyint(1) default 0 null, create_time timestamp default CURRENT_TIMESTAMP null comment '创建时间', local_datetime datetime null comment '本地时间' @@ -100,12 +102,12 @@ CREATE TABLE `db_purchase_form_plan` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 初始化样例数据 -INSERT INTO department (id, parent_id, org_id, name) VALUES (10001, 0, 100001, '产品部'), (10002, 10001, 100001, '研发组'), (10003, 10001, 100001, '测试组'), +INSERT INTO department (id, parent_id, org_id, name, `character`) VALUES (10001, 0, 100001, '产品部', 'CP'), (10002, 10001, 100001, '研发组', 'YF'), (10003, 10001, 100001, '测试组', 'CS'), (10004, 10001, 100001, 'UI组'), (10005, 10003, 100001, '自动化测试'), (10006, 10003, 100001, '功能测试'); INSERT INTO dictionary (id, parent_id, app_module, type, item_name, item_value) VALUES (1, 0, '', 'GENDER', '性别', null), (2, 1, '', 'GENDER', '男', 'M'), (3, 1, '', 'GENDER', '女', 'F'); INSERT INTO organization (id, parent_id, name, telphone, manager_id) VALUES (100001, 0, '苏州帝博', '0512-62988949', 1001), (100002, 0, '成都帝博', null, null); INSERT INTO role (id, name, code) VALUES (101, '管理员', 'ADMIN'), (102, '操作员', 'OPERATOR'); -INSERT INTO user (id, department_id, username, gender) VALUES (1001, 10002, '张三', 'M'), (1002, 10002, '李四', 'F'); +INSERT INTO user (id, department_id, username, gender, `character`) VALUES (1001, 10002, '张三', 'M', 'ZS'), (1002, 10002, '李四', 'F', 'LS'); INSERT INTO user_role (user_type, user_id, role_id) VALUES ('SysUser', 1001, 101),('SysUser', 1001, 102),('OrgUser', 1002, 102); INSERT INTO cc_city_info (id, parent_id, region_id, region_name) VALUES (10000, 0, 10000, '江苏省'), (10010, 10000, 10010, '苏州市'), (10020, 10010, 10020, '园区'); INSERT INTO db_goods_goods_info (goods_id, goods_nm, is_del) VALUES(1001, 'abcde', 0), (1002, 'abcd', 0); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java index 5b60d061..5f81006e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java @@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.binding.cache.BindingCacheManager; +import com.diboot.core.binding.helper.ResultAssembler; import com.diboot.core.binding.parser.MiddleTable; import com.diboot.core.binding.parser.PropInfo; import com.diboot.core.config.BaseConfig; @@ -308,16 +309,7 @@ public abstract class BaseBinder { * @return */ protected Object getValueIgnoreKeyCase(Map map, String key){ - if(key == null){ - return null; - } - if(map.containsKey(key)){ - return map.get(key); - } - if(map.containsKey(key.toUpperCase())){ - return map.get(key.toUpperCase()); - } - return null; + return ResultAssembler.getValueIgnoreKeyCase(map, key); } /** diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java index 074084cb..9d939a1f 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java @@ -123,7 +123,7 @@ public class ResultAssembler { for(Map row : resultSetMapList){ fieldValues.clear(); for(Map.Entry entry : trunkObjColMapping.entrySet()){ - Object keyObj = row.containsKey(entry.getValue())? row.get(entry.getValue()) : row.get(entry.getValue().toUpperCase()); + Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); fieldValues.add(S.valueOf(keyObj)); } String matchKeys = S.join(fieldValues); @@ -153,7 +153,7 @@ public class ResultAssembler { for(Map row : resultSetMapList){ fieldValues.clear(); for(Map.Entry entry : trunkObjColMapping.entrySet()){ - Object keyObj = row.containsKey(entry.getValue())? row.get(entry.getValue()) : row.get(entry.getValue().toUpperCase()); + Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); fieldValues.add(S.valueOf(keyObj)); } String matchKeys = S.join(fieldValues); @@ -170,4 +170,25 @@ public class ResultAssembler { return resultMap; } + + /** + * 从map中取值,如直接取为null尝试转换大写后再取,以支持ORACLE等大写命名数据库 + * @param map + * @param key + * @return + */ + public static Object getValueIgnoreKeyCase(Map map, String key){ + if(key == null){ + return null; + } + key = S.removeEsc(key); + if(map.containsKey(key)){ + return map.get(key); + } + if(map.containsKey(key.toUpperCase())){ + return map.get(key.toUpperCase()); + } + return null; + } + } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java index 7c4fdaa1..6346f072 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java @@ -80,7 +80,7 @@ public class PropInfo { else if(columnName == null){ columnName = S.toSnakeCase(fldName); } - this.idColumn = S.removeEsc(columnName); + this.idColumn = columnName; } else{ TableLogic tableLogic = fld.getAnnotation(TableLogic.class); @@ -91,10 +91,9 @@ public class PropInfo { else if(columnName == null){ columnName = S.toSnakeCase(fldName); } - this.deletedColumn = S.removeEsc(columnName); + this.deletedColumn = columnName; } } - columnName = S.removeEsc(columnName); this.fieldToColumnMap.put(fldName, columnName); if(V.notEmpty(columnName)){ this.columnToFieldMap.put(columnName, fldName); -- Gitee From 188a31de9f3e48814ed013b352e4684c503cb917 Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Thu, 27 May 2021 14:59:22 +0800 Subject: [PATCH 07/83] =?UTF-8?q?+=20=E5=AE=8C=E5=96=84=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=9D=83=E9=99=90=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/iam/starter/IamPluginInitializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java index aeca651d..6498180a 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java @@ -91,8 +91,8 @@ public class IamPluginInitializer implements ApplicationRunner { // 插入iam组件所需的初始权限数据 String[] RESOURCE_PERMISSION_DATA = { - "{\"displayType\":\"MENU\",\"displayName\":\"系统管理\",\"resourceCode\":\"system\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"数据字典管理\",\"resourceCode\":\"Dictionary\",\"apiSet\":\"GET:/dictionary/list\",\"sortId\":\"10030\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/dictionary/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/dictionary/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/dictionary/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/dictionary/{id}\",\"sortId\":\"3\"}]},{\"displayType\":\"MENU\",\"displayName\":\"系统用户管理\",\"resourceCode\":\"IamUser\",\"apiSet\":\"GET:/iam/user/list\",\"sortId\":\"10029\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"部门查看\",\"resourceCode\":\"orgTree\",\"apiSet\":\"GET:/iam/org/tree\",\"sortId\":\"12\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"11\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"10\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id}\",\"sortId\":\"9\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"8\"}]},{\"displayType\":\"MENU\",\"displayName\":\"角色资源管理\",\"resourceCode\":\"IamRole\",\"apiSet\":\"GET:/iam/role/list\",\"sortId\":\"10023\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/role/{id}\",\"sortId\":\"16\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/role/\",\"sortId\":\"15\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/role/{id}\",\"sortId\":\"14\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/role/{id}\",\"sortId\":\"13\"}]},{\"displayType\":\"MENU\",\"displayName\":\"资源权限管理\",\"resourceCode\":\"IamResourcePermission\",\"apiSet\":\"GET:/iam/resourcePermission/list\",\"sortId\":\"10017\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/resourcePermission/{id}\",\"sortId\":\"23\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/resourcePermission/\",\"sortId\":\"21\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/resourcePermission/{id}\",\"sortId\":\"20\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/resourcePermission/{id}\",\"sortId\":\"19\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/resourcePermission/sortList\",\"sortId\":\"18\"}]},{\"displayType\":\"MENU\",\"displayName\":\"定时任务管理\",\"resourceCode\":\"ScheduleJob\",\"apiSet\":\"GET:/scheduleJob/list\",\"sortId\":\"10012\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/scheduleJob/{id}\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/scheduleJob/{id}/{action}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/scheduleJob/\",\"sortId\":\"3\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/scheduleJob/{id},GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"2\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"运行一次\",\"resourceCode\":\"executeOnce\",\"apiSet\":\"PUT:/scheduleJob/executeOnce/{id}\",\"sortId\":\"1\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志记录\",\"resourceCode\":\"logList\",\"apiSet\":\"GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"0\"}]},{\"displayType\":\"MENU\",\"displayName\":\"操作日志查看\",\"resourceCode\":\"IamOperationLog\",\"apiSet\":\"GET:/iam/operationLog/list\",\"sortId\":\"10006\",\"children\":[]},{\"displayType\":\"MENU\",\"displayName\":\"登录日志查看\",\"resourceCode\":\"IamLoginTrace\",\"apiSet\":\"GET:/iam/loginTrace/list\",\"sortId\":\"10001\",\"children\":[]}]}", - "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" + "{\"displayType\":\"MENU\",\"displayName\":\"系统管理\",\"resourceCode\":\"system\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"数据字典管理\",\"resourceCode\":\"Dictionary\",\"apiSet\":\"GET:/dictionary/list\",\"sortId\":\"10030\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/dictionary/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/dictionary/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/dictionary/{id},GET:/dictionary/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/dictionary/{id}\",\"sortId\":\"3\"}]},{\"displayType\":\"MENU\",\"displayName\":\"系统用户管理\",\"resourceCode\":\"IamUser\",\"apiSet\":\"GET:/iam/user/list\",\"sortId\":\"10029\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"部门查看\",\"resourceCode\":\"orgTree\",\"apiSet\":\"GET:/iam/org/tree\",\"sortId\":\"12\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"11\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"10\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"9\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"8\"}]},{\"displayType\":\"MENU\",\"displayName\":\"角色资源管理\",\"resourceCode\":\"IamRole\",\"apiSet\":\"GET:/iam/role/list\",\"sortId\":\"10023\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/role/{id}\",\"sortId\":\"16\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/role/\",\"sortId\":\"15\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/role/{id},GET:/iam/role/{id}\",\"sortId\":\"14\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/role/{id}\",\"sortId\":\"13\"}]},{\"displayType\":\"MENU\",\"displayName\":\"资源权限管理\",\"resourceCode\":\"IamResourcePermission\",\"apiSet\":\"GET:/iam/resourcePermission/list\",\"sortId\":\"10017\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/resourcePermission/{id}\",\"sortId\":\"23\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/resourcePermission/\",\"sortId\":\"21\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/resourcePermission/{id},GET:/iam/resourcePermission/{id}\",\"sortId\":\"20\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/resourcePermission/{id}\",\"sortId\":\"19\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/resourcePermission/sortList\",\"sortId\":\"18\"}]},{\"displayType\":\"MENU\",\"displayName\":\"定时任务管理\",\"resourceCode\":\"ScheduleJob\",\"apiSet\":\"GET:/scheduleJob/list\",\"sortId\":\"10012\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/scheduleJob/{id}\",\"sortId\":\"7\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/scheduleJob/{id}/{action},GET:/scheduleJob/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/scheduleJob/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/scheduleJob/{id},GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"运行一次\",\"resourceCode\":\"executeOnce\",\"apiSet\":\"PUT:/scheduleJob/executeOnce/{id}\",\"sortId\":\"3\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志记录\",\"resourceCode\":\"logList\",\"apiSet\":\"GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"2\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志删除\",\"resourceCode\":\"logDelete\",\"apiSet\":\"DELETE:/scheduleJob/log/{id}\",\"sortId\":\"1\"}]},{\"displayType\":\"MENU\",\"displayName\":\"操作日志查看\",\"resourceCode\":\"IamOperationLog\",\"apiSet\":\"GET:/iam/operationLog/list\",\"sortId\":\"10006\",\"children\":[]},{\"displayType\":\"MENU\",\"displayName\":\"登录日志查看\",\"resourceCode\":\"IamLoginTrace\",\"apiSet\":\"GET:/iam/loginTrace/list\",\"sortId\":\"10001\",\"children\":[]}]}", + "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id},GET:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id},GET:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" }; // 插入多层级资源权限初始数据 try { -- Gitee From 805ac5813197015fe1d864417f40714f458e5d65 Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Fri, 28 May 2021 13:59:11 +0800 Subject: [PATCH 08/83] =?UTF-8?q?+=20=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=90=8E=E7=94=A8=E6=88=B7=E5=AF=BC=E5=85=A5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A2=84=E8=A7=88=E5=92=8C=E4=B8=8B=E8=BD=BDExcel?= =?UTF-8?q?=E6=A0=B7=E4=BE=8B=E6=96=87=E4=BB=B6=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/diboot/iam/starter/IamPluginInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java index 6498180a..0434e700 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java @@ -92,7 +92,7 @@ public class IamPluginInitializer implements ApplicationRunner { // 插入iam组件所需的初始权限数据 String[] RESOURCE_PERMISSION_DATA = { "{\"displayType\":\"MENU\",\"displayName\":\"系统管理\",\"resourceCode\":\"system\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"数据字典管理\",\"resourceCode\":\"Dictionary\",\"apiSet\":\"GET:/dictionary/list\",\"sortId\":\"10030\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/dictionary/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/dictionary/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/dictionary/{id},GET:/dictionary/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/dictionary/{id}\",\"sortId\":\"3\"}]},{\"displayType\":\"MENU\",\"displayName\":\"系统用户管理\",\"resourceCode\":\"IamUser\",\"apiSet\":\"GET:/iam/user/list\",\"sortId\":\"10029\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"部门查看\",\"resourceCode\":\"orgTree\",\"apiSet\":\"GET:/iam/org/tree\",\"sortId\":\"12\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"11\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"10\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"9\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"8\"}]},{\"displayType\":\"MENU\",\"displayName\":\"角色资源管理\",\"resourceCode\":\"IamRole\",\"apiSet\":\"GET:/iam/role/list\",\"sortId\":\"10023\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/role/{id}\",\"sortId\":\"16\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/role/\",\"sortId\":\"15\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/role/{id},GET:/iam/role/{id}\",\"sortId\":\"14\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/role/{id}\",\"sortId\":\"13\"}]},{\"displayType\":\"MENU\",\"displayName\":\"资源权限管理\",\"resourceCode\":\"IamResourcePermission\",\"apiSet\":\"GET:/iam/resourcePermission/list\",\"sortId\":\"10017\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/resourcePermission/{id}\",\"sortId\":\"23\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/resourcePermission/\",\"sortId\":\"21\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/resourcePermission/{id},GET:/iam/resourcePermission/{id}\",\"sortId\":\"20\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/resourcePermission/{id}\",\"sortId\":\"19\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/resourcePermission/sortList\",\"sortId\":\"18\"}]},{\"displayType\":\"MENU\",\"displayName\":\"定时任务管理\",\"resourceCode\":\"ScheduleJob\",\"apiSet\":\"GET:/scheduleJob/list\",\"sortId\":\"10012\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/scheduleJob/{id}\",\"sortId\":\"7\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/scheduleJob/{id}/{action},GET:/scheduleJob/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/scheduleJob/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/scheduleJob/{id},GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"运行一次\",\"resourceCode\":\"executeOnce\",\"apiSet\":\"PUT:/scheduleJob/executeOnce/{id}\",\"sortId\":\"3\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志记录\",\"resourceCode\":\"logList\",\"apiSet\":\"GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"2\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志删除\",\"resourceCode\":\"logDelete\",\"apiSet\":\"DELETE:/scheduleJob/log/{id}\",\"sortId\":\"1\"}]},{\"displayType\":\"MENU\",\"displayName\":\"操作日志查看\",\"resourceCode\":\"IamOperationLog\",\"apiSet\":\"GET:/iam/operationLog/list\",\"sortId\":\"10006\",\"children\":[]},{\"displayType\":\"MENU\",\"displayName\":\"登录日志查看\",\"resourceCode\":\"IamLoginTrace\",\"apiSet\":\"GET:/iam/loginTrace/list\",\"sortId\":\"10001\",\"children\":[]}]}", - "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id},GET:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id},GET:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" + "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id},GET:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id},GET:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload,POST:/iam/user/excel/preview,GET:/iam/user/excel/downloadExample\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" }; // 插入多层级资源权限初始数据 try { -- Gitee From ad980732e7dc5660a6080dd0e8832422369ecbb7 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Sun, 30 May 2021 03:00:06 +0800 Subject: [PATCH 09/83] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EExcel=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E6=B3=A8=E8=A7=A3@ExcelOption?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/excel/annotation/ExcelOption.java | 54 ++++++++ .../excel/cache/ExcelBindOptionHandler.java | 74 +++++++++++ .../file/excel/write/OptionWriteHandler.java | 119 ++++++++++++++++++ .../com/diboot/file/util/ExcelHelper.java | 2 + 4 files changed, 249 insertions(+) create mode 100644 diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java create mode 100644 diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java create mode 100644 diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java new file mode 100644 index 00000000..5fea25b3 --- /dev/null +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.file.excel.annotation; + +import java.lang.annotation.*; + +/** + * Excel下拉选项 + *

可自定选项与关联字典

+ * + * @author wind + * @version v2.3.0 + * @date 2021-05-29 21:30 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface ExcelOption { + + /** + * 选项列表 + * + * @return options + */ + String[] value() default {}; + + /** + * 关联字典类型 + * + * @return 字典类型 + */ + String dict() default ""; + + /** + * 行数(默认10000) + * + * @return 行数 + */ + int rows() default 10_000; +} diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java new file mode 100644 index 00000000..27e3cd8c --- /dev/null +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.file.excel.cache; + +import com.alibaba.excel.util.ClassUtils; +import com.diboot.file.excel.annotation.ExcelOption; + +import java.lang.ref.SoftReference; +import java.lang.reflect.Field; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 绑定选项注解的辅助类 + * + * @author wind + * @version v2.3.0 + * @date 2021-05-29 22:36 + */ +public class ExcelBindOptionHandler { + + /** + * Excel下拉选项注解缓存 + */ + private static final Map, SoftReference>> MODEL_OPTION_CACHE = new ConcurrentHashMap<>(); + + /** + * 获取选项注解Map + * + * @param clazz ExcelModel + * @return 选项注解Map + */ + public static Map getOptionsAnnotationMap(Class clazz) { + SoftReference> fieldCacheSoftReference = MODEL_OPTION_CACHE.get(clazz); + + if (fieldCacheSoftReference != null && fieldCacheSoftReference.get() != null) { + return fieldCacheSoftReference.get(); + } + synchronized (clazz) { + fieldCacheSoftReference = MODEL_OPTION_CACHE.get(clazz); + if (fieldCacheSoftReference != null && fieldCacheSoftReference.get() != null) { + return fieldCacheSoftReference.get(); + } + // 获取ExcelModel字段排序后的Map + Map sortedAllFiledMap = new TreeMap<>(); + ClassUtils.declaredFields(clazz, sortedAllFiledMap, null, false, null); + + Map map = new TreeMap<>(); + for (Map.Entry entry : sortedAllFiledMap.entrySet()) { + ExcelOption option = entry.getValue().getAnnotation(ExcelOption.class); + if (option == null) { + continue; + } + map.put(entry.getKey(), option); + } + MODEL_OPTION_CACHE.put(clazz, new SoftReference<>(map)); + return map; + } + } +} diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java new file mode 100644 index 00000000..1f7d9fce --- /dev/null +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.file.excel.write; + +import com.alibaba.excel.exception.ExcelCommonException; +import com.alibaba.excel.write.handler.AbstractSheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import com.diboot.core.exception.BusinessException; +import com.diboot.core.service.DictionaryServiceExtProvider; +import com.diboot.core.util.ContextHelper; +import com.diboot.core.util.V; +import com.diboot.core.vo.KeyValue; +import com.diboot.core.vo.Status; +import com.diboot.file.excel.annotation.ExcelOption; +import com.diboot.file.excel.cache.ExcelBindOptionHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; + +import java.util.Map; + +/** + * Excel写入 下拉选项 Handler + * + * @author wind + * @version v2.3.0 + * @date 2021-05-29 22:33 + */ +@Slf4j +public class OptionWriteHandler extends AbstractSheetWriteHandler { + + /** + * ExcelModel + */ + private final Class clazz; + + /** + * 构造方法 + * + * @param clazz ExcelModel + */ + public OptionWriteHandler(Class clazz) { + this.clazz = clazz; + } + + /** + * Sheet页创建之后 + */ + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + Map mapDropDown = ExcelBindOptionHandler.getOptionsAnnotationMap(clazz); + Sheet sheet = writeSheetHolder.getSheet(); + // 开始设置下拉框 + DataValidationHelper helper = sheet.getDataValidationHelper(); + for (Map.Entry entry : mapDropDown.entrySet()) { + ExcelOption option = entry.getValue(); + int index = entry.getKey(); + // 起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(1, option.rows(), index, index); + // 设置下拉框数据 + DataValidationConstraint constraint = helper.createExplicitListConstraint(getOptions(option)); + DataValidation dataValidation = helper.createValidation(constraint, addressList); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + } + + /** + * 获取选项String数组 + * + * @param option Excel选项注解 + * @return String数组 + */ + private String[] getOptions(ExcelOption option) { + String[] options = option.value(); + if (options.length > 0) { + return options; + } + String dict = option.dict(); + if (V.isEmpty(dict)) { + log.error(clazz.getSimpleName() + "@ExcelOption 必须指定 value 或 字典"); + throw new ExcelCommonException("@ExcelOption 必须指定 value 或 字典"); + } + DictionaryServiceExtProvider bindDictService = ContextHelper.getBean(DictionaryServiceExtProvider.class); + if (bindDictService == null) { + throw new BusinessException(Status.FAIL_SERVICE_UNAVAILABLE, "DictionaryService未实现,无法使用ExcelBindDict注解!"); + } + options = bindDictService.getKeyValueList(dict).stream().map(KeyValue::getK).toArray(String[]::new); + if (V.isEmpty(options)) { + log.error(clazz.getSimpleName() + "@ExcelOption 必须指定 value 或 字典"); + throw new ExcelCommonException("@ExcelOption 关联字典: " + dict + " 无值"); + } + return options; + } +} diff --git a/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java b/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java index bbb64b12..82ff9fe5 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java @@ -24,6 +24,7 @@ import com.diboot.core.vo.Status; import com.diboot.file.excel.BaseExcelModel; import com.diboot.file.excel.listener.DynamicHeadExcelListener; import com.diboot.file.excel.listener.FixedHeadExcelListener; +import com.diboot.file.excel.write.OptionWriteHandler; import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletResponse; @@ -172,6 +173,7 @@ public class ExcelHelper { // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), clazz) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .registerWriteHandler(new OptionWriteHandler(clazz)) .autoCloseStream(Boolean.FALSE) .sheet("sheet1") .doWrite(data); -- Gitee From 7afe85a501e0da872f7600151aeda33eb0c420b4 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 31 May 2021 10:12:18 +0800 Subject: [PATCH 10/83] =?UTF-8?q?+=20=E8=87=AA=E5=AE=9A=E4=B9=89code?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/exception/BusinessException.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java b/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java index 7eba8454..52b798ca 100644 --- a/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java +++ b/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java @@ -29,6 +29,10 @@ import java.util.Map; */ public class BusinessException extends RuntimeException { + private Integer code; + + private String msg; + /** * 错误的状态 */ @@ -70,12 +74,23 @@ public class BusinessException extends RuntimeException { this.status = status; } + /** + * 自定义状态码和内容提示 + * @param code + * @param msg + */ + public BusinessException(int code, String msg) { + super(msg); + this.code = code; + } + /** * 自定义内容提示 * @param msg */ public BusinessException(String msg) { - super( msg); + super(msg); + this.status = Status.FAIL_OPERATION; } /** @@ -88,13 +103,23 @@ public class BusinessException extends RuntimeException { this.status = status; } + /** + * 自定义内容提示 + * @param code + * @param msg + */ + public BusinessException(int code, String msg, Throwable ex) { + super(msg, ex); + this.code = code; + } + /** * 转换为Map * @return */ public Map toMap(){ - Map map = new HashMap<>(); - map.put("code", status.code()); + Map map = new HashMap<>(8); + map.put("code", getCode()); map.put("msg", getMessage()); return map; } @@ -106,4 +131,12 @@ public class BusinessException extends RuntimeException { public Status getStatus(){ return this.status; } + + private int getCode(){ + if(this.code == null && this.status != null){ + this.code = this.status.code(); + } + return this.code; + } + } -- Gitee From 63cc2add7377ce82552d2007011e84c2deab572a Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 31 May 2021 16:00:32 +0800 Subject: [PATCH 11/83] =?UTF-8?q?+=20getParentOrgIds=E5=88=A4=E7=A9=BA?= =?UTF-8?q?=E9=98=B2=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/iam/service/impl/IamOrgServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamOrgServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamOrgServiceImpl.java index 5973e6df..e7ecdb29 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamOrgServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamOrgServiceImpl.java @@ -139,13 +139,16 @@ public class IamOrgServiceImpl extends BaseIamServiceImpl @Override public List getParentOrgIds(Long orgId, boolean includeThis) { + if(orgId == null){ + return Collections.emptyList(); + } List scopeIds = new ArrayList<>(); if(includeThis){ scopeIds.add(orgId); } // 查询所有上级 IamOrg org = getEntity(orgId); - if(org.getDepth() != null){ + if(org != null && org.getDepth() != null){ if(org.getDepth() >= 2){ scopeIds.add(org.getParentId()); if(org.getDepth() > 2) { -- Gitee From a70e0d3362bd95099c14f3b0d569be33cb1cefa9 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Mon, 31 May 2021 18:08:24 +0800 Subject: [PATCH 12/83] =?UTF-8?q?optimize:=20=E4=BC=98=E5=8C=96Excel?= =?UTF-8?q?=E5=86=99=E5=85=A5=EF=BC=8C=E5=8F=AF=E4=BC=A0=E5=85=A5=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89WriteHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/file/util/ExcelHelper.java | 63 ++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java b/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java index 82ff9fe5..fb9c4181 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/util/ExcelHelper.java @@ -16,6 +16,8 @@ package com.diboot.file.util; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.BeanUtils; @@ -118,16 +120,27 @@ public class ExcelHelper { } /** - * 简单将数据写入excel文件,列宽自适应数据长度 + * 简单将数据写入excel文件 + *

默认列宽自适应数据长度, 可自定义

* * @param filePath * @param sheetName * @param dataList + * @param writeHandlers * @return */ - public static boolean writeDynamicData(String filePath, String sheetName, List> dataList) throws Exception { + public static boolean writeDynamicData(String filePath, String sheetName, List> dataList, + WriteHandler... writeHandlers) throws Exception { try { - EasyExcel.write(filePath).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(dataList); + ExcelWriterBuilder write = EasyExcel.write(filePath); + if (writeHandlers.length == 0) { + write = write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()); + } else { + for (WriteHandler handler : writeHandlers) { + write = write.registerWriteHandler(handler); + } + } + write.sheet(sheetName).doWrite(dataList); return true; } catch (Exception e) { log.error("数据写入excel文件失败", e); @@ -136,21 +149,33 @@ public class ExcelHelper { } /** - * 简单将数据写入excel文件,列宽自适应数据长度 + * 简单将数据写入excel文件 + *

默认列宽自适应数据长度、写入单元格下拉选项, 可自定义

* * @param filePath * @param sheetName * @param dataList * @param + * @param writeHandlers * @return */ - public static boolean writeData(String filePath, String sheetName, List dataList) throws Exception { + public static boolean writeData(String filePath, String sheetName, List dataList, + WriteHandler... writeHandlers) throws Exception { try { if (V.isEmpty(dataList)) { return writeDynamicData(filePath, sheetName, Collections.emptyList()); } Class tClass = (Class) dataList.get(0).getClass(); - EasyExcel.write(filePath, tClass).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(dataList); + ExcelWriterBuilder write = EasyExcel.write(filePath, tClass); + if (writeHandlers.length == 0) { + write = write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .registerWriteHandler(new OptionWriteHandler(tClass)); + } else { + for (WriteHandler handler : writeHandlers) { + write = write.registerWriteHandler(handler); + } + } + write.sheet(sheetName).doWrite(dataList); return true; } catch (Exception e) { log.error("数据写入excel文件失败", e); @@ -160,21 +185,31 @@ public class ExcelHelper { /** * web 导出excel + *

默认列宽自适应数据长度、写入单元格下拉选项, 可自定义

* * @param response - * @param clazz 导出的类 - * @param data 导出的数据 - * @param + * @param clazz 导出的类 + * @param data 导出的数据 + * @param writeHandlers 写入处理程序 * @throws Exception */ - public static void exportExcel(HttpServletResponse response, String fileName, Class clazz, List data) throws Exception { + public static void exportExcel(HttpServletResponse response, String fileName, + Class clazz, List data, + WriteHandler... writeHandlers) throws Exception { try { setExportExcelResponseHeader(response, fileName); + + ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), clazz); + if (writeHandlers.length == 0) { + write = write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .registerWriteHandler(new OptionWriteHandler(clazz)); + } else { + for (WriteHandler handler : writeHandlers) { + write = write.registerWriteHandler(handler); + } + } // 这里需要设置不关闭流 - EasyExcel.write(response.getOutputStream(), clazz) - .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - .registerWriteHandler(new OptionWriteHandler(clazz)) - .autoCloseStream(Boolean.FALSE) + write.autoCloseStream(Boolean.FALSE) .sheet("sheet1") .doWrite(data); } catch (Exception e) { -- Gitee From 910a8e086726cdd77d1349843bfaf9b17d4c9a23 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Wed, 2 Jun 2021 11:50:03 +0800 Subject: [PATCH 13/83] =?UTF-8?q?fix:=20excel=E9=A2=84=E8=A7=88=E5=90=8E?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=9D=E5=AD=98excel=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/file/controller/BaseExcelFileController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java index a5968bbf..a78896d7 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java @@ -94,7 +94,7 @@ public abstract class BaseExcelFileController extends BaseFileController { } String fileUid = S.substringBefore(previewFileName, "."); String fullPath = FileHelper.getFullPath(previewFileName); - String accessUrl = FileHelper.getRelativePath(previewFileName); + String accessUrl = buildAccessUrl(previewFileName); String ext = FileHelper.getFileExtByName(originFileName); // 描述 String description = getString("description"); @@ -121,7 +121,7 @@ public abstract class BaseExcelFileController extends BaseFileController { } String fileUid = S.substringBefore(previewFileName, "."); String fullPath = FileHelper.getFullPath(previewFileName); - String accessUrl = FileHelper.getRelativePath(previewFileName); + String accessUrl = buildAccessUrl(previewFileName); String ext = FileHelper.getFileExtByName(originFileName); // 保存文件上传记录 UploadFile uploadFile = new UploadFile().setUuid(fileUid) -- Gitee From 490ccab94e9a5283e5239f8bbb67e37cd1772d63 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Wed, 2 Jun 2021 11:55:04 +0800 Subject: [PATCH 14/83] =?UTF-8?q?fix:=20excel=E9=A2=84=E8=A7=88=E5=90=8E?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=9D=E5=AD=98accessUrl=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/file/controller/BaseExcelFileController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java index a5968bbf..a78896d7 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/controller/BaseExcelFileController.java @@ -94,7 +94,7 @@ public abstract class BaseExcelFileController extends BaseFileController { } String fileUid = S.substringBefore(previewFileName, "."); String fullPath = FileHelper.getFullPath(previewFileName); - String accessUrl = FileHelper.getRelativePath(previewFileName); + String accessUrl = buildAccessUrl(previewFileName); String ext = FileHelper.getFileExtByName(originFileName); // 描述 String description = getString("description"); @@ -121,7 +121,7 @@ public abstract class BaseExcelFileController extends BaseFileController { } String fileUid = S.substringBefore(previewFileName, "."); String fullPath = FileHelper.getFullPath(previewFileName); - String accessUrl = FileHelper.getRelativePath(previewFileName); + String accessUrl = buildAccessUrl(previewFileName); String ext = FileHelper.getFileExtByName(originFileName); // 保存文件上传记录 UploadFile uploadFile = new UploadFile().setUuid(fileUid) -- Gitee From ded9ca8b7495849764d4352eeb23998cbce64344 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 3 Jun 2021 09:55:09 +0800 Subject: [PATCH 15/83] =?UTF-8?q?+=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=95=B0=E6=8D=AE=E7=9A=84=E5=AD=98=E5=9C=A8=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/iam/starter/IamPluginInitializer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java index 0434e700..66cb5238 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java @@ -15,6 +15,7 @@ */ package com.diboot.iam.starter; +import com.diboot.core.entity.Dictionary; import com.diboot.core.exception.BusinessException; import com.diboot.core.service.DictionaryService; import com.diboot.core.util.ContextHelper; @@ -85,7 +86,10 @@ public class IamPluginInitializer implements ApplicationRunner { // 插入数据字典 for(String dictJson : DICT_INIT_DATA){ DictionaryVO dictVo = JSON.toJavaObject(dictJson, DictionaryVO.class); - ContextHelper.getBean(DictionaryService.class).createDictAndChildren(dictVo); + DictionaryService dictionaryService = ContextHelper.getBean(DictionaryService.class); + if(dictionaryService != null && !dictionaryService.exists(Dictionary::getType, dictVo.getType())){ + dictionaryService.createDictAndChildren(dictVo); + } } DICT_INIT_DATA = null; -- Gitee From 49615c1fac773c6febaea6ca12abff6ae358efc9 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Sun, 6 Jun 2021 13:55:17 +0800 Subject: [PATCH 16/83] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84Excel?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9=E6=B3=A8=E8=A7=A3=20@Excel?= =?UTF-8?q?Option=20=E4=B8=8E=20Excel=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E5=86=99=E5=85=A5=E7=A8=8B=E5=BA=8F=20OptionWriteHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/excel/annotation/ExcelOption.java | 46 +++++++++--- .../excel/cache/ExcelBindOptionHandler.java | 74 ------------------ .../file/excel/write/OptionWriteHandler.java | 75 ++++++++++++------- 3 files changed, 83 insertions(+), 112 deletions(-) delete mode 100644 diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java index 5fea25b3..f36fdf05 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java @@ -15,15 +15,17 @@ */ package com.diboot.file.excel.annotation; +import org.springframework.core.annotation.AliasFor; + import java.lang.annotation.*; /** - * Excel下拉选项 - *

可自定选项与关联字典

+ * Excel 单元格验证 (单元下拉选项) + *

+ * 可自定义选项或关联字典 * * @author wind * @version v2.3.0 - * @date 2021-05-29 21:30 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @@ -32,23 +34,47 @@ import java.lang.annotation.*; public @interface ExcelOption { /** - * 选项列表 + * 此属性为{@link #options}的别名 + *

+ * 当不指定其他属性值时使用而不是指定{@link #options} — 例如:{@code @ExcelOption({"选项1","选项2"})} * - * @return options + * @see #options */ + @AliasFor("options") String[] value() default {}; + /** + * 下拉选项列表 + *

+ * {@link #value}是此属性的别名(并与之互斥)。 + *

+ * 优先级: options > dict + */ + @AliasFor("value") + String[] options() default {}; + /** * 关联字典类型 - * - * @return 字典类型 + *

+ * 优先级: options > dict */ String dict() default ""; /** - * 行数(默认10000) - * - * @return 行数 + * 起始行索引 + *

+ * 当该值为-1时为整个列,且不可小于-1 + *

+ * 默认起始索引为 1 + */ + int firstRow() default 1; + + /** + * 行数 + *

+ * 行数应大于0,不大于0时不添加 单元格验证(单元下拉选项) + *

+ * 默认值 10,000 */ int rows() default 10_000; } diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java deleted file mode 100644 index 27e3cd8c..00000000 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindOptionHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.file.excel.cache; - -import com.alibaba.excel.util.ClassUtils; -import com.diboot.file.excel.annotation.ExcelOption; - -import java.lang.ref.SoftReference; -import java.lang.reflect.Field; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 绑定选项注解的辅助类 - * - * @author wind - * @version v2.3.0 - * @date 2021-05-29 22:36 - */ -public class ExcelBindOptionHandler { - - /** - * Excel下拉选项注解缓存 - */ - private static final Map, SoftReference>> MODEL_OPTION_CACHE = new ConcurrentHashMap<>(); - - /** - * 获取选项注解Map - * - * @param clazz ExcelModel - * @return 选项注解Map - */ - public static Map getOptionsAnnotationMap(Class clazz) { - SoftReference> fieldCacheSoftReference = MODEL_OPTION_CACHE.get(clazz); - - if (fieldCacheSoftReference != null && fieldCacheSoftReference.get() != null) { - return fieldCacheSoftReference.get(); - } - synchronized (clazz) { - fieldCacheSoftReference = MODEL_OPTION_CACHE.get(clazz); - if (fieldCacheSoftReference != null && fieldCacheSoftReference.get() != null) { - return fieldCacheSoftReference.get(); - } - // 获取ExcelModel字段排序后的Map - Map sortedAllFiledMap = new TreeMap<>(); - ClassUtils.declaredFields(clazz, sortedAllFiledMap, null, false, null); - - Map map = new TreeMap<>(); - for (Map.Entry entry : sortedAllFiledMap.entrySet()) { - ExcelOption option = entry.getValue().getAnnotation(ExcelOption.class); - if (option == null) { - continue; - } - map.put(entry.getKey(), option); - } - MODEL_OPTION_CACHE.put(clazz, new SoftReference<>(map)); - return map; - } - } -} diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java index 1f7d9fce..7e38d7d8 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java @@ -15,18 +15,18 @@ */ package com.diboot.file.excel.write; -import com.alibaba.excel.exception.ExcelCommonException; +import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.write.handler.AbstractSheetWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import com.diboot.core.exception.BusinessException; import com.diboot.core.service.DictionaryServiceExtProvider; +import com.diboot.core.util.AnnotationUtils; import com.diboot.core.util.ContextHelper; import com.diboot.core.util.V; import com.diboot.core.vo.KeyValue; import com.diboot.core.vo.Status; import com.diboot.file.excel.annotation.ExcelOption; -import com.diboot.file.excel.cache.ExcelBindOptionHandler; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.DataValidation; import org.apache.poi.ss.usermodel.DataValidationConstraint; @@ -35,14 +35,16 @@ import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import java.lang.reflect.Field; import java.util.Map; +import java.util.TreeMap; +import java.util.function.BiConsumer; /** * Excel写入 下拉选项 Handler * * @author wind * @version v2.3.0 - * @date 2021-05-29 22:33 */ @Slf4j public class OptionWriteHandler extends AbstractSheetWriteHandler { @@ -62,21 +64,16 @@ public class OptionWriteHandler extends AbstractSheetWriteHandler { } /** - * Sheet页创建之后 + * Sheet页创建之后,设置单元格下拉框选项 */ @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { - Map mapDropDown = ExcelBindOptionHandler.getOptionsAnnotationMap(clazz); Sheet sheet = writeSheetHolder.getSheet(); // 开始设置下拉框 DataValidationHelper helper = sheet.getDataValidationHelper(); - for (Map.Entry entry : mapDropDown.entrySet()) { - ExcelOption option = entry.getValue(); - int index = entry.getKey(); - // 起始行、终止行、起始列、终止列 - CellRangeAddressList addressList = new CellRangeAddressList(1, option.rows(), index, index); + setCellOption(clazz, (addressList, options) -> { // 设置下拉框数据 - DataValidationConstraint constraint = helper.createExplicitListConstraint(getOptions(option)); + DataValidationConstraint constraint = helper.createExplicitListConstraint(options); DataValidation dataValidation = helper.createValidation(constraint, addressList); // 处理Excel兼容性问题 if (dataValidation instanceof XSSFDataValidation) { @@ -86,33 +83,55 @@ public class OptionWriteHandler extends AbstractSheetWriteHandler { dataValidation.setSuppressDropDownArrow(false); } sheet.addValidationData(dataValidation); - } + }); } /** - * 获取选项String数组 + * 设置单元格下拉框选项 * - * @param option Excel选项注解 - * @return String数组 + * @param clazz ExcelModel.class + * @param action 设置单元格下拉框选项的行动 */ - private String[] getOptions(ExcelOption option) { - String[] options = option.value(); - if (options.length > 0) { - return options; - } - String dict = option.dict(); - if (V.isEmpty(dict)) { - log.error(clazz.getSimpleName() + "@ExcelOption 必须指定 value 或 字典"); - throw new ExcelCommonException("@ExcelOption 必须指定 value 或 字典"); + private void setCellOption(Class clazz, BiConsumer action) { + Map sortedAllFiledMap = new TreeMap<>(); + // 获取 Excel 中的字段(排序后的) + ClassUtils.declaredFields(clazz, sortedAllFiledMap, null, false, null); + for (Map.Entry entry : sortedAllFiledMap.entrySet()) { + ExcelOption option = AnnotationUtils.getAnnotation(entry.getValue(), ExcelOption.class); + // 行数不大于0时不添加 单元格验证(单元下拉选项) + if (option != null && option.rows() > 0) { + String[] options = option.options(); + String dictType = option.dict(); + if (options.length == 0 || V.notEmpty(dictType)) { + options = getDictOptions(dictType); + } + // 下拉框选为空时不添加 单元格验证(单元下拉选项) + if (V.notEmpty(options)) { + int col = entry.getKey(); + int firstRow = option.firstRow(); + int lastRow = firstRow - 1 + option.rows(); + // 创建单元格范围 —— 起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, col, col); + action.accept(addressList, options); + } + } } + } + + /** + * 从字典中获取选项 + * + * @param dictType 字典类型 + * @return 选项数组 + */ + private String[] getDictOptions(String dictType) { DictionaryServiceExtProvider bindDictService = ContextHelper.getBean(DictionaryServiceExtProvider.class); if (bindDictService == null) { - throw new BusinessException(Status.FAIL_SERVICE_UNAVAILABLE, "DictionaryService未实现,无法使用ExcelBindDict注解!"); + throw new BusinessException(Status.FAIL_SERVICE_UNAVAILABLE, "DictionaryService未实现,@ExcelOption无法关联字典!"); } - options = bindDictService.getKeyValueList(dict).stream().map(KeyValue::getK).toArray(String[]::new); + String[] options = bindDictService.getKeyValueList(dictType).stream().map(KeyValue::getK).toArray(String[]::new); if (V.isEmpty(options)) { - log.error(clazz.getSimpleName() + "@ExcelOption 必须指定 value 或 字典"); - throw new ExcelCommonException("@ExcelOption 关联字典: " + dict + " 无值"); + log.warn(clazz.getSimpleName() + " @ExcelOption 关联字典: " + dictType + " 无值"); } return options; } -- Gitee From 9bfac08d4b3cc6aca929ed7e63fa231c484ec807 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 7 Jun 2021 14:59:10 +0800 Subject: [PATCH 17/83] =?UTF-8?q?+=20insertInitData=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E6=B7=BB=E5=8A=A0=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iam/starter/IamPluginInitializer.java | 109 ++++++++++-------- .../starter/MessagePluginInitializer.java | 23 ++-- 2 files changed, 74 insertions(+), 58 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java index 66cb5238..a19064ef 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamPluginInitializer.java @@ -70,68 +70,79 @@ public class IamPluginInitializer implements ApplicationRunner { /** * 插入初始化数据 */ - private void insertInitData(){ + private synchronized void insertInitData(){ // 插入iam组件所需的数据字典 - String[] DICT_INIT_DATA = { - "{\"type\":\"AUTH_TYPE\", \"itemName\":\"登录认证方式\", \"description\":\"IAM用户登录认证方式\", \"children\":[{\"itemName\":\"用户名密码\", \"itemValue\":\"PWD\", \"sortId\":1},{\"itemName\":\"单点登录\", \"itemValue\":\"SSO\", \"sortId\":2},{\"itemName\":\"公众号\", \"itemValue\":\"WX_MP\", \"sortId\":3},{\"itemName\":\"企业微信\", \"itemValue\":\"WX_CP\", \"sortId\":4},{\"itemName\":\"其他\", \"itemValue\":\"OTHER\", \"sortId\":5}]}", - "{\"type\":\"ACCOUNT_STATUS\", \"itemName\":\"账号状态\", \"description\":\"IAM登录账号状态\", \"children\":[{\"itemName\":\"有效\", \"itemValue\":\"A\", \"sortId\":1},{\"itemName\":\"无效\", \"itemValue\":\"I\", \"sortId\":2},{\"itemName\":\"锁定\", \"itemValue\":\"L\", \"sortId\":3}]}", - "{\"type\":\"USER_STATUS\", \"itemName\":\"用户状态\", \"description\":\"IAM用户状态\", \"editable\":true, \"children\":[{\"itemName\":\"在职\", \"itemValue\":\"A\", \"sortId\":1},{\"itemName\":\"离职\", \"itemValue\":\"I\", \"sortId\":2}]}", - "{\"itemName\":\"用户性别\",\"type\":\"GENDER\",\"description\":\"用户性别数据字典\",\"children\":[{\"itemValue\":\"F\",\"sortId\":99,\"itemName\":\"女\"},{\"itemValue\":\"M\",\"sortId\":99,\"itemName\":\"男\"}]}", - "{\"type\":\"PERMISSION_TYPE\", \"itemName\":\"权限类型\", \"description\":\"IAM权限类型\", \"children\":[{\"itemName\":\"菜单\", \"itemValue\":\"MENU\", \"sortId\":1},{\"itemName\":\"操作\", \"itemValue\":\"OPERATION\", \"sortId\":2}]}", - "{\"itemName\":\"前端按钮/权限编码\",\"type\":\"RESOURCE_PERMISSION_CODE\",\"description\":\"前端按钮/权限编码 常用选项\",\"children\":[{\"sortId\":1,\"itemName\":\"详情\",\"itemValue\":\"detail\"},{\"sortId\":2,\"itemName\":\"新建\",\"itemValue\":\"create\"},{\"sortId\":3,\"itemName\":\"更新\",\"itemValue\":\"update\"},{\"sortId\":4,\"itemName\":\"删除\",\"itemValue\":\"delete\"},{\"sortId\":5,\"itemName\":\"导出\",\"itemValue\":\"export\"},{\"sortId\":6,\"itemName\":\"导入\",\"itemValue\":\"import\"}]}", - "{\"type\":\"ORG_TYPE\", \"itemName\":\"组织类型\", \"description\":\"组织节点类型\", \"editable\":false, \"children\":[{\"itemName\":\"部门\", \"itemValue\":\"DEPT\", \"sortId\":1},{\"itemName\":\"公司\", \"itemValue\":\"COMP\", \"sortId\":2}]}", - "{\"type\":\"DATA_PERMISSION_TYPE\", \"itemName\":\"IAM数据权限类型\", \"description\":\"IAM数据权限类型定义\", \"editable\":true, \"children\":[{\"itemName\":\"本人\", \"itemValue\":\"SELF\", \"sortId\":1},{\"itemName\":\"本人及下属\", \"itemValue\":\"SELF_AND_SUB\", \"sortId\":2},{\"itemName\":\"本部门\", \"itemValue\":\"DEPT\", \"sortId\":3},{\"itemName\":\"本部门及下属部门\", \"itemValue\":\"DEPT_AND_SUB\", \"sortId\":4},{\"itemName\":\"全部\", \"itemValue\":\"ALL\", \"sortId\":5}]}", - "{\"type\":\"POSITION_GRADE\", \"itemName\":\"职级定义\", \"description\":\"职务级别定义\", \"editable\":true, \"children\":[{\"itemName\":\"初级\", \"itemValue\":\"E1\", \"sortId\":1},{\"itemName\":\"中级\", \"itemValue\":\"E2\", \"sortId\":2},{\"itemName\":\"高级\", \"itemValue\":\"E3\", \"sortId\":3},{\"itemName\":\"专家\", \"itemValue\":\"E4\", \"sortId\":4}]}" - }; - // 插入数据字典 - for(String dictJson : DICT_INIT_DATA){ - DictionaryVO dictVo = JSON.toJavaObject(dictJson, DictionaryVO.class); - DictionaryService dictionaryService = ContextHelper.getBean(DictionaryService.class); - if(dictionaryService != null && !dictionaryService.exists(Dictionary::getType, dictVo.getType())){ + DictionaryService dictionaryService = ContextHelper.getBean(DictionaryService.class); + if(dictionaryService != null && !dictionaryService.exists(Dictionary::getType, "AUTH_TYPE")){ + String[] DICT_INIT_DATA = { + "{\"type\":\"AUTH_TYPE\", \"itemName\":\"登录认证方式\", \"description\":\"IAM用户登录认证方式\", \"children\":[{\"itemName\":\"用户名密码\", \"itemValue\":\"PWD\", \"sortId\":1},{\"itemName\":\"单点登录\", \"itemValue\":\"SSO\", \"sortId\":2},{\"itemName\":\"公众号\", \"itemValue\":\"WX_MP\", \"sortId\":3},{\"itemName\":\"企业微信\", \"itemValue\":\"WX_CP\", \"sortId\":4},{\"itemName\":\"其他\", \"itemValue\":\"OTHER\", \"sortId\":5}]}", + "{\"type\":\"ACCOUNT_STATUS\", \"itemName\":\"账号状态\", \"description\":\"IAM登录账号状态\", \"children\":[{\"itemName\":\"有效\", \"itemValue\":\"A\", \"sortId\":1},{\"itemName\":\"无效\", \"itemValue\":\"I\", \"sortId\":2},{\"itemName\":\"锁定\", \"itemValue\":\"L\", \"sortId\":3}]}", + "{\"type\":\"USER_STATUS\", \"itemName\":\"用户状态\", \"description\":\"IAM用户状态\", \"editable\":true, \"children\":[{\"itemName\":\"在职\", \"itemValue\":\"A\", \"sortId\":1},{\"itemName\":\"离职\", \"itemValue\":\"I\", \"sortId\":2}]}", + "{\"itemName\":\"用户性别\",\"type\":\"GENDER\",\"description\":\"用户性别数据字典\",\"children\":[{\"itemValue\":\"F\",\"sortId\":99,\"itemName\":\"女\"},{\"itemValue\":\"M\",\"sortId\":99,\"itemName\":\"男\"}]}", + "{\"type\":\"PERMISSION_TYPE\", \"itemName\":\"权限类型\", \"description\":\"IAM权限类型\", \"children\":[{\"itemName\":\"菜单\", \"itemValue\":\"MENU\", \"sortId\":1},{\"itemName\":\"操作\", \"itemValue\":\"OPERATION\", \"sortId\":2}]}", + "{\"itemName\":\"前端按钮/权限编码\",\"type\":\"RESOURCE_PERMISSION_CODE\",\"description\":\"前端按钮/权限编码 常用选项\",\"children\":[{\"sortId\":1,\"itemName\":\"详情\",\"itemValue\":\"detail\"},{\"sortId\":2,\"itemName\":\"新建\",\"itemValue\":\"create\"},{\"sortId\":3,\"itemName\":\"更新\",\"itemValue\":\"update\"},{\"sortId\":4,\"itemName\":\"删除\",\"itemValue\":\"delete\"},{\"sortId\":5,\"itemName\":\"导出\",\"itemValue\":\"export\"},{\"sortId\":6,\"itemName\":\"导入\",\"itemValue\":\"import\"}]}", + "{\"type\":\"ORG_TYPE\", \"itemName\":\"组织类型\", \"description\":\"组织节点类型\", \"editable\":false, \"children\":[{\"itemName\":\"部门\", \"itemValue\":\"DEPT\", \"sortId\":1},{\"itemName\":\"公司\", \"itemValue\":\"COMP\", \"sortId\":2}]}", + "{\"type\":\"DATA_PERMISSION_TYPE\", \"itemName\":\"IAM数据权限类型\", \"description\":\"IAM数据权限类型定义\", \"editable\":true, \"children\":[{\"itemName\":\"本人\", \"itemValue\":\"SELF\", \"sortId\":1},{\"itemName\":\"本人及下属\", \"itemValue\":\"SELF_AND_SUB\", \"sortId\":2},{\"itemName\":\"本部门\", \"itemValue\":\"DEPT\", \"sortId\":3},{\"itemName\":\"本部门及下属部门\", \"itemValue\":\"DEPT_AND_SUB\", \"sortId\":4},{\"itemName\":\"全部\", \"itemValue\":\"ALL\", \"sortId\":5}]}", + "{\"type\":\"POSITION_GRADE\", \"itemName\":\"职级定义\", \"description\":\"职务级别定义\", \"editable\":true, \"children\":[{\"itemName\":\"初级\", \"itemValue\":\"E1\", \"sortId\":1},{\"itemName\":\"中级\", \"itemValue\":\"E2\", \"sortId\":2},{\"itemName\":\"高级\", \"itemValue\":\"E3\", \"sortId\":3},{\"itemName\":\"专家\", \"itemValue\":\"E4\", \"sortId\":4}]}" + }; + // 插入数据字典 + for(String dictJson : DICT_INIT_DATA){ + DictionaryVO dictVo = JSON.toJavaObject(dictJson, DictionaryVO.class); dictionaryService.createDictAndChildren(dictVo); } + DICT_INIT_DATA = null; } - DICT_INIT_DATA = null; // 插入iam组件所需的初始权限数据 - String[] RESOURCE_PERMISSION_DATA = { - "{\"displayType\":\"MENU\",\"displayName\":\"系统管理\",\"resourceCode\":\"system\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"数据字典管理\",\"resourceCode\":\"Dictionary\",\"apiSet\":\"GET:/dictionary/list\",\"sortId\":\"10030\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/dictionary/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/dictionary/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/dictionary/{id},GET:/dictionary/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/dictionary/{id}\",\"sortId\":\"3\"}]},{\"displayType\":\"MENU\",\"displayName\":\"系统用户管理\",\"resourceCode\":\"IamUser\",\"apiSet\":\"GET:/iam/user/list\",\"sortId\":\"10029\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"部门查看\",\"resourceCode\":\"orgTree\",\"apiSet\":\"GET:/iam/org/tree\",\"sortId\":\"12\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"11\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"10\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"9\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"8\"}]},{\"displayType\":\"MENU\",\"displayName\":\"角色资源管理\",\"resourceCode\":\"IamRole\",\"apiSet\":\"GET:/iam/role/list\",\"sortId\":\"10023\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/role/{id}\",\"sortId\":\"16\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/role/\",\"sortId\":\"15\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/role/{id},GET:/iam/role/{id}\",\"sortId\":\"14\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/role/{id}\",\"sortId\":\"13\"}]},{\"displayType\":\"MENU\",\"displayName\":\"资源权限管理\",\"resourceCode\":\"IamResourcePermission\",\"apiSet\":\"GET:/iam/resourcePermission/list\",\"sortId\":\"10017\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/resourcePermission/{id}\",\"sortId\":\"23\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/resourcePermission/\",\"sortId\":\"21\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/resourcePermission/{id},GET:/iam/resourcePermission/{id}\",\"sortId\":\"20\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/resourcePermission/{id}\",\"sortId\":\"19\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/resourcePermission/sortList\",\"sortId\":\"18\"}]},{\"displayType\":\"MENU\",\"displayName\":\"定时任务管理\",\"resourceCode\":\"ScheduleJob\",\"apiSet\":\"GET:/scheduleJob/list\",\"sortId\":\"10012\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/scheduleJob/{id}\",\"sortId\":\"7\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/scheduleJob/{id}/{action},GET:/scheduleJob/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/scheduleJob/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/scheduleJob/{id},GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"运行一次\",\"resourceCode\":\"executeOnce\",\"apiSet\":\"PUT:/scheduleJob/executeOnce/{id}\",\"sortId\":\"3\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志记录\",\"resourceCode\":\"logList\",\"apiSet\":\"GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"2\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志删除\",\"resourceCode\":\"logDelete\",\"apiSet\":\"DELETE:/scheduleJob/log/{id}\",\"sortId\":\"1\"}]},{\"displayType\":\"MENU\",\"displayName\":\"操作日志查看\",\"resourceCode\":\"IamOperationLog\",\"apiSet\":\"GET:/iam/operationLog/list\",\"sortId\":\"10006\",\"children\":[]},{\"displayType\":\"MENU\",\"displayName\":\"登录日志查看\",\"resourceCode\":\"IamLoginTrace\",\"apiSet\":\"GET:/iam/loginTrace/list\",\"sortId\":\"10001\",\"children\":[]}]}", - "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id},GET:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id},GET:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload,POST:/iam/user/excel/preview,GET:/iam/user/excel/downloadExample\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" - }; - // 插入多层级资源权限初始数据 - try { - for (String resourcePermissionJson : RESOURCE_PERMISSION_DATA) { - IamResourcePermissionListVO permissionListVO = JSON.toJavaObject(resourcePermissionJson, IamResourcePermissionListVO.class); - ContextHelper.getBean(IamResourcePermissionService.class).deepCreatePermissionAndChildren(permissionListVO); + IamResourcePermissionService resourcePermissionService = ContextHelper.getBean(IamResourcePermissionService.class); + if(resourcePermissionService != null && !resourcePermissionService.exists(IamResourcePermission::getResourceCode, "system")){ + String[] RESOURCE_PERMISSION_DATA = { + "{\"displayType\":\"MENU\",\"displayName\":\"系统管理\",\"resourceCode\":\"system\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"数据字典管理\",\"resourceCode\":\"Dictionary\",\"apiSet\":\"GET:/dictionary/list\",\"sortId\":\"10030\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/dictionary/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/dictionary/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/dictionary/{id},GET:/dictionary/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/dictionary/{id}\",\"sortId\":\"3\"}]},{\"displayType\":\"MENU\",\"displayName\":\"系统用户管理\",\"resourceCode\":\"IamUser\",\"apiSet\":\"GET:/iam/user/list\",\"sortId\":\"10029\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"部门查看\",\"resourceCode\":\"orgTree\",\"apiSet\":\"GET:/iam/org/tree\",\"sortId\":\"12\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"11\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"10\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"9\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"8\"}]},{\"displayType\":\"MENU\",\"displayName\":\"角色资源管理\",\"resourceCode\":\"IamRole\",\"apiSet\":\"GET:/iam/role/list\",\"sortId\":\"10023\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/role/{id}\",\"sortId\":\"16\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/role/\",\"sortId\":\"15\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/role/{id},GET:/iam/role/{id}\",\"sortId\":\"14\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/role/{id}\",\"sortId\":\"13\"}]},{\"displayType\":\"MENU\",\"displayName\":\"资源权限管理\",\"resourceCode\":\"IamResourcePermission\",\"apiSet\":\"GET:/iam/resourcePermission/list\",\"sortId\":\"10017\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/resourcePermission/{id}\",\"sortId\":\"23\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/resourcePermission/\",\"sortId\":\"21\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/resourcePermission/{id},GET:/iam/resourcePermission/{id}\",\"sortId\":\"20\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/resourcePermission/{id}\",\"sortId\":\"19\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/resourcePermission/sortList\",\"sortId\":\"18\"}]},{\"displayType\":\"MENU\",\"displayName\":\"定时任务管理\",\"resourceCode\":\"ScheduleJob\",\"apiSet\":\"GET:/scheduleJob/list\",\"sortId\":\"10012\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/scheduleJob/{id}\",\"sortId\":\"7\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/scheduleJob/{id}/{action},GET:/scheduleJob/{id}\",\"sortId\":\"6\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/scheduleJob/\",\"sortId\":\"5\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/scheduleJob/{id},GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"4\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"运行一次\",\"resourceCode\":\"executeOnce\",\"apiSet\":\"PUT:/scheduleJob/executeOnce/{id}\",\"sortId\":\"3\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志记录\",\"resourceCode\":\"logList\",\"apiSet\":\"GET:/scheduleJob/log/list,GET:/scheduleJob/log/{id}\",\"sortId\":\"2\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"日志删除\",\"resourceCode\":\"logDelete\",\"apiSet\":\"DELETE:/scheduleJob/log/{id}\",\"sortId\":\"1\"}]},{\"displayType\":\"MENU\",\"displayName\":\"操作日志查看\",\"resourceCode\":\"IamOperationLog\",\"apiSet\":\"GET:/iam/operationLog/list\",\"sortId\":\"10006\",\"children\":[]},{\"displayType\":\"MENU\",\"displayName\":\"登录日志查看\",\"resourceCode\":\"IamLoginTrace\",\"apiSet\":\"GET:/iam/loginTrace/list\",\"sortId\":\"10001\",\"children\":[]}]}", + "{\"displayType\":\"MENU\",\"displayName\":\"组织机构\",\"resourceCode\":\"orgStructure\",\"children\":[{\"displayType\":\"MENU\",\"displayName\":\"组织机构管理\",\"resourceCode\":\"IamOrg\",\"apiSet\":\"POST:/iam/org/sortList,GET:/iam/org/tree,GET:/iam/org/tree/{parentNodeId},GET:/iam/org/list\",\"sortId\":\"10044\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"排序\",\"resourceCode\":\"sort\",\"apiSet\":\"POST:/iam/org/sortList\",\"sortId\":\"106\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/org/{id}\",\"sortId\":\"105\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/org/{id},GET:/iam/org/{id}\",\"sortId\":\"104\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/org/\",\"sortId\":\"103\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/org/{id}\",\"sortId\":\"102\"}]},{\"displayType\":\"MENU\",\"displayName\":\"岗位管理\",\"resourceCode\":\"IamPosition\",\"apiSet\":\"GET:/iam/position/list\",\"sortId\":\"10038\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/position/{id}\",\"sortId\":\"112\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/position/{id}\",\"sortId\":\"111\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/position/{id},GET:/iam/position/{id}\",\"sortId\":\"110\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"108\"}]},{\"displayType\":\"MENU\",\"displayName\":\"组织人员管理\",\"resourceCode\":\"IamOrgUser\",\"apiSet\":\"GET:/iam/org/tree,GET:/iam/user/list\",\"sortId\":\"10032\",\"children\":[{\"displayType\":\"PERMISSION\",\"displayName\":\"新建\",\"resourceCode\":\"create\",\"apiSet\":\"POST:/iam/user/\",\"sortId\":\"40\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"更新\",\"resourceCode\":\"update\",\"apiSet\":\"PUT:/iam/user/{id},GET:/iam/user/{id}\",\"sortId\":\"39\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"删除\",\"resourceCode\":\"delete\",\"apiSet\":\"DELETE:/iam/user/{id}\",\"sortId\":\"38\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"详情\",\"resourceCode\":\"detail\",\"apiSet\":\"GET:/iam/user/{id}\",\"sortId\":\"37\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导入\",\"resourceCode\":\"import\",\"apiSet\":\"POST:/iam/user/excel/previewSave,POST:/iam/user/excel/upload,POST:/iam/user/excel/preview,GET:/iam/user/excel/downloadExample\",\"sortId\":\"36\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"导出\",\"resourceCode\":\"export\",\"apiSet\":\"GET:/iam/user/excel/export\",\"sortId\":\"35\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"人员岗位设置\",\"resourceCode\":\"position\",\"apiSet\":\"POST:/iam/position/batchUpdateUserPositionRelations,GET:/iam/position/listUserPositions/{userType}/{userId},GET:/iam/positionkvList\",\"sortId\":\"34\"},{\"displayType\":\"PERMISSION\",\"displayName\":\"添加岗位\",\"resourceCode\":\"addPosition\",\"apiSet\":\"POST:/iam/position/\",\"sortId\":\"33\"}]}]}" + }; + // 插入多层级资源权限初始数据 + try { + for (String resourcePermissionJson : RESOURCE_PERMISSION_DATA) { + IamResourcePermissionListVO permissionListVO = JSON.toJavaObject(resourcePermissionJson, IamResourcePermissionListVO.class); + resourcePermissionService.deepCreatePermissionAndChildren(permissionListVO); + } + RESOURCE_PERMISSION_DATA = null; + } catch (BusinessException e){ + log.error("初始化资源权限数据出错,请手动配置前端资源初始的权限数据", e.getMessage()); } - RESOURCE_PERMISSION_DATA = null; - } catch (BusinessException e){ - log.error("初始化资源权限数据出错,请手动配置前端资源初始的权限数据", e.getMessage()); } - IamOrg iamOrg = new IamOrg(); - iamOrg.setCode("ROOT").setDepth(1).setTopOrgId(1L).setName("我的公司").setShortName("我的公司").setType(Cons.DICTCODE_ORG_TYPE.COMP.name()).setOrgComment("初始根节点,请按需修改") - .setId(1L); - ContextHelper.getBean(IamOrgService.class).createEntity(iamOrg); + // 插入公司根节点 + IamOrgService iamOrgService = ContextHelper.getBean(IamOrgService.class); + if(iamOrgService != null && iamOrgService.getEntityListCount(null) == 0){ + IamOrg iamOrg = new IamOrg(); + iamOrg.setCode("ROOT").setDepth(1).setTopOrgId(1L).setName("我的公司").setShortName("我的公司") + .setType(Cons.DICTCODE_ORG_TYPE.COMP.name()).setOrgComment("初始根节点,请按需修改").setId(1L); + iamOrgService.createEntity(iamOrg); + } // 插入超级管理员用户及角色 - IamRole iamRole = new IamRole(); - iamRole.setName("超级管理员").setCode(Cons.ROLE_SUPER_ADMIN); - ContextHelper.getBean(IamRoleService.class).createEntity(iamRole); + IamRoleService iamRoleService = ContextHelper.getBean(IamRoleService.class); + if(iamRoleService != null && iamRoleService.getEntityListCount(null) == 0){ + IamRole iamRole = new IamRole(); + iamRole.setName("超级管理员").setCode(Cons.ROLE_SUPER_ADMIN); + iamRoleService.createEntity(iamRole); + + IamUser iamUser = new IamUser(); + iamUser.setOrgId(0L).setRealname("DIBOOT").setUserNum("0000").setGender("M").setMobilePhone("10000000000"); + ContextHelper.getBean(IamUserService.class).createEntity(iamUser); - IamUser iamUser = new IamUser(); - iamUser.setOrgId(0L).setRealname("DIBOOT").setUserNum("0000").setGender("M").setMobilePhone("10000000000"); - ContextHelper.getBean(IamUserService.class).createEntity(iamUser); + // 插入对象 + IamUserRole iamUserRole = new IamUserRole(IamUser.class.getSimpleName(), iamUser.getId(), iamRole.getId()); + ContextHelper.getBean(IamUserRoleService.class).getMapper().insert(iamUserRole); - // 插入对象 - IamUserRole iamUserRole = new IamUserRole(IamUser.class.getSimpleName(), iamUser.getId(), iamRole.getId()); - ContextHelper.getBean(IamUserRoleService.class).getMapper().insert(iamUserRole); + // 创建账号 + IamAccount iamAccount = new IamAccount(); + iamAccount.setUserType(IamUser.class.getSimpleName()).setUserId(iamUser.getId()) + .setAuthType(Cons.DICTCODE_AUTH_TYPE.PWD.name()) + .setAuthAccount("admin").setAuthSecret("123456"); + ContextHelper.getBean(IamAccountService.class).createEntity(iamAccount); + } - // 创建账号 - IamAccount iamAccount = new IamAccount(); - iamAccount.setUserType(IamUser.class.getSimpleName()).setUserId(iamUser.getId()) - .setAuthType(Cons.DICTCODE_AUTH_TYPE.PWD.name()) - .setAuthAccount("admin").setAuthSecret("123456"); - ContextHelper.getBean(IamAccountService.class).createEntity(iamAccount); } } \ No newline at end of file diff --git a/diboot-message-starter/src/main/java/com/diboot/message/starter/MessagePluginInitializer.java b/diboot-message-starter/src/main/java/com/diboot/message/starter/MessagePluginInitializer.java index a7a65838..65971023 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/starter/MessagePluginInitializer.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/starter/MessagePluginInitializer.java @@ -15,6 +15,7 @@ */ package com.diboot.message.starter; +import com.diboot.core.entity.Dictionary; import com.diboot.core.service.DictionaryService; import com.diboot.core.util.ContextHelper; import com.diboot.core.util.JSON; @@ -68,15 +69,19 @@ public class MessagePluginInitializer implements ApplicationRunner { */ private void insertInitData() { // 插入iam组件所需的数据字典 - String[] DICT_INIT_DATA = { - "{\"type\":\"MESSAGE_STATUS\", \"itemName\":\"消息状态\", \"description\":\"message消息状态\", \"children\":[{\"itemName\":\"发送中\", \"itemValue\":\"SENDING\", \"sortId\":1},{\"itemName\":\"发送异常\", \"itemValue\":\"EXCEPTION\", \"sortId\":2},{\"itemName\":\"已送达\", \"itemValue\":\"DELIVERY\", \"sortId\":3},{\"itemName\":\"未读\", \"itemValue\":\"UNREAD\", \"sortId\":4},{\"itemName\":\"已读\", \"itemValue\":\"READ\", \"sortId\":5}]}", - "{\"type\":\"MESSAGE_CHANNEL\", \"itemName\":\"发送通道\", \"description\":\"message发送通道\", \"children\":[{\"itemName\":\"站内信\", \"itemValue\":\"WEBSOCKET\", \"sortId\":1},{\"itemName\":\"短信\", \"itemValue\":\"TEXT_MESSAGE\", \"sortId\":2},{\"itemName\":\"邮件\", \"itemValue\":\"EMAIL\", \"sortId\":3}]}" - }; - // 插入数据字典 - for (String dictJson : DICT_INIT_DATA) { - DictionaryVO dictVo = JSON.toJavaObject(dictJson, DictionaryVO.class); - ContextHelper.getBean(DictionaryService.class).createDictAndChildren(dictVo); + DictionaryService dictionaryService = ContextHelper.getBean(DictionaryService.class); + if(dictionaryService != null && !dictionaryService.exists(Dictionary::getType, "MESSAGE_CHANNEL")){ + // 插入iam组件所需的数据字典 + String[] DICT_INIT_DATA = { + "{\"type\":\"MESSAGE_STATUS\", \"itemName\":\"消息状态\", \"description\":\"message消息状态\", \"children\":[{\"itemName\":\"发送中\", \"itemValue\":\"SENDING\", \"sortId\":1},{\"itemName\":\"发送异常\", \"itemValue\":\"EXCEPTION\", \"sortId\":2},{\"itemName\":\"已送达\", \"itemValue\":\"DELIVERY\", \"sortId\":3},{\"itemName\":\"未读\", \"itemValue\":\"UNREAD\", \"sortId\":4},{\"itemName\":\"已读\", \"itemValue\":\"READ\", \"sortId\":5}]}", + "{\"type\":\"MESSAGE_CHANNEL\", \"itemName\":\"发送通道\", \"description\":\"message发送通道\", \"children\":[{\"itemName\":\"站内信\", \"itemValue\":\"WEBSOCKET\", \"sortId\":1},{\"itemName\":\"短信\", \"itemValue\":\"TEXT_MESSAGE\", \"sortId\":2},{\"itemName\":\"邮件\", \"itemValue\":\"EMAIL\", \"sortId\":3}]}" + }; + // 插入数据字典 + for (String dictJson : DICT_INIT_DATA) { + DictionaryVO dictVo = JSON.toJavaObject(dictJson, DictionaryVO.class); + dictionaryService.createDictAndChildren(dictVo); + } + DICT_INIT_DATA = null; } - DICT_INIT_DATA = null; } } -- Gitee From 63817e72332d8d67a3b81226ea8dd6ace86b746c Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 8 Jun 2021 16:02:50 +0800 Subject: [PATCH 18/83] =?UTF-8?q?+=20=E4=B8=8D=E7=AD=89=E4=BA=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/diboot/core/binding/QueryBuilder.java | 8 ++++++-- .../java/com/diboot/core/binding/query/Comparison.java | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index 73e55b06..c655d3eb 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -15,13 +15,13 @@ */ package com.diboot.core.binding; +import com.baomidou.mybatisplus.annotation.SqlCondition; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.core.conditions.ISqlSegment; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList; -import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.binding.parser.ParserCache; import com.diboot.core.binding.query.BindQuery; import com.diboot.core.binding.query.Comparison; @@ -29,7 +29,6 @@ import com.diboot.core.binding.query.Strategy; import com.diboot.core.binding.query.dynamic.AnnoJoiner; import com.diboot.core.binding.query.dynamic.DynamicJoinQueryWrapper; import com.diboot.core.binding.query.dynamic.ExtQueryWrapper; -import com.diboot.core.config.Cons; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.S; import com.diboot.core.util.V; @@ -259,7 +258,12 @@ public class QueryBuilder { wrapper.ge(columnName, value); } break; + // 不等于 + case NOT_EQ: + wrapper.ne(columnName, value); + break; default: + break; } } return wrapper; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/query/Comparison.java b/diboot-core/src/main/java/com/diboot/core/binding/query/Comparison.java index cfe1f846..5d8d8bd0 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/query/Comparison.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/query/Comparison.java @@ -37,5 +37,7 @@ public enum Comparison { BETWEEN, //介于-之间 BETWEEN_BEGIN, //介于之后 - BETWEEN_END //介于之前 + BETWEEN_END, //介于之前 + + NOT_EQ, //不等于 } -- Gitee From 8104d3f743da0638cc2c9fd1af2cebb1c986cb28 Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Wed, 9 Jun 2021 11:01:54 +0800 Subject: [PATCH 19/83] =?UTF-8?q?+=20=E5=88=A0=E9=99=A4=E6=92=A4=E5=9B=9E?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseCrudRestController.java | 29 +++++++++++++++++++ .../diboot/core/mapper/BaseCrudMapper.java | 3 ++ .../com/diboot/core/service/BaseService.java | 7 +++++ .../core/service/impl/BaseServiceImpl.java | 7 ++++- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java index 50fd52c3..2db5d345 100644 --- a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java +++ b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java @@ -31,6 +31,7 @@ import com.diboot.core.vo.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; import java.io.Serializable; import java.util.Collection; @@ -234,6 +235,26 @@ public class BaseCrudRestController extends BaseContro } } + /*** + * 根据id撤销删除 + * @param id + * @return + * @throws Exception + */ + public JsonResult cancelDeleteEntityMapping(Serializable id) throws Exception { + boolean success = getService().cancelDeleteEntity(id); + E entity = null; + if (success){ + entity = (E) getService().getEntity(id); + this.afterDeletedCanceled(entity); + log.info("撤回删除操作成功,{}:{}", entity.getClass().getSimpleName(), id); + return JsonResult.OK("撤回成功"); + } else { + log.warn("撤回删除操作未成功,{}:{}", entity.getClass().getSimpleName(), id); + return JsonResult.FAIL_OPERATION("撤回失败"); + } + } + /*** * 根据id批量删除资源对象,用于子类重写的方法 * @param ids @@ -329,6 +350,14 @@ public class BaseCrudRestController extends BaseContro protected void afterDeleted(Object entityOrDto) throws Exception { } + /*** + * 撤销删除成功后的相关处理 + * @param entityOrDto + * @throws Exception + */ + protected void afterDeletedCanceled(Object entityOrDto) throws Exception { + } + /*** * 是否有批量删除权限,如不可删除返回错误提示信息,如 Status.FAIL_NO_PERMISSION.label() * @param ids diff --git a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java index 2dd7ab6b..2d807be8 100644 --- a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java +++ b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java @@ -17,6 +17,8 @@ package com.diboot.core.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.io.Serializable; + /** * 基础CRUD的父类Mapper * @author mazc@dibo.ltd @@ -25,4 +27,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface BaseCrudMapper extends BaseMapper { + int cancelDeleteById(Serializable id); } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java index 305701c6..4b91baf4 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java +++ b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java @@ -191,6 +191,13 @@ public interface BaseService { */ boolean deleteEntity(Serializable id); + /** + * 根据主键撤销删除 + * @param id + * @return + */ + boolean cancelDeleteEntity(Serializable id); + /** * 按条件删除实体 * @param queryWrapper diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index c77617f8..5706a3b5 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -403,7 +403,12 @@ public class BaseServiceImpl, T> extends ServiceImpl return super.removeById(id); } - @Override + @Override + public boolean cancelDeleteEntity(Serializable id) { + return this.getMapper().cancelDeleteById(id) > 0; + } + + @Override public boolean deleteEntities(Wrapper queryWrapper){ // 执行 return super.remove(queryWrapper); -- Gitee From 12b3f262fcc3c53a989c7bed376e4801c86ef325 Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Wed, 9 Jun 2021 15:59:12 +0800 Subject: [PATCH 20/83] =?UTF-8?q?+=20=E5=9F=BA=E7=A1=80=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=92=A4=E5=9B=9E/=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E6=92=A4=E5=9B=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/mapper/DictionaryMapper.java | 10 ++++++++++ .../core/controller/BaseCrudRestController.java | 7 +++---- .../java/com/diboot/core/mapper/BaseCrudMapper.java | 2 +- .../java/com/diboot/core/service/BaseService.java | 2 +- .../com/diboot/core/service/impl/BaseServiceImpl.java | 5 ++--- .../java/com/diboot/file/mapper/UploadFileMapper.java | 10 ++++++++++ .../java/com/diboot/iam/mapper/IamAccountMapper.java | 10 ++++++++++ .../com/diboot/iam/mapper/IamLoginTraceMapper.java | 10 ++++++++++ .../com/diboot/iam/mapper/IamOperationLogMapper.java | 10 ++++++++++ .../main/java/com/diboot/iam/mapper/IamOrgMapper.java | 10 ++++++++++ .../java/com/diboot/iam/mapper/IamPositionMapper.java | 10 ++++++++++ .../java/com/diboot/iam/mapper/IamRoleMapper.java | 10 ++++++++++ .../java/com/diboot/iam/mapper/IamUserMapper.java | 11 +++++++++++ .../java/com/diboot/message/mapper/MessageMapper.java | 10 ++++++++++ .../diboot/message/mapper/MessageTemplateMapper.java | 10 ++++++++++ .../diboot/scheduler/mapper/ScheduleJobLogMapper.java | 10 ++++++++++ .../diboot/scheduler/mapper/ScheduleJobMapper.java | 10 ++++++++++ 17 files changed, 138 insertions(+), 9 deletions(-) diff --git a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java index ec15f35a..ac2684fd 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java @@ -17,6 +17,9 @@ package com.diboot.core.mapper; import com.diboot.core.entity.Dictionary; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 数据字典Mapper @@ -27,5 +30,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface DictionaryMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `dictionary` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java index 2db5d345..b96221c8 100644 --- a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java +++ b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java @@ -31,7 +31,6 @@ import com.diboot.core.vo.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; import java.io.Serializable; import java.util.Collection; @@ -236,13 +235,13 @@ public class BaseCrudRestController extends BaseContro } /*** - * 根据id撤销删除 + * 根据id撤回删除 * @param id * @return * @throws Exception */ - public JsonResult cancelDeleteEntityMapping(Serializable id) throws Exception { - boolean success = getService().cancelDeleteEntity(id); + public JsonResult canceledDeleteEntityMapping(Serializable id) throws Exception { + boolean success = getService().canceledDeleteEntity(id); E entity = null; if (success){ entity = (E) getService().getEntity(id); diff --git a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java index 2d807be8..3b4a675f 100644 --- a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java +++ b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java @@ -27,5 +27,5 @@ import java.io.Serializable; */ public interface BaseCrudMapper extends BaseMapper { - int cancelDeleteById(Serializable id); + int canceledDeleteById(Serializable id); } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java index 4b91baf4..dc5aec5c 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java +++ b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java @@ -196,7 +196,7 @@ public interface BaseService { * @param id * @return */ - boolean cancelDeleteEntity(Serializable id); + boolean canceledDeleteEntity(Serializable id); /** * 按条件删除实体 diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index 5706a3b5..aee10d1c 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -30,7 +30,6 @@ import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers; -import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.diboot.core.binding.Binder; import com.diboot.core.binding.binder.EntityBinder; import com.diboot.core.binding.binder.EntityListBinder; @@ -404,8 +403,8 @@ public class BaseServiceImpl, T> extends ServiceImpl } @Override - public boolean cancelDeleteEntity(Serializable id) { - return this.getMapper().cancelDeleteById(id) > 0; + public boolean canceledDeleteEntity(Serializable id) { + return this.getMapper().canceledDeleteById(id) > 0; } @Override diff --git a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java index e02808b0..1be46cd1 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java @@ -18,6 +18,9 @@ package com.diboot.file.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.file.entity.UploadFile; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 文件相关Mapper @@ -27,4 +30,11 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface UploadFileMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `upload_file` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java index 8724a7ca..f548d039 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamAccount; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 认证用户Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamAccountMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_account` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java index 90518bb3..62c75e39 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamLoginTrace; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 登录记录Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamLoginTraceMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_login_trace` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java index e55f0811..a0856bb3 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamOperationLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 操作日志Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamOperationLogMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_operation_log` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java index baf6421d..0871e514 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamOrg; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 组织机构Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamOrgMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_org` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java index fbb98c82..9dbc8f5e 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamPosition; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 岗位Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamPositionMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_position` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java index 513f03a3..c4c1e8a2 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java @@ -18,6 +18,9 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamRole; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 角色Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IamRoleMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_role` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index a86a4d57..af7da40d 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -22,6 +22,9 @@ import com.diboot.iam.entity.IamUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 系统用户Mapper @@ -32,6 +35,14 @@ import org.apache.ibatis.annotations.Select; @Mapper public interface IamUserMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `iam_user` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); + /*** * 通过org层级的排序来获取用户分页数据 * @param page diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java index 8106d189..d004b451 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java @@ -19,6 +19,9 @@ package com.diboot.message.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.message.entity.Message; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 消息Mapper @@ -31,5 +34,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface MessageMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `message` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java index 56668e59..4fd9d1e6 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java @@ -18,6 +18,9 @@ package com.diboot.message.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.message.entity.MessageTemplate; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** @@ -31,5 +34,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface MessageTemplateMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `message_template` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java index d8c4762d..e6e5160d 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java @@ -18,6 +18,9 @@ package com.diboot.scheduler.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.scheduler.entity.ScheduleJobLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 定时任务Job定义Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ScheduleJobLogMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `schedule_job_log` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java index 1e5da626..88fbc011 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java @@ -18,6 +18,9 @@ package com.diboot.scheduler.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.scheduler.entity.ScheduleJob; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +import java.io.Serializable; /** * 定时任务Job定义Mapper @@ -28,5 +31,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ScheduleJobMapper extends BaseCrudMapper { + /*** + * 通过ID撤回逻辑删除 + * @param id + * @return + */ + @Update("UPDATE `schedule_job` SET is_deleted=0 WHERE id=#{id}") + int canceledDeleteById(Serializable id); } -- Gitee From 8c34d24783d2597e3a3b95c29328da37b610164f Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Thu, 10 Jun 2021 11:13:31 +0800 Subject: [PATCH 21/83] =?UTF-8?q?optimize:=20=E4=BC=98=E5=8C=96=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=92=A4=E5=9B=9E=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/mapper/DictionaryMapper.java | 7 ------- .../core/controller/BaseCrudRestController.java | 4 ++-- .../java/com/diboot/core/mapper/BaseCrudMapper.java | 11 ++++++++++- .../java/com/diboot/core/service/BaseService.java | 2 +- .../com/diboot/core/service/impl/BaseServiceImpl.java | 8 ++++++-- .../java/com/diboot/file/mapper/UploadFileMapper.java | 7 ------- .../java/com/diboot/iam/mapper/IamAccountMapper.java | 7 ------- .../com/diboot/iam/mapper/IamLoginTraceMapper.java | 7 ------- .../com/diboot/iam/mapper/IamOperationLogMapper.java | 7 ------- .../main/java/com/diboot/iam/mapper/IamOrgMapper.java | 7 ------- .../java/com/diboot/iam/mapper/IamPositionMapper.java | 7 ------- .../java/com/diboot/iam/mapper/IamRoleMapper.java | 7 ------- .../java/com/diboot/iam/mapper/IamUserMapper.java | 8 -------- .../java/com/diboot/message/mapper/MessageMapper.java | 7 ------- .../diboot/message/mapper/MessageTemplateMapper.java | 7 ------- .../diboot/scheduler/mapper/ScheduleJobLogMapper.java | 7 ------- .../diboot/scheduler/mapper/ScheduleJobMapper.java | 7 ------- 17 files changed, 19 insertions(+), 98 deletions(-) diff --git a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java index ac2684fd..935d8acc 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java @@ -30,12 +30,5 @@ import java.io.Serializable; @Mapper public interface DictionaryMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `dictionary` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java index b96221c8..f7ca3623 100644 --- a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java +++ b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java @@ -240,8 +240,8 @@ public class BaseCrudRestController extends BaseContro * @return * @throws Exception */ - public JsonResult canceledDeleteEntityMapping(Serializable id) throws Exception { - boolean success = getService().canceledDeleteEntity(id); + public JsonResult cancelDeletedEntityMapping(Serializable id) throws Exception { + boolean success = getService().cancelDeletedById(id); E entity = null; if (success){ entity = (E) getService().getEntity(id); diff --git a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java index 3b4a675f..3676613f 100644 --- a/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java +++ b/diboot-core/src/main/java/com/diboot/core/mapper/BaseCrudMapper.java @@ -16,6 +16,8 @@ package com.diboot.core.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; import java.io.Serializable; @@ -27,5 +29,12 @@ import java.io.Serializable; */ public interface BaseCrudMapper extends BaseMapper { - int canceledDeleteById(Serializable id); + /*** + * 通过id撤回当前记录的删除状态 + * @param tableName + * @param id + * @return + */ + @Update("UPDATE `${tableName}` SET is_deleted=0 WHERE id=#{id}") + int cancelDeletedById(@Param("tableName") String tableName, @Param("id") Serializable id); } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java index dc5aec5c..78bec074 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java +++ b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java @@ -196,7 +196,7 @@ public interface BaseService { * @param id * @return */ - boolean canceledDeleteEntity(Serializable id); + boolean cancelDeletedById(Serializable id); /** * 按条件删除实体 diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index aee10d1c..e4a68b1e 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -35,7 +35,9 @@ import com.diboot.core.binding.binder.EntityBinder; import com.diboot.core.binding.binder.EntityListBinder; import com.diboot.core.binding.binder.FieldBinder; import com.diboot.core.binding.binder.FieldListBinder; +import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.binding.helper.ServiceAdaptor; +import com.diboot.core.binding.parser.EntityInfoCache; import com.diboot.core.binding.query.dynamic.DynamicJoinQueryWrapper; import com.diboot.core.config.BaseConfig; import com.diboot.core.config.Cons; @@ -403,8 +405,10 @@ public class BaseServiceImpl, T> extends ServiceImpl } @Override - public boolean canceledDeleteEntity(Serializable id) { - return this.getMapper().canceledDeleteById(id) > 0; + public boolean cancelDeletedById(Serializable id) { + EntityInfoCache info = BindingCacheManager.getEntityInfoByClass(super.getEntityClass()); + String tableName = info.getTableName(); + return this.getMapper().cancelDeletedById(tableName, id) > 0; } @Override diff --git a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java index 1be46cd1..a0df6969 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java @@ -30,11 +30,4 @@ import java.io.Serializable; @Mapper public interface UploadFileMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `upload_file` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java index f548d039..b2086dd8 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamAccountMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_account` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java index 62c75e39..04729db9 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamLoginTraceMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_login_trace` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java index a0856bb3..9649b243 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamOperationLogMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_operation_log` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java index 0871e514..f5c2ee63 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamOrgMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_org` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java index 9dbc8f5e..82281e24 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamPositionMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_position` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java index c4c1e8a2..420fc192 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface IamRoleMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_role` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index af7da40d..c004768f 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -35,14 +35,6 @@ import java.io.Serializable; @Mapper public interface IamUserMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `iam_user` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); - /*** * 通过org层级的排序来获取用户分页数据 * @param page diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java index d004b451..b24dd27b 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java @@ -34,12 +34,5 @@ import java.io.Serializable; @Mapper public interface MessageMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `message` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java index 4fd9d1e6..9be5c7af 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java @@ -34,12 +34,5 @@ import java.io.Serializable; @Mapper public interface MessageTemplateMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `message_template` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java index e6e5160d..922e74ad 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface ScheduleJobLogMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `schedule_job_log` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java index 88fbc011..e8c88926 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java @@ -31,12 +31,5 @@ import java.io.Serializable; @Mapper public interface ScheduleJobMapper extends BaseCrudMapper { - /*** - * 通过ID撤回逻辑删除 - * @param id - * @return - */ - @Update("UPDATE `schedule_job` SET is_deleted=0 WHERE id=#{id}") - int canceledDeleteById(Serializable id); } -- Gitee From 71ee80afc8019cf2e045a3cad907a9467ddc86ea Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 11 Jun 2021 13:35:51 +0800 Subject: [PATCH 22/83] =?UTF-8?q?*=20BindQuery=E6=94=AF=E6=8C=81List?= =?UTF-8?q?=E9=85=8D=E7=BD=AEempty=E7=A9=BA=E5=80=BC=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/test/binder/dto/DepartmentDTO.java | 4 ++++ .../diboot/core/test/binder/dto/UserDTO.java | 2 +- .../diboot/core/test/query/TestJoinQuery.java | 16 ++++++++++++++++ .../com/diboot/core/binding/QueryBuilder.java | 12 +++++++++--- .../com/diboot/core/binding/query/BindQuery.java | 2 +- .../com/diboot/core/binding/query/Strategy.java | 8 ++++---- .../java/com/diboot/core/util/BeanUtils.java | 1 + 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java index 4e947950..e90e8976 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java @@ -28,6 +28,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; +import java.util.List; /** * Department DTO @@ -65,6 +66,9 @@ public class DepartmentDTO implements Serializable { @BindQuery(comparison = Comparison.LT, field = "createTime") private Date createTimeEnd; + @BindQuery(field = "parent_id", comparison = Comparison.IN) + private List parentIds; + public Date getCreateTimeEnd(){ return D.nextDay(createTime); } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java index 3a5b4f07..570f692a 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java @@ -45,7 +45,7 @@ public class UserDTO extends User { // 通过中间表关联Entity @BindQuery(comparison = Comparison.ENDSWITH, entity = Organization.class, field = "name", - condition = "this.department_id=department.id AND department.org_id=id AND parent_id=0", strategy = Strategy.INCLUDE_EMPTY_STRING) + condition = "this.department_id=department.id AND department.org_id=id AND parent_id=0", strategy = Strategy.INCLUDE_EMPTY) private String orgName; // LEFT JOIN department r2m ON self.department_id = r2m.id // LEFT JOIN organization r1 ON r2m.org_id=r2.id diff --git a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java index c122fbe8..b36f381b 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java @@ -66,6 +66,22 @@ public class TestJoinQuery { Assert.assertTrue(list.size() >= 1); } + @Test + public void testInQuery(){ + List parentIds = new ArrayList<>(); + DepartmentDTO departmentDTO = new DepartmentDTO(); + departmentDTO.setParentIds(parentIds); + QueryWrapper queryWrapper = QueryBuilder.toQueryWrapper(departmentDTO); + System.out.println(queryWrapper.getExpression()); + List list = Binder.joinQueryList(queryWrapper, Department.class); + Assert.assertTrue(list.size() > 1); + + parentIds.add(10001L); + queryWrapper = QueryBuilder.toQueryWrapper(departmentDTO); + list = Binder.joinQueryList(queryWrapper, Department.class); + Assert.assertTrue(list.size() == 1); + } + @Test public void testSingleTableQuery(){ Department entity = new Department(); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index c655d3eb..19a2a98e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -154,11 +154,17 @@ public class QueryBuilder { continue; } Object value = entry.getValue(); - // 处理空字符串"" - if(value instanceof String && S.isEmpty((String)value)){ - if(query != null && query.strategy().equals(Strategy.IGNORE_EMPTY_STRING)){ + if(query != null && query.strategy().equals(Strategy.IGNORE_EMPTY)){ + // 处理空字符串"" + if(value instanceof String && S.isEmpty((String)value)){ continue; } + if(value instanceof Collection){ + Collection valueList = (Collection)value; + if(valueList.size() == 0){ + continue; + } + } } // 对比类型 Comparison comparison = Comparison.EQ; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/query/BindQuery.java b/diboot-core/src/main/java/com/diboot/core/binding/query/BindQuery.java index e409e689..830dbad7 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/query/BindQuery.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/query/BindQuery.java @@ -63,5 +63,5 @@ public @interface BindQuery { * 查询处理策略:默认忽略空字符串 * @return */ - Strategy strategy() default Strategy.IGNORE_EMPTY_STRING; + Strategy strategy() default Strategy.IGNORE_EMPTY; } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/binding/query/Strategy.java b/diboot-core/src/main/java/com/diboot/core/binding/query/Strategy.java index 6238507d..6301481d 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/query/Strategy.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/query/Strategy.java @@ -24,11 +24,11 @@ package com.diboot.core.binding.query; */ public enum Strategy { /** - * 忽略空字符串"" + * 忽略空字符串"",空集合等 */ - IGNORE_EMPTY_STRING, + IGNORE_EMPTY, /** - * 包含空字符串""参与查询 + * 包含空字符串""空集合等参与查询 */ - INCLUDE_EMPTY_STRING + INCLUDE_EMPTY, } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java b/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java index 074fa52d..b79358d8 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java +++ b/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java @@ -16,6 +16,7 @@ package com.diboot.core.util; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.diboot.core.binding.copy.AcceptAnnoCopier; import com.diboot.core.config.Cons; import com.diboot.core.entity.BaseEntity; -- Gitee From 2e66bfa87958f75a52be80b158935d5a8770a851 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 11 Jun 2021 14:39:10 +0800 Subject: [PATCH 23/83] =?UTF-8?q?*=20=E5=8D=87=E7=BA=A7spring=E8=87=B32.5.?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index a12fec6c..641b12ad 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.5.0 + 2.5.1 @@ -27,9 +27,9 @@ 1.8 - 2.5.0 + 2.5.1 6.2.0.Final - 3.4.2 + 3.4.3 4.9.1 2.3.0 -- Gitee From d35fa553229c6d5e71028e1cc2070c02d1b750ee Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Fri, 11 Jun 2021 16:58:04 +0800 Subject: [PATCH 24/83] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9ERedis=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 7 ++- .../core/autoconfigure/RedisAutoConfig.java | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index 160f7717..4759dfcc 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -53,5 +53,10 @@ test + + org.springframework.boot + spring-boot-starter-data-redis + provided + - \ No newline at end of file + diff --git a/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java new file mode 100644 index 00000000..b97c1d46 --- /dev/null +++ b/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java @@ -0,0 +1,55 @@ +package com.diboot.core.autoconfigure; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * Redis 自动配置 + * + * @author wind + * @version v2.3.0 + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass(RedisOperations.class) +@ConditionalOnResource(resources = "org/springframework/data/redis") +public class RedisAutoConfig { + + @Bean + @ConditionalOnMissingBean + public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { + //... 初始化RedisTemplate + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(connectionFactory); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // 用StringRedisSerializer 序列化和反序列化key值 + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + jackson2JsonRedisSerializer.setObjectMapper(om); + + // 用Jackson2JsonRedisSerializer 序列化和反序列化value值 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} -- Gitee From ebb9ee37d92e02b32e66a913175ecb9bf1948a6e Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 11 Jun 2021 18:01:10 +0800 Subject: [PATCH 25/83] + license header --- .../core/autoconfigure/RedisAutoConfig.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java index b97c1d46..35b08ccd 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package com.diboot.core.autoconfigure; import com.fasterxml.jackson.annotation.JsonAutoDetect; -- Gitee From 7202fbc1889a8dc5edc04409b9298e7684a953d8 Mon Sep 17 00:00:00 2001 From: wuy <1311695042@qq.com> Date: Thu, 17 Jun 2021 01:07:22 +0800 Subject: [PATCH 26/83] =?UTF-8?q?optimize:=20=E5=8D=87=E7=BA=A7mp=E5=88=B0?= =?UTF-8?q?3.4.3.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/binding/helper/ServiceAdaptor.java | 2 +- .../core/service/impl/BaseServiceImpl.java | 17 ++++++++++------- .../iam/service/impl/IamUserServiceImpl.java | 2 +- pom.xml | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index da3ffe91..eb678e4e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -86,7 +86,7 @@ public class ServiceAdaptor { IPage page = convertToIPage(pagination, entityClass); page = iService.page(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 - if(page.isSearchCount()){ + if(page.searchCount()){ pagination.setTotalCount(page.getTotal()); } return page.getRecords(); diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index e4a68b1e..ecd9acb0 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; +import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; @@ -54,6 +55,7 @@ import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.lang.invoke.SerializedLambda; import java.util.*; /*** @@ -262,10 +264,10 @@ public class BaseServiceImpl, T> extends ServiceImpl throw new BusinessException(Status.FAIL_INVALID_PARAM, "主动ID值不能为空!"); } // 从getter中获取class和fieldName - com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda lambda = LambdaUtils.resolve(driverIdGetter); - Class middleTableClass = (Class) lambda.getImplClass(); + LambdaMeta lambdaMeta = LambdaUtils.extract(driverIdGetter); + Class middleTableClass = (Class) lambdaMeta.getInstantiatedClass(); // 获取主动从动字段名 - String driverFieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); + String driverFieldName = PropertyNamer.methodToProperty(lambdaMeta.getImplMethodName()); String followerFieldName = convertGetterToFieldName(followerIdGetter); List n2nRelations = null; if(V.notEmpty(followerIdList)){ @@ -447,7 +449,7 @@ public class BaseServiceImpl, T> extends ServiceImpl IPage page = convertToIPage(queryWrapper, pagination); page = super.page(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 - if(page.isSearchCount()){ + if(page.searchCount()){ pagination.setTotalCount(page.getTotal()); } return page.getRecords(); @@ -552,7 +554,7 @@ public class BaseServiceImpl, T> extends ServiceImpl IPage page = convertToIPage(queryWrapper, pagination); IPage> resultPage = super.pageMaps(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 - if(page.isSearchCount()){ + if(page.searchCount()){ pagination.setTotalCount(page.getTotal()); } return resultPage.getRecords(); @@ -622,6 +624,7 @@ public class BaseServiceImpl, T> extends ServiceImpl return BeanUtils.convertKeyValueList2Map(keyValueList); } + @Override public Map getMap(Wrapper queryWrapper) { return super.getMap(queryWrapper); } @@ -696,8 +699,8 @@ public class BaseServiceImpl, T> extends ServiceImpl * @return */ private String convertGetterToFieldName(SFunction getterFn) { - com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda lambda = LambdaUtils.resolve(getterFn); - String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); + LambdaMeta lambdaMeta = LambdaUtils.extract(getterFn); + String fieldName = PropertyNamer.methodToProperty(lambdaMeta.getImplMethodName()); return fieldName; } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java index d2db53d0..5b2b8c14 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java @@ -82,7 +82,7 @@ public class IamUserServiceImpl extends BaseIamServiceImpl page = convertToIPage(queryWrapper, pagination); page = super.getBaseMapper().selectPageSortByOrg(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 - if(page.isSearchCount()){ + if(page.searchCount()){ pagination.setTotalCount(page.getTotal()); } return page.getRecords(); diff --git a/pom.xml b/pom.xml index 641b12ad..cc9d5d4e 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 2.5.1 6.2.0.Final - 3.4.3 + 3.4.3.1 4.9.1 2.3.0 -- Gitee From 4f19c19890a05549516bd179a0d00152ebc63262 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 18 Jun 2021 13:48:13 +0800 Subject: [PATCH 27/83] =?UTF-8?q?+=20map=E5=88=A4=E7=A9=BA=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=89=B9=E6=AE=8A=E6=83=85=E5=86=B5=E4=B8=8B=E7=9A=84?= =?UTF-8?q?NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/binding/helper/ResultAssembler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java index 9d939a1f..7a903a24 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java @@ -178,7 +178,7 @@ public class ResultAssembler { * @return */ public static Object getValueIgnoreKeyCase(Map map, String key){ - if(key == null){ + if(map == null || key == null){ return null; } key = S.removeEsc(key); -- Gitee From 2d90223ce3d10d87cf91700653add5ee3e324ccd Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 18 Jun 2021 13:50:26 +0800 Subject: [PATCH 28/83] =?UTF-8?q?+=20=E5=AD=97=E5=85=B8=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/test/binder/TestDictBinder.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 diboot-core-starter/src/test/java/diboot/core/test/binder/TestDictBinder.java diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/TestDictBinder.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestDictBinder.java new file mode 100644 index 00000000..e95c9449 --- /dev/null +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/TestDictBinder.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package diboot.core.test.binder; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.diboot.core.binding.Binder; +import com.diboot.core.util.BeanUtils; +import com.diboot.core.util.JSON; +import com.diboot.core.util.V; +import diboot.core.test.StartupApplication; +import diboot.core.test.binder.entity.User; +import diboot.core.test.binder.service.UserService; +import diboot.core.test.binder.vo.UserVO; +import diboot.core.test.config.SpringMvcConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * 测试字典绑定 + * @author mazc@dibo.ltd + * @version v2.0 + * @date 2021/06/18 + */ +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {SpringMvcConfig.class}) +@SpringBootTest(classes = {StartupApplication.class}) +public class TestDictBinder { + + @Autowired + UserService userService; + + @Test + public void testBinder(){ + // 加载测试数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(User::getId, 1001L, 1002L); + List userList = userService.getEntityList(queryWrapper); + // 自动绑定 + List voList = Binder.convertAndBindRelations(userList, UserVO.class); + // 验证绑定结果 + Assert.assertTrue(V.notEmpty(voList)); + for(UserVO vo : voList){ + // 验证直接关联和通过中间表间接关联的绑定 + Assert.assertNotNull(vo.getGenderLabel()); + System.out.println(JSON.stringify(vo)); + } + // 单个entity接口测试 + UserVO singleVO = BeanUtils.convert(userList.get(1), UserVO.class); + Binder.bindRelations(singleVO); + // 验证直接关联和通过中间表间接关联的绑定 + Assert.assertNotNull(singleVO.getGenderLabel()); + System.out.println(JSON.stringify(singleVO)); + } + +} -- Gitee From d8b50dfd3c3dc387febfe9a524821f9ec396af80 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 21 Jun 2021 18:23:45 +0800 Subject: [PATCH 29/83] =?UTF-8?q?+=20getId2NameMap=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/test/service/BaseServiceTest.java | 5 ++++ .../core/binding/parser/EntityInfoCache.java | 11 ++++++++ .../com/diboot/core/service/BaseService.java | 9 +++++++ .../core/service/impl/BaseServiceImpl.java | 27 +++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java index 134a34cd..dab59a8d 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java @@ -106,6 +106,11 @@ public class BaseServiceTest { List> mapList = dictionaryService.getMapList(null, new Pagination()); Assert.assertTrue(mapList.size() > 0 && mapList.size() <= BaseConfig.getPageSize()); + + List userIds = Arrays.asList(1001L, 1002L); + Map id2NameMap = userService.getId2NameMap(userIds, User::getUsername); + Assert.assertTrue(id2NameMap != null); + Assert.assertTrue(id2NameMap.get(10001L) != null); } @Test diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/EntityInfoCache.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/EntityInfoCache.java index 98e3b02c..c14782d1 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/EntityInfoCache.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/EntityInfoCache.java @@ -90,6 +90,17 @@ public class EntityInfoCache implements Serializable { return this.propInfo.getColumnToFieldMap().get(columnName); } + /** + * 根据列名获取字段 + * @return + */ + public String getColumnByField(String fieldName){ + if(this.propInfo == null || V.isEmpty(this.propInfo.getFieldToColumnMap())){ + return null; + } + return this.propInfo.getFieldToColumnMap().get(fieldName); + } + /** * 获取ID列 * @return diff --git a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java index 78bec074..31a638f6 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java +++ b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java @@ -315,6 +315,15 @@ public interface BaseService { */ Map getKeyValueMap(Wrapper queryWrapper); + /** + * 获取id-指定name的映射map + * @param entityIds + * @param getterFn + * @param + * @return + */ + Map getId2NameMap(List entityIds, IGetter getterFn); + /** * 获取Map * @param queryWrapper diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index ecd9acb0..81f66c88 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; @@ -624,6 +625,32 @@ public class BaseServiceImpl, T> extends ServiceImpl return BeanUtils.convertKeyValueList2Map(keyValueList); } + @Override + public Map getId2NameMap(List entityIds, IGetter getterFn) { + if(V.isEmpty(entityIds)){ + return Collections.emptyMap(); + } + String fieldName = BeanUtils.convertToFieldName(getterFn); + EntityInfoCache entityInfo = BindingCacheManager.getEntityInfoByClass(this.getEntityClass()); + String columnName = entityInfo.getColumnByField(fieldName); + QueryWrapper queryWrapper = new QueryWrapper().select( + entityInfo.getIdColumn(), + columnName + ).in(entityInfo.getIdColumn(), entityIds); + // map列表 + List> mapList = getMapList(queryWrapper); + if(V.isEmpty(mapList)){ + return Collections.emptyMap(); + } + Map idNameMap = new HashMap<>(); + for(Map map : mapList){ + ID key = (ID)map.get(entityInfo.getIdColumn()); + String value = S.valueOf(map.get(columnName)); + idNameMap.put(key, value); + } + return idNameMap; + } + @Override public Map getMap(Wrapper queryWrapper) { return super.getMap(queryWrapper); -- Gitee From 0dd521b4c24d25593674ce865d3782977b4025b6 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 23 Jun 2021 13:31:10 +0800 Subject: [PATCH 30/83] =?UTF-8?q?*=20=E7=BB=91=E5=AE=9A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=9A=84=E7=BC=93=E5=AD=98=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/util/BeanUtilsTest.java | 45 ++++++++ .../com/diboot/core/binding/QueryBuilder.java | 1 - .../binding/cache/BindingCacheManager.java | 102 ++++++++++++++++-- .../core/binding/helper/ResultAssembler.java | 2 +- .../java/com/diboot/core/util/BeanUtils.java | 49 +++------ 5 files changed, 154 insertions(+), 45 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java index fbec8cd4..53ab51c9 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java @@ -16,14 +16,23 @@ package diboot.core.test.util; import com.baomidou.mybatisplus.annotation.TableId; +import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.entity.Dictionary; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.JSON; import com.diboot.core.vo.DictionaryVO; +import com.sun.management.OperatingSystemMXBean; +import diboot.core.test.StartupApplication; import diboot.core.test.binder.entity.User; +import diboot.core.test.config.SpringMvcConfig; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import java.lang.management.ManagementFactory; import java.lang.reflect.Field; import java.util.*; @@ -33,7 +42,43 @@ import java.util.*; * @version v2.0 * @date 2019/06/02 */ +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {SpringMvcConfig.class}) +@SpringBootTest(classes = {StartupApplication.class}) public class BeanUtilsTest { + private static OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + + @Test + public void testFields(){ + long start = System.currentTimeMillis(); + for(int i=0; i<10000; i++) { + List fields = BeanUtils.extractAllFields(Dictionary.class); + } + long end = System.currentTimeMillis() - start; + System.out.println("takes " + end); + start = System.currentTimeMillis(); + for(int i=0; i<10000; i++) { + List fields = BindingCacheManager.getFields(Dictionary.class); + } + end = System.currentTimeMillis() - start; + System.out.println("takes " + end); + + for(int i=0; i<10000; i++){ + List fields = BeanUtils.extractAllFields(Dictionary.class); + //获取CPU + double cpuLoad = osmxb.getSystemCpuLoad(); + int percentCpuLoad = (int) (cpuLoad * 100); + //获取内存 + double totalvirtualMemory = osmxb.getTotalPhysicalMemorySize(); + double freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize(); + double value = freePhysicalMemorySize/totalvirtualMemory; + int percentMemoryLoad = (int) ((1-value)*100); + + //System.out.println(System.currentTimeMillis() + ", CPU = "+percentCpuLoad+",Mem = "+percentMemoryLoad); + } + end = System.currentTimeMillis() - start; + System.out.println("takes " + end); + } @Test public void testCopyBean(){ diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index 19a2a98e..ccd463a9 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -307,7 +307,6 @@ public class QueryBuilder { private static LinkedHashMap extractNotNullValues(DTO dto, Collection fields){ LinkedHashMap resultMap = new LinkedHashMap<>(); Class dtoClass = dto.getClass(); - // 转换 List declaredFields = BeanUtils.extractAllFields(dtoClass); for (Field field : declaredFields) { diff --git a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java index 1ad59092..fac66598 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java @@ -23,17 +23,18 @@ import com.diboot.core.binding.parser.PropInfo; import com.diboot.core.cache.StaticMemoryCacheManager; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.ContextHelper; +import com.diboot.core.util.S; import com.diboot.core.util.V; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Primary; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * CacheManager @@ -63,6 +64,14 @@ public class BindingCacheManager { * Entity类的SimpleName-Entity Class的缓存key */ private static final String CACHE_NAME_ENTITYNAME_CLASS = "NAME_CLASS"; + /** + * 类-fields缓存 + */ + private static final String CACHE_NAME_CLASS_FIELDS = "CLASS_FIELDS"; + /** + * 类- name-field Map缓存 + */ + private static final String CACHE_NAME_CLASS_NAME2FLDMAP = "CLASS_NAME2FLDMAP"; private static StaticMemoryCacheManager getCacheManager(){ if(cacheManager == null){ @@ -70,7 +79,9 @@ public class BindingCacheManager { CACHE_NAME_CLASS_ENTITY, CACHE_NAME_TABLE_ENTITY, CACHE_NAME_CLASS_PROP, - CACHE_NAME_ENTITYNAME_CLASS); + CACHE_NAME_ENTITYNAME_CLASS, + CACHE_NAME_CLASS_FIELDS, + CACHE_NAME_CLASS_NAME2FLDMAP); } return cacheManager; } @@ -168,6 +179,48 @@ public class BindingCacheManager { return null; } + /** + * 获取class的fields + * @param beanClazz + * @return + */ + public static List getFields(Class beanClazz){ + List fields = getCacheManager().getCacheObj(CACHE_NAME_CLASS_FIELDS, beanClazz.getName(), List.class); + if(fields == null){ + fields = initClassFields(beanClazz, null); + } + return fields; + } + + /** + * 获取class中包含指定注解的的fields + * @param beanClazz + * @return + */ + public static List getFields(Class beanClazz, Class annotation){ + String key = S.join(beanClazz.getName(), annotation.getClass().getName()); + List fields = getCacheManager().getCacheObj(CACHE_NAME_CLASS_FIELDS, key, List.class); + if(fields == null){ + fields = initClassFields(beanClazz, annotation); + } + return fields; + } + + /** + * 获取class的fields + * @param beanClazz + * @return + */ + public static Map getFieldsMap(Class beanClazz){ + Map fieldsMap = getCacheManager().getCacheObj(CACHE_NAME_CLASS_NAME2FLDMAP, beanClazz.getName(), Map.class); + if(fieldsMap == null){ + List fields = getFields(beanClazz); + fieldsMap = BeanUtils.convertToStringKeyObjectMap(fields, "name"); + getCacheManager().putCacheObj(CACHE_NAME_CLASS_NAME2FLDMAP, beanClazz.getName(), fieldsMap); + } + return fieldsMap; + } + /** * 初始化 */ @@ -248,8 +301,45 @@ public class BindingCacheManager { */ private static PropInfo initPropInfoCache(Class beanClazz) { PropInfo propInfoCache = new PropInfo(beanClazz); - cacheManager.putCacheObj(CACHE_NAME_CLASS_PROP, beanClazz.getName(), propInfoCache); + getCacheManager().putCacheObj(CACHE_NAME_CLASS_PROP, beanClazz.getName(), propInfoCache); return propInfoCache; } + /** + * 初始化fields + * @param beanClazz + * @return + */ + private static List initClassFields(Class beanClazz, Class annotation){ + List fieldList = new ArrayList<>(); + Set fieldNameSet = new HashSet<>(); + loopFindFields(beanClazz, annotation, fieldList, fieldNameSet); + getCacheManager().putCacheObj(CACHE_NAME_CLASS_FIELDS, beanClazz.getName(), fieldList); + return fieldList; + } + + /** + * 循环向上查找fields + * @param beanClazz + * @param annotation + * @param fieldList + * @param fieldNameSet + */ + private static void loopFindFields(Class beanClazz, Class annotation, List fieldList, Set fieldNameSet){ + if(beanClazz == null) { + return; + } + Field[] fields = beanClazz.getDeclaredFields(); + if(V.notEmpty(fields)){ //被重写属性,以子类override的为准 + Arrays.stream(fields).forEach((field)->{ + if(!fieldNameSet.contains(field.getName()) && + (annotation == null || field.getAnnotation(annotation) != null)){ + fieldList.add(field); + fieldNameSet.add(field.getName()); + } + }); + } + loopFindFields(beanClazz.getSuperclass(), annotation, fieldList, fieldNameSet); + } + } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java index 7a903a24..0f6902d6 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java @@ -118,7 +118,7 @@ public class ResultAssembler { // 获取valueName String valueName = branchObjColMapping.entrySet().iterator().next().getKey(); // 合并list为map - Map resultMap = new HashMap<>(); + Map resultMap = new HashMap<>(resultSetMapList.size()); List fieldValues = new ArrayList<>(trunkObjColMapping.size()); for(Map row : resultSetMapList){ fieldValues.clear(); diff --git a/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java b/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java index b79358d8..437be019 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java +++ b/diboot-core/src/main/java/com/diboot/core/util/BeanUtils.java @@ -15,8 +15,7 @@ */ package com.diboot.core.util; - -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.binding.copy.AcceptAnnoCopier; import com.diboot.core.config.Cons; import com.diboot.core.entity.BaseEntity; @@ -114,12 +113,12 @@ public class BeanUtils { if(V.isEmpty(sourceList)){ return Collections.emptyList(); } - List resultList = new ArrayList<>(); // 类型相同,直接跳过 if(clazz.getName().equals(sourceList.get(0).getClass().getName())){ return sourceList; } // 不同,则转换 + List resultList = new ArrayList<>(sourceList.size()); try{ for(Object source : sourceList){ T target = clazz.getConstructor().newInstance(); @@ -143,8 +142,7 @@ public class BeanUtils { if(V.isEmpty(propMap)){ return; } - List fields = extractAllFields(model.getClass()); - Map fieldNameMaps = convertToStringKeyObjectMap(fields, "name"); + Map fieldNameMaps = BindingCacheManager.getFieldsMap(model.getClass()); for(Map.Entry entry : propMap.entrySet()){ Field field = fieldNameMaps.get(entry.getKey()); if(field != null){ @@ -561,6 +559,9 @@ public class BeanUtils { * @return */ public static List collectToList(List objectList, String getterPropName){ + if(V.isEmpty(objectList)){ + return Collections.emptyList(); + } List fieldValueList = new ArrayList(); try{ for(E object : objectList){ @@ -585,6 +586,9 @@ public class BeanUtils { * @return */ public static List collectToList(List objectList, String getterPropName, boolean[] hasNullFlags){ + if(V.isEmpty(objectList)){ + return Collections.emptyList(); + } List fieldValueList = new ArrayList(); try{ for(E object : objectList){ @@ -699,45 +703,16 @@ public class BeanUtils { * @return */ public static List extractAllFields(Class clazz){ - List fieldList = new ArrayList<>(); - Set fieldNameSet = new HashSet<>(); - while (clazz != null) { - Field[] fields = clazz.getDeclaredFields(); - if(V.notEmpty(fields)){ //被重写属性,以子类override的为准 - Arrays.stream(fields).forEach((field)->{ - if(!fieldNameSet.contains(field.getName())){ - fieldList.add(field); - fieldNameSet.add(field.getName()); - } - }); - } - clazz = clazz.getSuperclass(); - } - return fieldList; + return BindingCacheManager.getFields(clazz); } - /** * 获取类所有属性(包含父类中属性) * @param clazz * @return */ public static List extractFields(Class clazz, Class annotation){ - List fieldList = new ArrayList<>(); - Set fieldNameSet = new HashSet<>(); - while (clazz != null) { - Field[] fields = clazz.getDeclaredFields(); - if(V.notEmpty(fields)){ //被重写属性,以子类override的为准 - Arrays.stream(fields).forEach((field)->{ - if(!fieldNameSet.contains(field.getName()) && field.getAnnotation(annotation) != null){ - fieldList.add(field); - fieldNameSet.add(field.getName()); - } - }); - } - clazz = clazz.getSuperclass(); - } - return fieldList; + return BindingCacheManager.getFields(clazz, annotation); } /** @@ -766,8 +741,8 @@ public class BeanUtils { * @return */ public static Class getGenericityClass(Object instance, int index){ + //TODO 可缓存 Class hostClass = getTargetClass(instance); - ResolvableType resolvableType = ResolvableType.forClass(hostClass).getSuperType(); ResolvableType[] types = resolvableType.getGenerics(); if(V.isEmpty(types) || index >= types.length){ -- Gitee From 18b6aa4bbb6edf90e5d9fe6dd9d125f830cb60bd Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 23 Jun 2021 13:32:33 +0800 Subject: [PATCH 31/83] =?UTF-8?q?*=20=E7=BB=91=E5=AE=9A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=9A=84=E7=BC=93=E5=AD=98=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/util/BeanUtilsTest.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java index 53ab51c9..45d3315a 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java @@ -50,34 +50,8 @@ public class BeanUtilsTest { @Test public void testFields(){ - long start = System.currentTimeMillis(); - for(int i=0; i<10000; i++) { - List fields = BeanUtils.extractAllFields(Dictionary.class); - } - long end = System.currentTimeMillis() - start; - System.out.println("takes " + end); - start = System.currentTimeMillis(); - for(int i=0; i<10000; i++) { - List fields = BindingCacheManager.getFields(Dictionary.class); - } - end = System.currentTimeMillis() - start; - System.out.println("takes " + end); - - for(int i=0; i<10000; i++){ - List fields = BeanUtils.extractAllFields(Dictionary.class); - //获取CPU - double cpuLoad = osmxb.getSystemCpuLoad(); - int percentCpuLoad = (int) (cpuLoad * 100); - //获取内存 - double totalvirtualMemory = osmxb.getTotalPhysicalMemorySize(); - double freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize(); - double value = freePhysicalMemorySize/totalvirtualMemory; - int percentMemoryLoad = (int) ((1-value)*100); - - //System.out.println(System.currentTimeMillis() + ", CPU = "+percentCpuLoad+",Mem = "+percentMemoryLoad); - } - end = System.currentTimeMillis() - start; - System.out.println("takes " + end); + List fields = BindingCacheManager.getFields(Dictionary.class); + Assert.assertTrue(fields.size() > 0); } @Test -- Gitee From 81ec9e0a490c9b4903d6a31d8814d4708be7d209 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 23 Jun 2021 13:55:23 +0800 Subject: [PATCH 32/83] =?UTF-8?q?*=20=E7=BB=91=E5=AE=9A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=9A=84=E7=BC=93=E5=AD=98=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/util/BeanUtilsTest.java | 18 ++++++++++++++++++ .../diboot/core/binding/binder/BaseBinder.java | 2 +- .../core/binding/binder/FieldBinder.java | 4 ++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java index 45d3315a..aa0b856d 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/util/BeanUtilsTest.java @@ -16,8 +16,10 @@ package diboot.core.test.util; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.entity.Dictionary; +import com.diboot.core.service.DictionaryService; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.JSON; import com.diboot.core.vo.DictionaryVO; @@ -28,6 +30,7 @@ import diboot.core.test.config.SpringMvcConfig; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -48,10 +51,25 @@ import java.util.*; public class BeanUtilsTest { private static OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + @Autowired + private DictionaryService dictionaryService; + @Test public void testFields(){ List fields = BindingCacheManager.getFields(Dictionary.class); Assert.assertTrue(fields.size() > 0); + long start = System.currentTimeMillis(); + for(int i=0; i<10000; i++){ + Class dict = BeanUtils.getGenericityClass(dictionaryService, 1); + } + long end = System.currentTimeMillis() - start; + System.out.println(" takes "+ end); + start = System.currentTimeMillis(); + for(int i=0; i<10000; i++){ + Class dict = ((IService)dictionaryService).getEntityClass(); + } + end = System.currentTimeMillis() - start; + System.out.println(" takes "+ end); } @Test diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java index 5f81006e..414a2256 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java @@ -93,7 +93,7 @@ public abstract class BaseBinder { this.annoObjPropInfo = BindingCacheManager.getPropInfoByClass(voList.get(0).getClass()); } this.queryWrapper = new QueryWrapper<>(); - this.referencedEntityClass = BeanUtils.getGenericityClass(referencedService, 1); + this.referencedEntityClass = referencedService.getEntityClass(); this.refObjPropInfo = BindingCacheManager.getPropInfoByClass(this.referencedEntityClass); // 列集合 this.annoObjJoinCols = new ArrayList<>(8); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java index 50a7c442..aa0b381e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java @@ -71,11 +71,11 @@ public class FieldBinder extends BaseBinder { */ public FieldBinder link(String fromDoField, String toVoField){ if(annoObjectSetterPropNameList == null){ - annoObjectSetterPropNameList = new ArrayList<>(); + annoObjectSetterPropNameList = new ArrayList<>(8); } annoObjectSetterPropNameList.add(toVoField); if(referencedGetterFieldNameList == null){ - referencedGetterFieldNameList = new ArrayList<>(); + referencedGetterFieldNameList = new ArrayList<>(8); } referencedGetterFieldNameList.add(fromDoField); return this; -- Gitee From 7e31c92b0baee4dc47094657d06378e0605d3255 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 10:03:02 +0800 Subject: [PATCH 33/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 12 ++++++------ ...oreAutoConfiguration.java => CoreAutoConfig.java} | 4 ++-- .../{autoconfigure => starter}/RedisAutoConfig.java | 4 ++-- .../src/main/resources/META-INF/spring.factories | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) rename diboot-core-starter/src/main/java/com/diboot/core/starter/{CoreAutoConfiguration.java => CoreAutoConfig.java} (98%) rename diboot-core-starter/src/main/java/com/diboot/core/{autoconfigure => starter}/RedisAutoConfig.java (98%) diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index 4759dfcc..f29cb014 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -41,6 +41,12 @@ ${diboot.version} + + + org.springframework.boot + spring-boot-starter-data-redis + provided + org.springframework.boot @@ -52,11 +58,5 @@ junit test - - - org.springframework.boot - spring-boot-starter-data-redis - provided - diff --git a/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfiguration.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfig.java similarity index 98% rename from diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfiguration.java rename to diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfig.java index 5b7f665a..ea83aa3e 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfiguration.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreAutoConfig.java @@ -55,8 +55,8 @@ import java.util.TimeZone; @EnableConfigurationProperties(CoreProperties.class) @ComponentScan(basePackages = {"com.diboot.core"}) @MapperScan(basePackages = {"com.diboot.core.mapper"}) -public class CoreAutoConfiguration implements WebMvcConfigurer { - private static final Logger log = LoggerFactory.getLogger(CoreAutoConfiguration.class); +public class CoreAutoConfig implements WebMvcConfigurer { + private static final Logger log = LoggerFactory.getLogger(CoreAutoConfig.class); @Value("${spring.jackson.date-format:"+D.FORMAT_DATETIME_Y4MDHMS+"}") private String defaultDatePattern; diff --git a/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java similarity index 98% rename from diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java rename to diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java index 35b08ccd..13cef8a8 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/autoconfigure/RedisAutoConfig.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package com.diboot.core.autoconfigure; +package com.diboot.core.starter; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -47,7 +47,6 @@ public class RedisAutoConfig { public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { //... 初始化RedisTemplate RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 用StringRedisSerializer 序列化和反序列化key值 @@ -64,6 +63,7 @@ public class RedisAutoConfig { redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.setConnectionFactory(connectionFactory); redisTemplate.afterPropertiesSet(); return redisTemplate; } diff --git a/diboot-core-starter/src/main/resources/META-INF/spring.factories b/diboot-core-starter/src/main/resources/META-INF/spring.factories index b949e883..0b873c6f 100644 --- a/diboot-core-starter/src/main/resources/META-INF/spring.factories +++ b/diboot-core-starter/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.core.starter.CoreAutoConfiguration \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.core.starter.CoreAutoConfig \ No newline at end of file -- Gitee From d36855ecb62c46358b6892999998dc3e8259c2de Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 10:08:48 +0800 Subject: [PATCH 34/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/{FileAutoConfiguration.java => FileAutoConfig.java} | 2 +- .../src/main/resources/META-INF/spring.factories | 2 +- .../{MessageAutoConfiguration.java => MessageAutoConfig.java} | 2 +- .../src/main/resources/META-INF/spring.factories | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename diboot-file-starter/src/main/java/com/diboot/file/starter/{FileAutoConfiguration.java => FileAutoConfig.java} (98%) rename diboot-message-starter/src/main/java/com/diboot/message/starter/{MessageAutoConfiguration.java => MessageAutoConfig.java} (98%) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfiguration.java b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfig.java similarity index 98% rename from diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfiguration.java rename to diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfig.java index 0372aadf..21f90042 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfiguration.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileAutoConfig.java @@ -41,7 +41,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartResolver; @EnableConfigurationProperties(FileProperties.class) @ComponentScan(basePackages = {"com.diboot.file"}) @MapperScan(basePackages = {"com.diboot.file.mapper"}) -public class FileAutoConfiguration { +public class FileAutoConfig { @Autowired private FileProperties fileProperties; diff --git a/diboot-file-starter/src/main/resources/META-INF/spring.factories b/diboot-file-starter/src/main/resources/META-INF/spring.factories index 044e5035..34654598 100644 --- a/diboot-file-starter/src/main/resources/META-INF/spring.factories +++ b/diboot-file-starter/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.file.starter.FileAutoConfiguration \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.file.starter.FileAutoConfig \ No newline at end of file diff --git a/diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfiguration.java b/diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfig.java similarity index 98% rename from diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfiguration.java rename to diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfig.java index fbeb0cc8..d204bdfa 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfiguration.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/starter/MessageAutoConfig.java @@ -38,7 +38,7 @@ import org.springframework.context.annotation.Configuration; @EnableConfigurationProperties(MessageProperties.class) @ComponentScan(basePackages = {"com.diboot.message"}) @MapperScan(basePackages = {"com.diboot.message.mapper"}) -public class MessageAutoConfiguration { +public class MessageAutoConfig { /** * 模版变量服务 diff --git a/diboot-message-starter/src/main/resources/META-INF/spring.factories b/diboot-message-starter/src/main/resources/META-INF/spring.factories index 6206dadb..64cf53d2 100644 --- a/diboot-message-starter/src/main/resources/META-INF/spring.factories +++ b/diboot-message-starter/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.message.starter.MessageAutoConfiguration \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.diboot.message.starter.MessageAutoConfig \ No newline at end of file -- Gitee From 3237064d808791ec7d3454a82008f54333fe7538 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 11:17:16 +0800 Subject: [PATCH 35/83] =?UTF-8?q?*=20final=E7=AD=89=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/binding/copy/AcceptAnnoCopier.java | 2 +- .../binding/data/DataAccessAnnoCache.java | 2 +- .../binding/parser/BaseConditionManager.java | 2 +- .../core/binding/parser/ParserCache.java | 52 +------------------ .../diboot/core/binding/parser/PropInfo.java | 4 +- .../java/com/diboot/core/config/Cons.java | 2 +- .../src/main/java/com/diboot/core/util/D.java | 8 +-- .../java/com/diboot/core/util/Encryptor.java | 25 ++++++--- .../excel/cache/ExcelBindAnnoHandler.java | 2 +- .../listener/FixedHeadExcelListener.java | 34 +++++++----- .../java/com/diboot/file/util/HttpHelper.java | 2 +- .../com/diboot/iam/annotation/Operation.java | 11 ---- .../diboot/iam/auth/AuthServiceFactory.java | 2 +- .../com/diboot/iam/cache/IamCacheManager.java | 2 +- .../main/java/com/diboot/iam/config/Cons.java | 26 +++------- .../service/impl/QuartzSchedulerService.java | 18 ------- 16 files changed, 66 insertions(+), 128 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/copy/AcceptAnnoCopier.java b/diboot-core/src/main/java/com/diboot/core/binding/copy/AcceptAnnoCopier.java index 9125db21..e27ff154 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/copy/AcceptAnnoCopier.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/copy/AcceptAnnoCopier.java @@ -37,7 +37,7 @@ public class AcceptAnnoCopier { /** * 注解缓存 */ - private static Map> CLASS_ACCEPT_ANNO_CACHE_MAP = new ConcurrentHashMap<>(); + private static final Map> CLASS_ACCEPT_ANNO_CACHE_MAP = new ConcurrentHashMap<>(); // 下标 private static final int IDX_TARGET_FIELD = 0, IDX_SOURCE_FIELD = 1, IDX_OVERRIDE = 2; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/data/DataAccessAnnoCache.java b/diboot-core/src/main/java/com/diboot/core/binding/data/DataAccessAnnoCache.java index 469a69af..54735985 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/data/DataAccessAnnoCache.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/data/DataAccessAnnoCache.java @@ -38,7 +38,7 @@ public class DataAccessAnnoCache { /** * 注解缓存 */ - private static Map DATA_PERMISSION_ANNO_CACHE = new ConcurrentHashMap<>(); + private static final Map DATA_PERMISSION_ANNO_CACHE = new ConcurrentHashMap<>(); /** * 是否有检查点注解 diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/BaseConditionManager.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/BaseConditionManager.java index 5fed0f77..7e4add5e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/BaseConditionManager.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/BaseConditionManager.java @@ -40,7 +40,7 @@ public class BaseConditionManager { /** * 表达式缓存Map */ - private static Map> expressionParseResultMap = new ConcurrentHashMap<>(); + private static final Map> expressionParseResultMap = new ConcurrentHashMap<>(); /** * 获取解析后的Expression列表 diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java index 066c7c1f..6980ebc7 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java @@ -48,15 +48,11 @@ public class ParserCache { /** * VO类-绑定注解缓存 */ - private static Map allVoBindAnnotationCacheMap = new ConcurrentHashMap<>(); - /** - * 表及相关信息的缓存 - */ - private static Map tableToLinkageCacheMap = new ConcurrentHashMap<>(); + private static final Map allVoBindAnnotationCacheMap = new ConcurrentHashMap<>(); /** * dto类-BindQuery注解的缓存 */ - private static Map> dtoClassBindQueryCacheMap = new ConcurrentHashMap<>(); + private static final Map> dtoClassBindQueryCacheMap = new ConcurrentHashMap<>(); /** * 获取指定class对应的Bind相关注解 @@ -97,39 +93,6 @@ public class ParserCache { return group; } - /** - * 初始化Table的相关对象信息 - */ - @Deprecated - private static void initTableToLinkageCacheMap(){ - if(tableToLinkageCacheMap.isEmpty()){ - SqlSessionFactory sqlSessionFactory = ContextHelper.getBean(SqlSessionFactory.class); - Collection> mappers = sqlSessionFactory.getConfiguration().getMapperRegistry().getMappers(); - if(V.notEmpty(mappers)){ - mappers.forEach(m->{ - Type[] types = m.getGenericInterfaces(); - try{ - if(types != null && types.length > 0 && types[0] != null){ - ParameterizedType genericType = (ParameterizedType) types[0]; - Type[] superTypes = genericType.getActualTypeArguments(); - if(superTypes != null && superTypes.length > 0 && superTypes[0] != null){ - String entityClassName = superTypes[0].getTypeName(); - if(entityClassName.length() > 1){ - Class entityClass = Class.forName(entityClassName); - TableLinkage linkage = new TableLinkage(entityClass, m); - tableToLinkageCacheMap.put(linkage.getTable(), linkage); - } - } - } - } - catch (Exception e){ - log.warn("解析mapper异常", e); - } - }); - } - } - } - /** * 是否有is_deleted列 * @return @@ -143,17 +106,6 @@ public class ParserCache { return null; } - /** - * 获取table相关信息 - * @return - */ - @Deprecated - public static TableLinkage getTableLinkage(String table){ - initTableToLinkageCacheMap(); - TableLinkage linkage = tableToLinkageCacheMap.get(table); - return linkage; - } - /** * 获取entity对应的表名 * @param entityClass diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java index 6346f072..4dcdddc0 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java @@ -9,6 +9,7 @@ import com.diboot.core.util.V; import lombok.Getter; import lombok.Setter; +import java.io.Serializable; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; @@ -24,7 +25,8 @@ import java.util.Map; */ @Getter @Setter -public class PropInfo { +public class PropInfo implements Serializable { + private static final long serialVersionUID = 5921667308129991326L; private String idColumn; diff --git a/diboot-core/src/main/java/com/diboot/core/config/Cons.java b/diboot-core/src/main/java/com/diboot/core/config/Cons.java index 4cdd6c01..7aedd93c 100644 --- a/diboot-core/src/main/java/com/diboot/core/config/Cons.java +++ b/diboot-core/src/main/java/com/diboot/core/config/Cons.java @@ -129,7 +129,7 @@ public class Cons { /** * 成功/失败 结果状态字典定义 */ - public static enum RESULT_STATUS{ + public enum RESULT_STATUS{ /** * 正常 */ diff --git a/diboot-core/src/main/java/com/diboot/core/util/D.java b/diboot-core/src/main/java/com/diboot/core/util/D.java index abceef06..879186ca 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/D.java +++ b/diboot-core/src/main/java/com/diboot/core/util/D.java @@ -71,10 +71,10 @@ public class D extends DateUtils{ /** * 时间类型-毫秒数定义 */ - public static long MS_1SECOND = 1000; - public static long MS_1MINUTE = 60 * MS_1SECOND; - public static long MS_1HOUR = 60 * MS_1MINUTE; - public static long MS_1DAY = 24 * MS_1HOUR; + public static final long MS_1SECOND = 1000; + public static final long MS_1MINUTE = 60 * MS_1SECOND; + public static final long MS_1HOUR = 60 * MS_1MINUTE; + public static final long MS_1DAY = 24 * MS_1HOUR; /*** * 当前的日期时间 diff --git a/diboot-core/src/main/java/com/diboot/core/util/Encryptor.java b/diboot-core/src/main/java/com/diboot/core/util/Encryptor.java index 4b8c1909..add90b94 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/Encryptor.java +++ b/diboot-core/src/main/java/com/diboot/core/util/Encryptor.java @@ -45,11 +45,24 @@ public class Encryptor { /** * 加密Cipher缓存 */ - private static Map encryptorMap = new ConcurrentHashMap<>(); + private static Map encryptorMap = null; + private static Map getEncryptorMap(){ + if(encryptorMap == null){ + encryptorMap = new ConcurrentHashMap<>(); + } + return encryptorMap; + } + /** * 解密Cipher缓存 */ - private static Map decryptorMap = new ConcurrentHashMap<>(); + private static Map decryptorMap = null; + private static Map getDecryptorMap(){ + if(decryptorMap == null){ + decryptorMap = new ConcurrentHashMap<>(); + } + return decryptorMap; + } /** * 加密字符串(可指定加密密钥) @@ -102,13 +115,13 @@ public class Encryptor { */ private static Cipher getEncryptor(String key) throws Exception{ byte[] keyBytes = getKey(key); - Cipher encryptor = encryptorMap.get(new String(keyBytes)); + Cipher encryptor = getEncryptorMap().get(new String(keyBytes)); if(encryptor == null){ SecretKeySpec skeyspec = new SecretKeySpec(keyBytes, KEY_ALGORITHM); encryptor = Cipher.getInstance(CIPHER_ALGORITHM); encryptor.init(Cipher.ENCRYPT_MODE, skeyspec); // 放入缓存 - encryptorMap.put(key, encryptor); + getEncryptorMap().put(key, encryptor); } return encryptor; } @@ -121,13 +134,13 @@ public class Encryptor { */ private static Cipher getDecryptor(String key) throws Exception{ byte[] keyBytes = getKey(key); - Cipher decryptor = encryptorMap.get(new String(keyBytes)); + Cipher decryptor = getDecryptorMap().get(new String(keyBytes)); if(decryptor == null){ SecretKeySpec skeyspec = new SecretKeySpec(keyBytes, KEY_ALGORITHM); decryptor = Cipher.getInstance(CIPHER_ALGORITHM); decryptor.init(Cipher.DECRYPT_MODE, skeyspec); // 放入缓存 - decryptorMap.put(key, decryptor); + getDecryptorMap().put(key, decryptor); } return decryptor; } diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindAnnoHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindAnnoHandler.java index 86208bed..db075d08 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindAnnoHandler.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/cache/ExcelBindAnnoHandler.java @@ -47,7 +47,7 @@ public class ExcelBindAnnoHandler { /** * 注解缓存 */ - private static Map> MODEL_BINDANNO_CACHE = new ConcurrentHashMap<>(); + private static final Map> MODEL_BINDANNO_CACHE = new ConcurrentHashMap<>(); /** * 获取字段-绑定注解之间的map diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/listener/FixedHeadExcelListener.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/listener/FixedHeadExcelListener.java index 61d0ccb1..2814debb 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/listener/FixedHeadExcelListener.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/listener/FixedHeadExcelListener.java @@ -55,7 +55,7 @@ public abstract class FixedHeadExcelListener extends A //解析后的数据实体list private List dataList = new ArrayList<>(); //错误信息 - private List validateErrorMsgs = new ArrayList<>(); + private List validateErrorMsgs = null; // 注入request private Map requestParams; // 是否为预览模式 @@ -105,7 +105,7 @@ public abstract class FixedHeadExcelListener extends A // 提取校验结果 dataList.stream().forEach(data->{ if(V.notEmpty(data.getValidateError())){ - validateErrorMsgs.add(data.getRowIndex() + "行: " + data.getValidateError()); + addErrorMsg(data.getRowIndex() + "行: " + data.getValidateError()); } }); // 有错误 抛出异常 @@ -138,11 +138,11 @@ public abstract class FixedHeadExcelListener extends A String data = ex.getCellData().getStringValue(); errorMsg = currentRowNum+"行" + ex.getColumnIndex()+ "列: 数据格式转换异常,'"+data+"' 非期望的数据类型["+type+"]"; } - validateErrorMsgs.add(errorMsg); + addErrorMsg(errorMsg); } else{//其他异常 log.error("出现未预知的异常:",exception); - validateErrorMsgs.add("解析异常: "+exception.getMessage()); + addErrorMsg("解析异常: "+exception.getMessage()); } } @@ -256,14 +256,6 @@ public abstract class FixedHeadExcelListener extends A */ protected abstract void saveData(List dataList, Map requestParams); - /** - * 校验错误信息 - * @return - */ - public List getErrorMsgs(){ - return this.validateErrorMsgs; - } - /** * 返回表头 * @return @@ -314,4 +306,22 @@ public abstract class FixedHeadExcelListener extends A return BeanUtils.getGenericityClass(this, 0); } + /** + * 校验错误信息 + * @return + */ + public List getErrorMsgs(){ + return this.validateErrorMsgs; + } + + /** + * 添加错误信息 + * @param errorMsg + */ + private void addErrorMsg(String errorMsg){ + if(this.validateErrorMsgs == null){ + this.validateErrorMsgs = new ArrayList<>(); + } + this.validateErrorMsgs.add(errorMsg); + } } diff --git a/diboot-file-starter/src/main/java/com/diboot/file/util/HttpHelper.java b/diboot-file-starter/src/main/java/com/diboot/file/util/HttpHelper.java index ec068d0b..e5caa1ad 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/util/HttpHelper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/util/HttpHelper.java @@ -57,7 +57,7 @@ public class HttpHelper { /*** * 文件扩展名-ContentType的对应关系 */ - private static Map EXT_CONTENT_TYPE_MAP = new HashMap(){{ + private static final Map EXT_CONTENT_TYPE_MAP = new HashMap(){{ put("xls", "application/x-msdownload"); put("xlsx", "application/x-msdownload"); put("doc", "application/x-msdownload"); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/Operation.java b/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/Operation.java index 7c312eec..cdd6f147 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/Operation.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/Operation.java @@ -22,17 +22,6 @@ package com.diboot.iam.annotation; * @date 2019/12/23 */ public class Operation { - @Deprecated - public static final String LIST = "list"; - @Deprecated - public static final String DETAIL = "detail"; - @Deprecated - public static final String CREATE = "create"; - @Deprecated - public static final String UPDATE = "update"; - @Deprecated - public static final String DELETE = "delete"; - /** * 操作权限类型 - 首页 */ diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java index d7a73c1a..79f17180 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java @@ -31,7 +31,7 @@ import java.util.Map; */ @Slf4j public class AuthServiceFactory { - private static Map AUTHTYPE_SERVICE_CACHE = new HashMap<>(); + private static final Map AUTHTYPE_SERVICE_CACHE = new HashMap<>(); /** * 获取对应认证类型的Service实现 diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java b/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java index 9ec4105a..54b574d4 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java @@ -45,7 +45,7 @@ public class IamCacheManager { /** * url-permission 缓存 */ - private static Map URL_PERMISSIONCODE_CACHE = new ConcurrentHashMap<>(); + private static Map URL_PERMISSIONCODE_CACHE = new ConcurrentHashMap<>(8); private static StaticMemoryCacheManager getCacheManager(){ if(iamMemoryCacheManager == null){ diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java b/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java index 9dd207bd..ce56fd8c 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java @@ -28,7 +28,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 数据字典类型定义 */ - public static enum DICTTYPE{ + public enum DICTTYPE{ DATA_PERMISSION_TYPE, AUTH_TYPE, ACCOUNT_STATUS, @@ -43,7 +43,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 数据权限类型 */ - public static enum DICTCODE_DATA_PERMISSION_TYPE{ + public enum DICTCODE_DATA_PERMISSION_TYPE{ INDIVIDUAL, DEPT, DEPT_MEMS, @@ -53,7 +53,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 认证方式 */ - public static enum DICTCODE_AUTH_TYPE{ + public enum DICTCODE_AUTH_TYPE{ PWD, SSO, WX_MP, @@ -64,7 +64,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 账号状态 */ - public static enum DICTCODE_ACCOUNT_STATUS{ + public enum DICTCODE_ACCOUNT_STATUS{ A, L, I @@ -73,7 +73,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 用户状态 */ - public static enum DICTCODE_USER_STATUS{ + public enum DICTCODE_USER_STATUS{ A, L, I @@ -82,7 +82,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 组织类型 */ - public static enum DICTCODE_ORG_TYPE{ + public enum DICTCODE_ORG_TYPE{ COMP, DEPT } @@ -90,7 +90,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 字典编码 - 权限类型 */ - public static enum DICTCODE_PERMISSION_TYPE{ + public enum DICTCODE_PERMISSION_TYPE{ MENU, OPERATION, OTHER @@ -99,17 +99,7 @@ public class Cons extends com.diboot.core.config.Cons { /** * 前端权限类型 */ - @Deprecated - public static enum FRONTEND_PERMISSION_DISPLAY_TYPE{ - MODULE, - MENU, - PERMISSION - } - - /** - * 前端权限类型 - */ - public static enum RESOURCE_PERMISSION_DISPLAY_TYPE{ + public enum RESOURCE_PERMISSION_DISPLAY_TYPE{ MODULE, MENU, PERMISSION diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/service/impl/QuartzSchedulerService.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/service/impl/QuartzSchedulerService.java index ba681f89..902b608a 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/service/impl/QuartzSchedulerService.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/service/impl/QuartzSchedulerService.java @@ -15,11 +15,9 @@ */ package com.diboot.scheduler.service.impl; -import ch.qos.logback.core.db.BindDataSourceToJNDIAction; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.*; import com.diboot.core.vo.Status; -import com.diboot.scheduler.annotation.BindJob; import com.diboot.scheduler.annotation.CollectThisJob; import com.diboot.scheduler.entity.ScheduleJob; import com.diboot.scheduler.starter.SchedulerProperties; @@ -30,7 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; -import java.lang.annotation.Annotation; import java.util.*; /** @@ -93,12 +90,6 @@ public class QuartzSchedulerService { List> result = loadJobs(annoJobList); CACHE_JOB.addAll(result); } - // 兼容旧版本BindJob注解 - annoJobList = ContextHelper.getBeansByAnnotation(BindJob.class); - if (V.notEmpty(annoJobList)) { - List> result = loadJobs(annoJobList); - CACHE_JOB.addAll(result); - } return CACHE_JOB; } @@ -125,15 +116,6 @@ public class QuartzSchedulerService { paramJson = annotation.paramJson(); paramClass = annotation.paramClass(); } - else{ // 兼容旧版本BindJob注解 - BindJob bindJobAnno = (BindJob) targetClass.getAnnotation(BindJob.class); - if(bindJobAnno != null){ - jobCron = bindJobAnno.cron(); - jobName = bindJobAnno.name(); - paramJson = bindJobAnno.paramJson(); - paramClass = bindJobAnno.paramClass(); - } - } temp.put("jobCron", jobCron); temp.put("jobName", jobName); temp.put("jobClass", targetClass); -- Gitee From 8cf9b52bd41345949c1dc6b3b0532083f7c05755 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 11:17:40 +0800 Subject: [PATCH 36/83] =?UTF-8?q?*=20=E6=B8=85=E7=90=86=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/binding/parser/TableLinkage.java | 68 -------------- .../file/excel/converter/DictConverter.java | 53 ----------- .../process/ApiPermissionCache.java | 65 ------------- .../com/diboot/iam/util/AnnotationUtils.java | 28 ------ .../diboot/scheduler/annotation/BindJob.java | 92 ------------------- 5 files changed, 306 deletions(-) delete mode 100644 diboot-core/src/main/java/com/diboot/core/binding/parser/TableLinkage.java delete mode 100644 diboot-file-starter/src/main/java/com/diboot/file/excel/converter/DictConverter.java delete mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/ApiPermissionCache.java delete mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/util/AnnotationUtils.java delete mode 100644 diboot-scheduler-starter/src/main/java/com/diboot/scheduler/annotation/BindJob.java diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/TableLinkage.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/TableLinkage.java deleted file mode 100644 index 2e6c312f..00000000 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/TableLinkage.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.core.binding.parser; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.diboot.core.config.Cons; -import com.diboot.core.util.BeanUtils; -import lombok.Getter; -import lombok.Setter; - -import java.io.Serializable; -import java.lang.reflect.Field; - -/** - * table的相关线索信息(已废弃,请换用 EntityInfoCache) - * @author mazc@dibo.ltd - * @version v2.1 - * @date 2020/06/02 - */ -@Getter @Setter -@Deprecated -public class TableLinkage implements Serializable { - private static final long serialVersionUID = 4416187849283913895L; - - public TableLinkage(Class entityClass, Class mapperClass){ - this.entityClass = entityClass; - this.mapperClass = mapperClass; - this.table = ParserCache.getEntityTableName(entityClass); - // 初始化是否有is_deleted - Field field = BeanUtils.extractField(entityClass, Cons.FieldName.deleted.name()); - if(field != null){ - TableField tableField = field.getAnnotation(TableField.class); - if(tableField != null && tableField.exist() == true){ - this.hasDeleted = true; - } - } - } - - private String table; - /** - * 表对应的entity类 - */ - private Class entityClass; - - /** - * 表对应的mapper类 - */ - private Class mapperClass; - - /** - * 是否有逻辑删除字段 - */ - private boolean hasDeleted = false; - -} diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/converter/DictConverter.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/converter/DictConverter.java deleted file mode 100644 index 65ea5bad..00000000 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/converter/DictConverter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.file.excel.converter; - -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.CellData; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.property.ExcelContentProperty; - -/** - * 枚举转化器 (已废弃,不再需要指定) - * - * @author : uu - * @version : v1.0 - * @Date 2020-01-07 16:53 - */ -@Deprecated -public class DictConverter implements Converter { - - @Override - public Class supportJavaTypeKey() { - return DictConverter.class; - } - - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return CellDataTypeEnum.STRING; - } - - @Override - public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { - return cellData.getStringValue(); - } - - @Override - public CellData convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { - return new CellData(value); - } -} diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/ApiPermissionCache.java b/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/ApiPermissionCache.java deleted file mode 100644 index aab29626..00000000 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/ApiPermissionCache.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.iam.annotation.process; - -import com.diboot.iam.cache.IamCacheManager; - -import java.util.List; - -/** - * 注解相关缓存 - * {@link IamCacheManager} - * @author mazc@dibo.ltd - * @version v2.0 - * @date 2019/12/30 - */ -@Deprecated -public class ApiPermissionCache { - - /** - * 读取缓存permission - * {@link IamCacheManager#getPermissionCode(String)} - * @param requestMethodAndUrl - * @return - */ - @Deprecated - public static String getPermissionCode(String requestMethodAndUrl){ - return IamCacheManager.getPermissionCode(requestMethodAndUrl); - } - - /** - * 读取缓存permission - * {@link IamCacheManager#getPermissionCode(String, String)} - * @param requestMethod - * @param url - * @return - */ - @Deprecated - public static String getPermissionCode(String requestMethod, String url){ - return IamCacheManager.getPermissionCode(requestMethod, url); - } - - /** - * 返回全部ApiPermissionVO - * {@link IamCacheManager#getApiPermissionVoList()} - * @return - */ - @Deprecated - public static List getApiPermissionVoList(){ - return IamCacheManager.getApiPermissionVoList(); - } - -} \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/util/AnnotationUtils.java b/diboot-iam-starter/src/main/java/com/diboot/iam/util/AnnotationUtils.java deleted file mode 100644 index 64f74c15..00000000 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/util/AnnotationUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.iam.util; - -/** - * 注解相关工具类 - * @author mazc@dibo.ltd - * @version v2.0 - * @date 2019/12/23 - * @see com.diboot.core.util.AnnotationUtils - */ -@Deprecated -public class AnnotationUtils extends com.diboot.core.util.AnnotationUtils { - -} \ No newline at end of file diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/annotation/BindJob.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/annotation/BindJob.java deleted file mode 100644 index c5e019b5..00000000 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/annotation/BindJob.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.diboot.scheduler.annotation; - -import org.springframework.context.annotation.Lazy; -import org.springframework.core.annotation.AliasFor; -import org.springframework.stereotype.Component; - -import java.lang.annotation.*; - -/** - * 定时任务注解,已替换为CollectThisJob - * 请调用: ${@link CollectThisJob} - * @author : uu - * @version : v1.0 - * @Date 2020/12/1 12:49 - */ -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Component -@Lazy -@Deprecated -public @interface BindJob { - - /** - * bean Name - * - * @return - */ - @AliasFor( - annotation = Component.class - ) - String value() default ""; - - /** - * 是否懒加载 - * - * @return - */ - @AliasFor( - annotation = Lazy.class, - value = "value" - ) - boolean lazy() default true; - - /** - * 定时任务的名称 - * - * @return - */ - String name(); - - /** - * cron表达式 - * - * @return - */ - String cron() default ""; - - /** - * json格式的参数字符串 - * - * @return - */ - String paramJson() default ""; - - /** - * json格式class参数 - *

- * 如果paramJson有值优先使用paramJson定义的值 - *

- * 如果参数过多,paramJson不方便,可以定义实体类书写,并给予默认值 - * - * @return - */ - Class paramClass() default Object.class; - -} \ No newline at end of file -- Gitee From 325819718238aa559ce6270a5e6922ef20f17834 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 16:14:29 +0800 Subject: [PATCH 37/83] =?UTF-8?q?*=20=E7=BC=93=E5=AD=98key=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/core/binding/cache/BindingCacheManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java index fac66598..2ad48e32 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java @@ -188,6 +188,7 @@ public class BindingCacheManager { List fields = getCacheManager().getCacheObj(CACHE_NAME_CLASS_FIELDS, beanClazz.getName(), List.class); if(fields == null){ fields = initClassFields(beanClazz, null); + getCacheManager().putCacheObj(CACHE_NAME_CLASS_FIELDS, beanClazz.getName(), fields); } return fields; } @@ -202,6 +203,7 @@ public class BindingCacheManager { List fields = getCacheManager().getCacheObj(CACHE_NAME_CLASS_FIELDS, key, List.class); if(fields == null){ fields = initClassFields(beanClazz, annotation); + getCacheManager().putCacheObj(CACHE_NAME_CLASS_FIELDS, key, fields); } return fields; } @@ -314,7 +316,6 @@ public class BindingCacheManager { List fieldList = new ArrayList<>(); Set fieldNameSet = new HashSet<>(); loopFindFields(beanClazz, annotation, fieldList, fieldNameSet); - getCacheManager().putCacheObj(CACHE_NAME_CLASS_FIELDS, beanClazz.getName(), fieldList); return fieldList; } -- Gitee From a78d11feb8bd2cece79e68e82aeefaee625b2c47 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 16:16:45 +0800 Subject: [PATCH 38/83] =?UTF-8?q?*=20=E6=97=A0set=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=86=8D=E6=89=93=E5=8D=B0warn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/diboot/core/binding/QueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index ccd463a9..bfff04e9 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -337,7 +337,7 @@ public class QueryBuilder { } catch (IllegalAccessException e) { log.error("通过反射获取属性值出错:{}", e.getMessage()); } catch (NoSuchMethodException e) { - log.warn("通过反射获取属性方法不存在:{}", e.getMessage()); + log.debug("通过反射获取属性方法不存在:{}", e.getMessage()); } catch (InvocationTargetException e) { log.warn("通过反射执行属性方法出错:{}", e.getMessage()); } -- Gitee From 4095bb5de9302eb4199ec372d81fd4e3a573fe6f Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 24 Jun 2021 16:17:52 +0800 Subject: [PATCH 39/83] =?UTF-8?q?+=20getVOList=E6=8E=A5=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E4=BB=85=E6=9F=A5=E8=AF=A2=E5=BF=85=E9=9C=80?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/binder/vo/SimpleDictionaryVO.java | 43 +++++++++++++++++++ .../core/test/service/BaseServiceTest.java | 15 ++++++- .../core/service/impl/BaseServiceImpl.java | 40 ++++++++++++++++- 3 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 diboot-core-starter/src/test/java/diboot/core/test/binder/vo/SimpleDictionaryVO.java diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/SimpleDictionaryVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/SimpleDictionaryVO.java new file mode 100644 index 00000000..a5ec9e45 --- /dev/null +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/SimpleDictionaryVO.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package diboot.core.test.binder.vo; + +import com.diboot.core.binding.annotation.BindEntityList; +import com.diboot.core.entity.Dictionary; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 数据字典的简化VO测试类 + */ +@Getter +@Setter +@Accessors(chain = true) +public class SimpleDictionaryVO { + + private Long id; + + private String type; + + private String sortId; + + @BindEntityList(entity= Dictionary.class, condition="this.type=type AND this.id=parent_id", orderBy = "sort_id:ASC") + private List children; + +} diff --git a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java index dab59a8d..364015ff 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java @@ -37,6 +37,7 @@ import diboot.core.test.binder.entity.User; import diboot.core.test.binder.entity.UserRole; import diboot.core.test.binder.service.DepartmentService; import diboot.core.test.binder.service.UserService; +import diboot.core.test.binder.vo.SimpleDictionaryVO; import diboot.core.test.config.SpringMvcConfig; import org.junit.Assert; import org.junit.Test; @@ -106,11 +107,10 @@ public class BaseServiceTest { List> mapList = dictionaryService.getMapList(null, new Pagination()); Assert.assertTrue(mapList.size() > 0 && mapList.size() <= BaseConfig.getPageSize()); - List userIds = Arrays.asList(1001L, 1002L); Map id2NameMap = userService.getId2NameMap(userIds, User::getUsername); Assert.assertTrue(id2NameMap != null); - Assert.assertTrue(id2NameMap.get(10001L) != null); + Assert.assertTrue(id2NameMap.get(1001) != null); } @Test @@ -368,6 +368,17 @@ public class BaseServiceTest { List keyValues = dictionaryService.getKeyValueList("GENDER"); Assert.assertTrue(keyValues.size() >= 2); + + } + + @Test + public void testSimpleDictVo(){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("parent_id", 0).eq("type", "GENDER"); + + List simpleVOList = dictionaryService.getViewObjectList(queryWrapper, null, SimpleDictionaryVO.class); + Assert.assertTrue(simpleVOList.size() == 1); + Assert.assertTrue(simpleVOList.get(0).getChildren().size() >= 2); } /** diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index 81f66c88..b44ad6f6 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -21,6 +21,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; @@ -40,6 +43,7 @@ import com.diboot.core.binding.binder.FieldListBinder; import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.binding.helper.ServiceAdaptor; import com.diboot.core.binding.parser.EntityInfoCache; +import com.diboot.core.binding.parser.PropInfo; import com.diboot.core.binding.query.dynamic.DynamicJoinQueryWrapper; import com.diboot.core.config.BaseConfig; import com.diboot.core.config.Cons; @@ -57,6 +61,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.lang.invoke.SerializedLambda; +import java.lang.reflect.Field; import java.util.*; /*** @@ -106,12 +111,15 @@ public class BaseServiceImpl, T> extends ServiceImpl @Override public FT getValueOfField(SFunction idGetterFn, Serializable idVal, SFunction getterFn) { - String fieldName = convertGetterToFieldName(getterFn); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .select(idGetterFn, getterFn) .eq(idGetterFn, idVal); T entity = getSingleEntity(queryWrapper); - return entity != null? (FT)BeanUtils.getProperty(entity, fieldName) : null; + if(entity == null){ + return null; + } + String fieldName = convertGetterToFieldName(getterFn); + return (FT)BeanUtils.getProperty(entity, fieldName); } @Override @@ -693,6 +701,7 @@ public class BaseServiceImpl, T> extends ServiceImpl @Override public List getViewObjectList(Wrapper queryWrapper, Pagination pagination, Class voClass) { + queryWrapper = optimizeSelect(queryWrapper, voClass); List entityList = getEntityList(queryWrapper, pagination); // 自动转换为VO并绑定关联对象 List voList = Binder.convertAndBindRelations(entityList, voClass); @@ -709,6 +718,33 @@ public class BaseServiceImpl, T> extends ServiceImpl return ServiceAdaptor.convertToIPage(pagination, entityClass); } + /** + * 基于VO提取最小集select字段 + * @param queryWrapper + * @param voClass + */ + protected Wrapper optimizeSelect(Wrapper queryWrapper, Class voClass){ + if(!(queryWrapper instanceof QueryWrapper) || queryWrapper.getSqlSelect() != null){ + return queryWrapper; + } + Class entityClass = getEntityClass(); + List allColumns = TableInfoHelper.getTableInfo(entityClass).getFieldList(); + if(V.isEmpty(allColumns)){ + return queryWrapper; + } + List columns = new ArrayList<>(); + String pk = ContextHelper.getIdFieldName(entityClass); + columns.add(pk); + Map fieldsMap = BindingCacheManager.getFieldsMap(voClass); + for(TableFieldInfo col : allColumns){ + if(fieldsMap.containsKey(col.getField().getName()) + && V.notEmpty(col.getColumn())){ + columns.add(col.getColumn()); + } + } + return ((QueryWrapper)queryWrapper).select(S.toStringArray(columns)); + } + /** * 获取主键值 * @param entity -- Gitee From 2ac07e47fba423746d633a428b1cb1e51bd9572f Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 28 Jun 2021 09:18:01 +0800 Subject: [PATCH 40/83] =?UTF-8?q?*=20=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8E=E7=BC=80=E9=BB=91=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/diboot/file/util/FileHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java b/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java index f9b39d1e..d8e39ced 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java @@ -41,7 +41,7 @@ public class FileHelper{ /** * file验证 */ - public static final List DANGER_FILE_SUFFIX = Arrays.asList("exe", "bat", "bin", "dll", "sh"); + public static final List DANGER_FILE_SUFFIX = Arrays.asList("exe","bat","bin","dll","sh","php","pl","cgi","asp","aspx","jsp","php5","php4","php3","htm","html"); /** * excel格式 -- Gitee From 6195115c583f43a3967db719aa5cab8b2c8e01d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=97=AD?= Date: Mon, 28 Jun 2021 12:01:30 +0800 Subject: [PATCH 41/83] =?UTF-8?q?message=20=E6=94=AF=E6=8C=81=E5=8F=91?= =?UTF-8?q?=E9=80=81=E9=99=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/channel/SimpleEmailChannel.java | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/diboot-message-starter/src/main/java/com/diboot/message/channel/SimpleEmailChannel.java b/diboot-message-starter/src/main/java/com/diboot/message/channel/SimpleEmailChannel.java index 096cb3f5..abb6c725 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/channel/SimpleEmailChannel.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/channel/SimpleEmailChannel.java @@ -23,10 +23,14 @@ import com.diboot.message.entity.Message; import com.diboot.message.service.MessageService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.scheduling.annotation.Async; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; import java.util.Date; /** @@ -56,28 +60,62 @@ public class SimpleEmailChannel implements ChannelStrategy { String result = "success"; String status = Cons.MESSAGE_STATUS.DELIVERY.getItemValue(); try { - // 构建一个邮件对象 - SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); - // 设置邮件主题 - simpleMailMessage.setSubject(message.getTitle()); - // 设置发送人 - simpleMailMessage.setFrom(message.getSender()); - // 优先使用Receivers - if (V.notEmpty(message.getReceivers())) { - simpleMailMessage.setTo(message.getReceivers()); - } else { - simpleMailMessage.setTo(message.getReceiver()); + if (V.isEmpty(message.getExtDataMap().get(Message.ATTACHMENTS))) { + // 构建一个邮件对象 + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + // 设置邮件主题 + simpleMailMessage.setSubject(message.getTitle()); + // 设置发送人 + simpleMailMessage.setFrom(message.getSender()); + // 优先使用Receivers + if (V.notEmpty(message.getReceivers())) { + simpleMailMessage.setTo(message.getReceivers()); + } else { + simpleMailMessage.setTo(message.getReceiver()); + } + // 设置抄送人 + simpleMailMessage.setCc(message.getCcEmails()); + // 设置隐秘抄送人 + simpleMailMessage.setBcc(message.getBccEmails()); + // 设置邮件发送日期 + simpleMailMessage.setSentDate(new Date()); + // 设置邮件内容 + simpleMailMessage.setText(message.getContent()); + + // 发送邮件(无附件) + javaMailSender.send(simpleMailMessage); + } else{ + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + //发送有附件邮件 + MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); + // 设置邮件主题 + messageHelper.setSubject(message.getTitle()); + // 设置发送人 + messageHelper.setFrom(message.getSender()); + // 优先使用Receivers + if (V.notEmpty(message.getReceivers())) { + // 设置发送人 + messageHelper.setTo(message.getReceivers()); + }else{ + messageHelper.setTo(message.getReceiver()); + } + // 设置抄送人 + messageHelper.setCc(message.getCcEmails()); + // 设置隐秘抄送人 + messageHelper.setBcc(message.getBccEmails()); + // 设置邮件发送日期 + messageHelper.setSentDate(new Date()); + // 设置邮件内容 + messageHelper.setText(message.getContent()); + //添加附件 + String[] fileUrlList = message.getAttachments(); + for (String url:fileUrlList){ + FileSystemResource fileSystemResource = new FileSystemResource(url); + messageHelper.addAttachment(MimeUtility.encodeWord(fileSystemResource.getFilename(),"utf-8","B"), fileSystemResource); + } + //发送邮件(有附件) + javaMailSender.send(mimeMessage); } - // 设置抄送人 - simpleMailMessage.setCc(message.getCcEmails()); - // 设置隐秘抄送人 - simpleMailMessage.setBcc(message.getBccEmails()); - // 设置邮件发送日期 - simpleMailMessage.setSentDate(new Date()); - // 设置邮件内容 - simpleMailMessage.setText(message.getContent()); - // 发送邮件 - javaMailSender.send(simpleMailMessage); } catch (Exception e) { log.error("[发送邮件失败]:信息为: {} , 异常", message, e); result = e.getMessage(); -- Gitee From dd9884ba5a4f54be7c8fb5a499d4652cf2f619af Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 29 Jun 2021 22:29:15 +0800 Subject: [PATCH 42/83] =?UTF-8?q?*=20=E6=9B=B4=E6=96=B0=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f71bb37f..3cb12d69 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -> 可以告别常规SQL和CRUD了!diboot新用户: [看视频快速了解diboot](https://www.bilibili.com/video/BV17V411r7Cc) 、 [手把手跟我来体验](https://www.diboot.com/guide/newer/bootstrap.html) +> 可以告别常规SQL和CRUD了!diboot新用户: [看视频快速了解diboot](https://www.bilibili.com/video/BV17V411r7Cc) 、 [手把手跟我来体验](https://www.diboot.com/guide/newer/bootstrap.html) 、 +> [看diboot如何把关联查询性能提升10倍](https://www.bilibili.com/video/BV1tL411p7CD) # diboot - 基础组件化繁为简,高效工具以简驭繁

@@ -22,7 +23,7 @@ spring boot版本目前实现: core高效内核 + devtools开发助理 + IAM身 ## diboot基础组件 ### 1、 diboot-core: 精简优化内核 -高效精简内核,重构查询方式(拆解关联查询,程序中Join),简化开发,主要实现: +高效精简内核,重构查询方式,提高10倍查询性能,简化开发。主要实现: #### 1). 单表CRUD无SQL > 基于Mybatis-Plus实现(Mybatis-Plus具备通用Mapper方案和灵活的查询构造器) #### 2). 关联绑定无SQL(注解自动绑定) -- Gitee From 755d5b7ddd9390cb158091c44a8aef55f7512620 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 30 Jun 2021 11:56:54 +0800 Subject: [PATCH 43/83] =?UTF-8?q?*=20=E5=8D=87=E7=BA=A7spring=20boot?= =?UTF-8?q?=E8=87=B32.5.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cc9d5d4e..58e2d319 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.5.1 + 2.5.2 @@ -27,7 +27,7 @@ 1.8 - 2.5.1 + 2.5.2 6.2.0.Final 3.4.3.1 4.9.1 -- Gitee From 4bc5e769d0d07a5cb72f54a8abb9546011091c01 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 08:41:58 +0800 Subject: [PATCH 44/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96select=20*=20?= =?UTF-8?q?=E4=B8=BA=E4=BB=85select=E5=BF=85=E9=9C=80=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/binding/binder/EntityBinder.java | 20 ++++++++-- .../core/binding/binder/FieldBinder.java | 13 ++++--- .../core/binding/helper/ServiceAdaptor.java | 37 ++++++++++++++++++- .../core/service/impl/BaseServiceImpl.java | 36 +----------------- 4 files changed, 61 insertions(+), 45 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java index bb5afe21..f83df17e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java @@ -15,13 +15,12 @@ */ package com.diboot.core.binding.binder; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.binding.helper.ResultAssembler; +import com.diboot.core.binding.helper.ServiceAdaptor; import com.diboot.core.exception.BusinessException; -import com.diboot.core.util.BeanUtils; -import com.diboot.core.util.ISetter; -import com.diboot.core.util.S; -import com.diboot.core.util.V; +import com.diboot.core.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,4 +177,17 @@ public class EntityBinder extends BaseBinder { return BeanUtils.convert(value, annoObjectFieldClass); } } + + /** + * 获取EntityList + * @param queryWrapper + * @return + */ + @Override + protected List getEntityList(Wrapper queryWrapper) { + if(!referencedEntityClass.getName().equals(annoObjectFieldClass.getName())){ + queryWrapper = ServiceAdaptor.optimizeSelect(queryWrapper, referencedEntityClass, annoObjectFieldClass); + } + return super.getEntityList(queryWrapper); + } } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java index aa0b381e..4d032efd 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java @@ -16,8 +16,6 @@ package com.diboot.core.binding.binder; import com.baomidou.mybatisplus.extension.service.IService; -import com.diboot.core.binding.cache.BindingCacheManager; -import com.diboot.core.binding.parser.PropInfo; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.*; import org.slf4j.Logger; @@ -219,10 +217,15 @@ public class FieldBinder extends BaseBinder { } protected void buildSelectColumns(){ - List selectColumns = new ArrayList<>(); + List selectColumns = new ArrayList<>(8); selectColumns.addAll(refObjJoinCols); - for(String referencedGetterField : referencedGetterFieldNameList){ - selectColumns.add(toRefObjColumn(referencedGetterField)); + if(V.notEmpty(referencedGetterFieldNameList)){ + for(String referencedGetterField : referencedGetterFieldNameList){ + String refObjCol = toRefObjColumn(referencedGetterField); + if(!selectColumns.contains(refObjCol)){ + selectColumns.add(refObjCol); + } + } } queryWrapper.select(S.toStringArray(selectColumns)); } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index eb678e4e..66fa328a 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -15,16 +15,25 @@ */ package com.diboot.core.binding.helper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.config.Cons; import com.diboot.core.service.BaseService; import com.diboot.core.util.ContextHelper; +import com.diboot.core.util.S; +import com.diboot.core.util.V; import com.diboot.core.vo.Pagination; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Service适配器 @@ -118,7 +127,33 @@ public class ServiceAdaptor { pagination.setDefaultCreateTimeOrderBy(); } } - return (Page)pagination.toPage(); + return pagination.toPage(); + } + + /** + * 基于VO提取最小集select字段 + * @param queryWrapper + * @param voClass + */ + public static Wrapper optimizeSelect(Wrapper queryWrapper, Class entityClass, Class voClass){ + if(!(queryWrapper instanceof QueryWrapper) || queryWrapper.getSqlSelect() != null){ + return queryWrapper; + } + List allColumns = TableInfoHelper.getTableInfo(entityClass).getFieldList(); + if(V.isEmpty(allColumns)){ + return queryWrapper; + } + List columns = new ArrayList<>(); + String pk = ContextHelper.getIdFieldName(entityClass); + columns.add(pk); + Map fieldsMap = BindingCacheManager.getFieldsMap(voClass); + for(TableFieldInfo col : allColumns){ + if(fieldsMap.containsKey(col.getField().getName()) + && V.notEmpty(col.getColumn())){ + columns.add(col.getColumn()); + } + } + return ((QueryWrapper)queryWrapper).select(S.toStringArray(columns)); } } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index b44ad6f6..6e369fb4 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -21,11 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; @@ -43,7 +39,6 @@ import com.diboot.core.binding.binder.FieldListBinder; import com.diboot.core.binding.cache.BindingCacheManager; import com.diboot.core.binding.helper.ServiceAdaptor; import com.diboot.core.binding.parser.EntityInfoCache; -import com.diboot.core.binding.parser.PropInfo; import com.diboot.core.binding.query.dynamic.DynamicJoinQueryWrapper; import com.diboot.core.config.BaseConfig; import com.diboot.core.config.Cons; @@ -60,8 +55,6 @@ import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; -import java.lang.invoke.SerializedLambda; -import java.lang.reflect.Field; import java.util.*; /*** @@ -701,7 +694,7 @@ public class BaseServiceImpl, T> extends ServiceImpl @Override public List getViewObjectList(Wrapper queryWrapper, Pagination pagination, Class voClass) { - queryWrapper = optimizeSelect(queryWrapper, voClass); + queryWrapper = ServiceAdaptor.optimizeSelect(queryWrapper, getEntityClass(), voClass); List entityList = getEntityList(queryWrapper, pagination); // 自动转换为VO并绑定关联对象 List voList = Binder.convertAndBindRelations(entityList, voClass); @@ -718,33 +711,6 @@ public class BaseServiceImpl, T> extends ServiceImpl return ServiceAdaptor.convertToIPage(pagination, entityClass); } - /** - * 基于VO提取最小集select字段 - * @param queryWrapper - * @param voClass - */ - protected Wrapper optimizeSelect(Wrapper queryWrapper, Class voClass){ - if(!(queryWrapper instanceof QueryWrapper) || queryWrapper.getSqlSelect() != null){ - return queryWrapper; - } - Class entityClass = getEntityClass(); - List allColumns = TableInfoHelper.getTableInfo(entityClass).getFieldList(); - if(V.isEmpty(allColumns)){ - return queryWrapper; - } - List columns = new ArrayList<>(); - String pk = ContextHelper.getIdFieldName(entityClass); - columns.add(pk); - Map fieldsMap = BindingCacheManager.getFieldsMap(voClass); - for(TableFieldInfo col : allColumns){ - if(fieldsMap.containsKey(col.getField().getName()) - && V.notEmpty(col.getColumn())){ - columns.add(col.getColumn()); - } - } - return ((QueryWrapper)queryWrapper).select(S.toStringArray(columns)); - } - /** * 获取主键值 * @param entity -- Gitee From 528f090e041f49029b5d094e959016ecf861120c Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 09:40:26 +0800 Subject: [PATCH 45/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96select=20*=20?= =?UTF-8?q?=E4=B8=BA=E4=BB=85select=E5=BF=85=E9=9C=80=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/core/binding/binder/BaseBinder.java | 5 +++++ .../diboot/core/binding/binder/EntityBinder.java | 13 +++++++------ .../core/binding/binder/EntityListBinder.java | 2 ++ .../com/diboot/core/binding/binder/FieldBinder.java | 8 +++++--- .../diboot/core/binding/binder/FieldListBinder.java | 3 ++- .../diboot/core/binding/helper/ServiceAdaptor.java | 2 +- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java index 414a2256..b331108b 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java @@ -257,6 +257,11 @@ public abstract class BaseBinder { } } + /** + * 简化select列,仅select必需列 + */ + protected abstract void simplifySelectColumns(); + /** * 获取EntityList * @param queryWrapper diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java index f83df17e..7146475f 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java @@ -16,6 +16,7 @@ package com.diboot.core.binding.binder; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.binding.helper.ResultAssembler; import com.diboot.core.binding.helper.ServiceAdaptor; @@ -87,6 +88,7 @@ public class EntityBinder extends BaseBinder { } // 直接关联Entity if(middleTable == null){ + simplifySelectColumns(); // @BindEntity(entity = Department.class, condition="this.department_id=id AND this.type=type") // Department department; super.buildQueryWrapperJoinOn(); @@ -108,6 +110,7 @@ public class EntityBinder extends BaseBinder { Map valueEntityMap = new HashMap<>(); Map middleTableResultMap = middleTable.executeOneToOneQuery(trunkObjCol2ValuesMap); if(V.notEmpty(middleTableResultMap)){ + simplifySelectColumns(); // 提取entity主键值集合 Collection refObjValues = middleTableResultMap.values().stream().distinct().collect(Collectors.toList()); // 构建查询条件 @@ -179,15 +182,13 @@ public class EntityBinder extends BaseBinder { } /** - * 获取EntityList - * @param queryWrapper - * @return + * 简化select列,仅select必需列 */ @Override - protected List getEntityList(Wrapper queryWrapper) { + protected void simplifySelectColumns(){ if(!referencedEntityClass.getName().equals(annoObjectFieldClass.getName())){ - queryWrapper = ServiceAdaptor.optimizeSelect(queryWrapper, referencedEntityClass, annoObjectFieldClass); + queryWrapper = (QueryWrapper) ServiceAdaptor.optimizeSelect(queryWrapper, referencedEntityClass, annoObjectFieldClass); } - return super.getEntityList(queryWrapper); } + } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java index 0a89ab54..a8a95794 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java @@ -67,6 +67,7 @@ public class EntityListBinder extends EntityBinder { } Map valueEntityListMap = new HashMap<>(); if(middleTable == null){ + super.simplifySelectColumns(); super.buildQueryWrapperJoinOn(); //处理orderBy,附加排序 this.appendOrderBy(); @@ -87,6 +88,7 @@ public class EntityListBinder extends EntityBinder { if(V.isEmpty(middleTableResultMap)){ return; } + super.simplifySelectColumns(); // 收集查询结果values集合 List entityIdList = extractIdValueFromMap(middleTableResultMap); // 构建查询条件 diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java index 4d032efd..3ef982e6 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java @@ -94,7 +94,7 @@ public class FieldBinder extends BaseBinder { } // 直接关联 if(middleTable == null){ - this.buildSelectColumns(); + this.simplifySelectColumns(); super.buildQueryWrapperJoinOn(); // 获取匹配结果的mapList List> mapList = getMapList(queryWrapper); @@ -122,7 +122,7 @@ public class FieldBinder extends BaseBinder { } // 收集查询结果values集合 Collection refObjValues = middleTableResultMap.values().stream().distinct().collect(Collectors.toList()); - this.buildSelectColumns(); + this.simplifySelectColumns(); // 构建查询条件 String refObjJoinOnCol = refObjJoinCols.get(0); queryWrapper.in(refObjJoinOnCol, refObjValues); @@ -216,7 +216,9 @@ public class FieldBinder extends BaseBinder { return S.join(joinOnValues); } - protected void buildSelectColumns(){ + + @Override + protected void simplifySelectColumns() { List selectColumns = new ArrayList<>(8); selectColumns.addAll(refObjJoinCols); if(V.notEmpty(referencedGetterFieldNameList)){ diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java index 81972900..c035ac12 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java @@ -60,9 +60,9 @@ public class FieldListBinder extends FieldBinder { return; } Map valueEntityListMap = new HashMap<>(); - super.buildSelectColumns(); // 直接关联 if(middleTable == null){ + super.simplifySelectColumns(); super.buildQueryWrapperJoinOn(); // 查询entity列表: List List list = getEntityList(queryWrapper); @@ -84,6 +84,7 @@ public class FieldListBinder extends FieldBinder { if(V.isEmpty(middleTableResultMap)){ return; } + super.simplifySelectColumns(); // 收集查询结果values集合 List entityIdList = extractIdValueFromMap(middleTableResultMap); // 构建查询条件 diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index 66fa328a..a114d33d 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -135,7 +135,7 @@ public class ServiceAdaptor { * @param queryWrapper * @param voClass */ - public static Wrapper optimizeSelect(Wrapper queryWrapper, Class entityClass, Class voClass){ + public static Wrapper optimizeSelect(Wrapper queryWrapper, Class entityClass, Class voClass){ if(!(queryWrapper instanceof QueryWrapper) || queryWrapper.getSqlSelect() != null){ return queryWrapper; } -- Gitee From 46c3546b345d2958ac90bb824df838b45e8ad612 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 09:56:52 +0800 Subject: [PATCH 46/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96exists=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BB=85select=E4=B8=BB=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/service/BaseServiceTest.java | 6 ++++++ .../diboot/core/service/impl/BaseServiceImpl.java | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java index 364015ff..a429db4a 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/service/BaseServiceTest.java @@ -290,6 +290,12 @@ public class BaseServiceTest { public void testExist(){ boolean exists = dictionaryService.exists(Dictionary::getType, "GENDER"); Assert.assertTrue(exists); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("type", "GENDER"); + queryWrapper.eq("item_value", "F"); + exists = dictionaryService.exists(queryWrapper); + Assert.assertTrue(exists); } @Test diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index 6e369fb4..8c4d4f81 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -532,16 +532,19 @@ public class BaseServiceImpl, T> extends ServiceImpl @Override public boolean exists(Wrapper queryWrapper) { - List entityList = getEntityListLimit(queryWrapper, 1); - boolean isExists = V.notEmpty(entityList) && entityList.size() > 0; - entityList = null; - return isExists; + if((queryWrapper instanceof QueryWrapper) && queryWrapper.getSqlSelect() == null){ + String pk = ContextHelper.getIdFieldName(getEntityClass()); + ((QueryWrapper)queryWrapper).select(pk); + } + T entity = getSingleEntity(queryWrapper); + return entity != null; } @Override public List getEntityListByIds(List ids) { QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.in(Cons.FieldName.id.name(), ids); + String pk = ContextHelper.getIdFieldName(getEntityClass()); + queryWrapper.in(pk, ids); return getEntityList(queryWrapper); } -- Gitee From 645ab13c524281ec0d86d8e67ee07579b1381b77 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 15:33:04 +0800 Subject: [PATCH 47/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/mapper/DictionaryMapper.java | 3 --- .../core/test/binder/mapper/DbGoodsGoodsInfoMapper.java | 1 - .../core/test/binder/mapper/DbPurchaseFormPlanMapper.java | 1 - .../test/binder/mapper/DbPurchaseRelPlanGoodsMapper.java | 1 - .../core/test/binder/service/DbPurchaseFormPlanSvc.java | 1 - .../binder/service/impl/DbPurchaseFormPlanSvcImpl.java | 1 - .../java/diboot/core/test/binder/vo/OrganizationVO.java | 1 - .../test/java/diboot/core/test/binder/vo/UserEscVO.java | 1 - .../src/test/java/diboot/core/test/query/TestIssue72.java | 4 ++-- .../main/java/com/diboot/core/binding/QueryBuilder.java | 1 - .../java/com/diboot/core/binding/binder/EntityBinder.java | 6 ++++-- .../diboot/core/binding/cache/BindingCacheManager.java | 1 - .../java/com/diboot/core/binding/parser/MiddleTable.java | 1 - .../java/com/diboot/core/binding/parser/ParserCache.java | 2 -- .../com/diboot/core/holder/AnnotationRestApiHolder.java | 8 ++++++-- .../src/main/java/com/diboot/core/holder/api/RestApi.java | 2 -- .../main/java/com/diboot/core/service/BaseService.java | 1 - .../java/com/diboot/core/util/SqlFileInitializer.java | 1 - .../java/com/diboot/file/mapper/UploadFileMapper.java | 3 --- .../java/com/diboot/iam/annotation/process/LogAspect.java | 3 --- .../main/java/com/diboot/iam/mapper/IamAccountMapper.java | 3 --- .../java/com/diboot/iam/mapper/IamLoginTraceMapper.java | 3 --- .../java/com/diboot/iam/mapper/IamOperationLogMapper.java | 3 --- .../src/main/java/com/diboot/iam/mapper/IamOrgMapper.java | 3 --- .../java/com/diboot/iam/mapper/IamPositionMapper.java | 3 --- .../main/java/com/diboot/iam/mapper/IamRoleMapper.java | 3 --- .../main/java/com/diboot/iam/mapper/IamUserMapper.java | 3 --- .../diboot/iam/service/IamResourcePermissionService.java | 1 - .../service/impl/IamResourcePermissionServiceImpl.java | 2 -- .../com/diboot/iam/vo/InvalidResourcePermissionVO.java | 2 -- .../java/com/diboot/message/mapper/MessageMapper.java | 3 --- .../com/diboot/message/mapper/MessageTemplateMapper.java | 3 --- .../com/diboot/scheduler/mapper/ScheduleJobLogMapper.java | 3 --- .../com/diboot/scheduler/mapper/ScheduleJobMapper.java | 3 --- 34 files changed, 12 insertions(+), 69 deletions(-) diff --git a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java index 935d8acc..ec15f35a 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/mapper/DictionaryMapper.java @@ -17,9 +17,6 @@ package com.diboot.core.mapper; import com.diboot.core.entity.Dictionary; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 数据字典Mapper diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbGoodsGoodsInfoMapper.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbGoodsGoodsInfoMapper.java index 3e2eb470..58b23154 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbGoodsGoodsInfoMapper.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbGoodsGoodsInfoMapper.java @@ -2,7 +2,6 @@ package diboot.core.test.binder.mapper; import com.diboot.core.mapper.BaseCrudMapper; import diboot.core.test.binder.entity.DbGoodsGoodsInfo; -import diboot.core.test.binder.entity.DbPurchaseFormPlan; import org.apache.ibatis.annotations.Mapper; /** diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseFormPlanMapper.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseFormPlanMapper.java index ac4d71e2..376ccccd 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseFormPlanMapper.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseFormPlanMapper.java @@ -1,6 +1,5 @@ package diboot.core.test.binder.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.diboot.core.mapper.BaseCrudMapper; import diboot.core.test.binder.entity.DbPurchaseFormPlan; import org.apache.ibatis.annotations.Mapper; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseRelPlanGoodsMapper.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseRelPlanGoodsMapper.java index c1856cb6..00d1eff9 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseRelPlanGoodsMapper.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/mapper/DbPurchaseRelPlanGoodsMapper.java @@ -1,7 +1,6 @@ package diboot.core.test.binder.mapper; import com.diboot.core.mapper.BaseCrudMapper; -import diboot.core.test.binder.entity.DbPurchaseFormPlan; import diboot.core.test.binder.entity.DbPurchaseRelPlanGoods; import org.apache.ibatis.annotations.Mapper; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/service/DbPurchaseFormPlanSvc.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/service/DbPurchaseFormPlanSvc.java index 7438ac74..1685a39d 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/service/DbPurchaseFormPlanSvc.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/service/DbPurchaseFormPlanSvc.java @@ -1,6 +1,5 @@ package diboot.core.test.binder.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.service.BaseService; import diboot.core.test.binder.entity.DbPurchaseFormPlan; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/service/impl/DbPurchaseFormPlanSvcImpl.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/service/impl/DbPurchaseFormPlanSvcImpl.java index 4e327640..02396ca4 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/service/impl/DbPurchaseFormPlanSvcImpl.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/service/impl/DbPurchaseFormPlanSvcImpl.java @@ -15,7 +15,6 @@ */ package diboot.core.test.binder.service.impl; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.diboot.core.service.impl.BaseServiceImpl; import diboot.core.test.binder.entity.DbPurchaseFormPlan; import diboot.core.test.binder.mapper.DbPurchaseFormPlanMapper; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/OrganizationVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/OrganizationVO.java index 9aaeaee5..1be1d3ca 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/OrganizationVO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/OrganizationVO.java @@ -15,7 +15,6 @@ */ package diboot.core.test.binder.vo; -import com.baomidou.mybatisplus.annotation.TableField; import com.diboot.core.binding.annotation.BindDict; import com.diboot.core.binding.annotation.BindEntity; import com.diboot.core.binding.annotation.BindField; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java index 2409d830..91433ef5 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/UserEscVO.java @@ -15,7 +15,6 @@ */ package diboot.core.test.binder.vo; -import com.diboot.core.binding.annotation.BindDict; import com.diboot.core.binding.annotation.BindField; import diboot.core.test.binder.entity.Department; import diboot.core.test.binder.entity.Organization; diff --git a/diboot-core-starter/src/test/java/diboot/core/test/query/TestIssue72.java b/diboot-core-starter/src/test/java/diboot/core/test/query/TestIssue72.java index 3b9db322..712e1143 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/query/TestIssue72.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/query/TestIssue72.java @@ -4,11 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.diboot.core.binding.QueryBuilder; import com.diboot.core.vo.Pagination; import diboot.core.test.StartupApplication; +import diboot.core.test.binder.dto.PurchaseFormPlanQueryDto; +import diboot.core.test.binder.entity.DbPurchaseFormPlan; import diboot.core.test.binder.service.DbPurchaseFormPlanSvc; import diboot.core.test.binder.vo.DbPurchaseFormPlanVO; import diboot.core.test.config.SpringMvcConfig; -import diboot.core.test.binder.entity.DbPurchaseFormPlan; -import diboot.core.test.binder.dto.PurchaseFormPlanQueryDto; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index bfff04e9..6cae229e 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -15,7 +15,6 @@ */ package com.diboot.core.binding; -import com.baomidou.mybatisplus.annotation.SqlCondition; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.core.conditions.ISqlSegment; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java index 7146475f..3cf6c7fa 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityBinder.java @@ -15,13 +15,15 @@ */ package com.diboot.core.binding.binder; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.diboot.core.binding.helper.ResultAssembler; import com.diboot.core.binding.helper.ServiceAdaptor; import com.diboot.core.exception.BusinessException; -import com.diboot.core.util.*; +import com.diboot.core.util.BeanUtils; +import com.diboot.core.util.ISetter; +import com.diboot.core.util.S; +import com.diboot.core.util.V; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java index 2ad48e32..f3df6bf6 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/cache/BindingCacheManager.java @@ -27,7 +27,6 @@ import com.diboot.core.util.S; import com.diboot.core.util.V; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSessionFactory; -import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Primary; import java.lang.annotation.Annotation; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/MiddleTable.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/MiddleTable.java index 7fac4896..b62a8576 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/MiddleTable.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/MiddleTable.java @@ -23,7 +23,6 @@ import com.diboot.core.binding.helper.ResultAssembler; import com.diboot.core.config.BaseConfig; import com.diboot.core.config.Cons; import com.diboot.core.exception.BusinessException; -import com.diboot.core.util.ContextHelper; import com.diboot.core.util.S; import com.diboot.core.util.SqlExecutor; import com.diboot.core.util.V; diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java index 6980ebc7..7637147f 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/ParserCache.java @@ -22,12 +22,10 @@ import com.diboot.core.binding.query.BindQuery; import com.diboot.core.binding.query.dynamic.AnnoJoiner; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.BeanUtils; -import com.diboot.core.util.ContextHelper; import com.diboot.core.util.S; import com.diboot.core.util.V; import com.diboot.core.vo.Status; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.core.annotation.AnnotationUtils; import java.lang.annotation.Annotation; diff --git a/diboot-core/src/main/java/com/diboot/core/holder/AnnotationRestApiHolder.java b/diboot-core/src/main/java/com/diboot/core/holder/AnnotationRestApiHolder.java index e72b8705..3caf4cc4 100644 --- a/diboot-core/src/main/java/com/diboot/core/holder/AnnotationRestApiHolder.java +++ b/diboot-core/src/main/java/com/diboot/core/holder/AnnotationRestApiHolder.java @@ -20,14 +20,18 @@ import com.diboot.core.config.Cons; import com.diboot.core.holder.api.CollectThisApi; import com.diboot.core.holder.api.RestApi; import com.diboot.core.holder.api.RestApiWrapper; -import com.diboot.core.util.*; +import com.diboot.core.util.AnnotationUtils; +import com.diboot.core.util.BeanUtils; +import com.diboot.core.util.ContextHelper; +import com.diboot.core.util.V; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * 注解 RestApi 信息缓存 diff --git a/diboot-core/src/main/java/com/diboot/core/holder/api/RestApi.java b/diboot-core/src/main/java/com/diboot/core/holder/api/RestApi.java index 905a0edb..1ff8b343 100644 --- a/diboot-core/src/main/java/com/diboot/core/holder/api/RestApi.java +++ b/diboot-core/src/main/java/com/diboot/core/holder/api/RestApi.java @@ -15,13 +15,11 @@ */ package com.diboot.core.holder.api; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import java.io.Serializable; -import java.lang.annotation.Annotation; import java.util.List; /** diff --git a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java index 31a638f6..b303302b 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/BaseService.java +++ b/diboot-core/src/main/java/com/diboot/core/service/BaseService.java @@ -22,7 +22,6 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapp import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; -import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.diboot.core.binding.binder.EntityBinder; import com.diboot.core.binding.binder.EntityListBinder; import com.diboot.core.binding.binder.FieldBinder; diff --git a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java index 2149b4e5..543c0e9d 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java +++ b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java @@ -25,7 +25,6 @@ import org.springframework.core.env.Environment; import java.io.FileNotFoundException; import java.io.InputStream; import java.sql.Connection; -import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java index a0df6969..e02808b0 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/mapper/UploadFileMapper.java @@ -18,9 +18,6 @@ package com.diboot.file.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.file.entity.UploadFile; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 文件相关Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/LogAspect.java b/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/LogAspect.java index d8577d2d..fa88e92a 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/LogAspect.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/annotation/process/LogAspect.java @@ -30,15 +30,12 @@ import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamSource; import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; -import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java index b2086dd8..8724a7ca 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamAccountMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamAccount; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 认证用户Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java index 04729db9..90518bb3 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamLoginTraceMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamLoginTrace; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 登录记录Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java index 9649b243..e55f0811 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOperationLogMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamOperationLog; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 操作日志Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java index f5c2ee63..baf6421d 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamOrgMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamOrg; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 组织机构Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java index 82281e24..fbb98c82 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamPositionMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamPosition; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 岗位Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java index 420fc192..513f03a3 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamRoleMapper.java @@ -18,9 +18,6 @@ package com.diboot.iam.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.iam.entity.IamRole; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 角色Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index c004768f..a86a4d57 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -22,9 +22,6 @@ import com.diboot.iam.entity.IamUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 系统用户Mapper diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamResourcePermissionService.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamResourcePermissionService.java index 66efa6ff..b9f9ec3b 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamResourcePermissionService.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamResourcePermissionService.java @@ -19,7 +19,6 @@ package com.diboot.iam.service; import com.diboot.iam.dto.IamResourcePermissionDTO; import com.diboot.iam.entity.IamResourcePermission; import com.diboot.iam.vo.IamResourcePermissionListVO; -import com.diboot.iam.vo.InvalidResourcePermissionVO; import java.util.List; import java.util.Map; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamResourcePermissionServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamResourcePermissionServiceImpl.java index 7cf773d4..3a74e49d 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamResourcePermissionServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamResourcePermissionServiceImpl.java @@ -32,11 +32,9 @@ import com.diboot.iam.service.IamResourcePermissionService; import com.diboot.iam.vo.IamResourcePermissionListVO; import com.diboot.iam.vo.InvalidResourcePermissionVO; import lombok.extern.slf4j.Slf4j; -import org.aspectj.weaver.ast.Var; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.validation.constraints.NotNull; import java.util.*; import java.util.stream.Collectors; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/InvalidResourcePermissionVO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/InvalidResourcePermissionVO.java index b1c62876..4cadf72c 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/InvalidResourcePermissionVO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/InvalidResourcePermissionVO.java @@ -16,7 +16,6 @@ package com.diboot.iam.vo; import com.diboot.core.binding.annotation.BindDict; -import com.diboot.core.binding.annotation.BindEntityList; import com.diboot.core.binding.annotation.BindField; import com.diboot.core.util.V; import com.diboot.iam.entity.IamResourcePermission; @@ -24,7 +23,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import java.io.Serializable; import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java index b24dd27b..8106d189 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageMapper.java @@ -19,9 +19,6 @@ package com.diboot.message.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.message.entity.Message; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 消息Mapper diff --git a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java index 9be5c7af..56668e59 100644 --- a/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java +++ b/diboot-message-starter/src/main/java/com/diboot/message/mapper/MessageTemplateMapper.java @@ -18,9 +18,6 @@ package com.diboot.message.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.message.entity.MessageTemplate; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java index 922e74ad..d8c4762d 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobLogMapper.java @@ -18,9 +18,6 @@ package com.diboot.scheduler.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.scheduler.entity.ScheduleJobLog; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 定时任务Job定义Mapper diff --git a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java index e8c88926..1e5da626 100644 --- a/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java +++ b/diboot-scheduler-starter/src/main/java/com/diboot/scheduler/mapper/ScheduleJobMapper.java @@ -18,9 +18,6 @@ package com.diboot.scheduler.mapper; import com.diboot.core.mapper.BaseCrudMapper; import com.diboot.scheduler.entity.ScheduleJob; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Update; - -import java.io.Serializable; /** * 定时任务Job定义Mapper -- Gitee From c894364fdce498f09ef38e1f071d873ccc04d057 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 15:34:00 +0800 Subject: [PATCH 48/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 3cb12d69..f97f48bb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -> 可以告别常规SQL和CRUD了!diboot新用户: [看视频快速了解diboot](https://www.bilibili.com/video/BV17V411r7Cc) 、 [手把手跟我来体验](https://www.diboot.com/guide/newer/bootstrap.html) 、 +> 从此告别常规SQL和CRUD了! diboot新用户: [看视频快速了解diboot](https://www.bilibili.com/video/BV17V411r7Cc) 、 [手把手跟我来体验](https://www.diboot.com/guide/newer/bootstrap.html) 、 + > [看diboot如何把关联查询性能提升10倍](https://www.bilibili.com/video/BV1tL411p7CD) # diboot - 基础组件化繁为简,高效工具以简驭繁 @@ -15,29 +16,21 @@ ![diboot平台组成结构图](https://www.diboot.com/structure.png) -spring boot版本目前实现: core高效内核 + devtools开发助理 + IAM身份认证、file文件处理、scheduler定时任务等基础组件 + diboot-*-admin基础后台。 - > [spring cloud版本,移步这里->](https://github.com/dibo-software/diboot-cloud) > [diboot-workflow 工作流授权](https://www.diboot.com/ent/service.html) ## diboot基础组件 -### 1、 diboot-core: 精简优化内核 -高效精简内核,重构查询方式,提高10倍查询性能,简化开发。主要实现: -#### 1). 单表CRUD无SQL - > 基于Mybatis-Plus实现(Mybatis-Plus具备通用Mapper方案和灵活的查询构造器) -#### 2). 关联绑定无SQL(注解自动绑定) - > 扩展实现了多表关联查询的无SQL方案,只需要一个简单注解@Bind*,就可以实现关联对象(含字段、字段集合、实体、实体集合等)的数据绑定,且实现方案是将关联查询拆解为单表查询,保障最佳性能。 -#### 3). 数据字典无SQL(注解自动绑定) - > 通过@BindDict注解实现数据字典(枚举)的存储值value与显示值name的转换。 -#### 4). 跨表查询无SQL(自动构建QueryWrapper与查询) - > @BindQuery注解绑定字段查询方式及关联表,自动构建QueryWrapper,并动态执行单表或Join联表查询。 -#### 5). BaseService扩展增强,支持常规的单表及关联开发场景接口 - > createEntityAndRelatedEntities、getValuesOfField、exists、getKeyValueList、getViewObject*等接口 -#### 6). 其他常用工具类、状态码、异常处理的最佳实践封装 - > JsonResult、字符串处理、常用校验、BeanUtils、DateUtils等 - -基于diboot-core 2.x版本的CRUD和简单关联的常规功能实现,代码量比传统Mybatis项目减少80%+),且实现更高效更易维护。 +### 1、 diboot-core: 精简优化内核:写的更少,性能更好 +主要特性: +* 单表CRUD无SQL +* 关联绑定无SQL(注解自动绑定) +* 数据字典无SQL(注解自动绑定) +* 跨表查询无SQL(自动构建QueryWrapper与查询) +* BaseService扩展增强,支持常规的单表及关联开发场景接口 +* 其他常用工具类、状态码、异常处理的最佳实践封装 + +基于diboot-core的CRUD和常规关联的功能实现,代码量比传统Mybatis项目减少80%+,且性能更好更易维护。 > 详细文档: [diboot-core文档](https://www.diboot.com/guide/diboot-core/%E7%AE%80%E4%BB%8B.html). ### 2、IAM 身份认证基础组件 及 配套VUE前端框架(diboot-antd-admin、diboot-element-admin) -- Gitee From 5c006a39b0bfe6c67be35f4d1278762fdfd920b5 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 1 Jul 2021 18:15:29 +0800 Subject: [PATCH 49/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/core/binding/QueryBuilder.java | 5 +- .../core/binding/binder/BaseBinder.java | 8 +-- .../core/binding/binder/EntityBinder.java | 19 ++++-- .../core/binding/binder/EntityListBinder.java | 16 +++-- .../core/binding/binder/FieldBinder.java | 29 +++++--- .../core/binding/binder/FieldListBinder.java | 50 +++++++++----- .../core/binding/helper/ResultAssembler.java | 67 +++++++++++++------ .../core/binding/parser/ConditionParser.java | 2 +- .../query/dynamic/DynamicSqlProvider.java | 15 +++-- 9 files changed, 140 insertions(+), 71 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java index 6cae229e..aff89093 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/QueryBuilder.java @@ -28,6 +28,7 @@ import com.diboot.core.binding.query.Strategy; import com.diboot.core.binding.query.dynamic.AnnoJoiner; import com.diboot.core.binding.query.dynamic.DynamicJoinQueryWrapper; import com.diboot.core.binding.query.dynamic.ExtQueryWrapper; +import com.diboot.core.config.Cons; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.S; import com.diboot.core.util.V; @@ -255,8 +256,8 @@ public class QueryBuilder { } } // 支持逗号分隔的字符串 - else if(value instanceof String && ((String) value).contains(",")){ - Object[] valueArray = ((String) value).split(","); + else if(value instanceof String && ((String) value).contains(Cons.SEPARATOR_COMMA)){ + Object[] valueArray = ((String) value).split(Cons.SEPARATOR_COMMA); wrapper.between(columnName, valueArray[0], valueArray[1]); } else{ diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java index b331108b..ea53148c 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/BaseBinder.java @@ -341,10 +341,10 @@ public abstract class BaseBinder { * 注解宿主对象的列名转换为字段名 * @return */ - public List getAnnoObjJoinFlds(){ - List fields = new ArrayList<>(annoObjJoinCols.size()); - for(String col : annoObjJoinCols){ - fields.add(toAnnoObjField(col)); + public String[] getAnnoObjJoinFlds(){ + String[] fields = new String[annoObjJoinCols.size()]; + for(int i=0; i extends BaseBinder { */ private Map buildMatchKey2EntityMap(List list){ Map key2TargetMap = new HashMap<>(list.size()); - List joinOnValues = new ArrayList<>(refObjJoinCols.size()); + StringBuilder sb = new StringBuilder(); for(T entity : list){ - joinOnValues.clear(); - for(String refObjJoinOnCol : refObjJoinCols){ + sb.setLength(0); + for(int i=0; i 0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(pkValue); } - String matchKey = S.join(joinOnValues); - + // 查找匹配Key + String matchKey = sb.toString(); Object target = entity; if(target instanceof Map == false){ target = cloneOrConvertBean(entity); } key2TargetMap.put(matchKey, target); } + sb.setLength(0); return key2TargetMap; } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java index a8a95794..d42e3c3f 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/EntityListBinder.java @@ -130,14 +130,19 @@ public class EntityListBinder extends EntityBinder { */ private Map buildMatchKey2EntityListMap(List list){ Map key2TargetListMap = new HashMap<>(list.size()); - List joinOnValues = new ArrayList<>(refObjJoinCols.size()); + StringBuilder sb = new StringBuilder(); for(T entity : list){ - joinOnValues.clear(); - for(String refObjJoinOnCol : refObjJoinCols){ + sb.setLength(0); + for(int i=0; i 0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(pkValue); } - String matchKey = S.join(joinOnValues); + // 查找匹配Key + String matchKey = sb.toString(); // 获取list List entityList = key2TargetListMap.get(matchKey); if(entityList == null){ @@ -150,6 +155,7 @@ public class EntityListBinder extends EntityBinder { } entityList.add(target); } + sb.setLength(0); return key2TargetListMap; } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java index 3ef982e6..6de92cff 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java @@ -16,6 +16,7 @@ package com.diboot.core.binding.binder; import com.baomidou.mybatisplus.extension.service.IService; +import com.diboot.core.config.Cons; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.*; import org.slf4j.Logger; @@ -185,13 +186,17 @@ public class FieldBinder extends BaseBinder { * @return */ private String buildMatchKey(Object annoObject){ - List joinOnValues = new ArrayList<>(annoObjJoinCols.size()); - for(String annoJoinOn : annoObjJoinCols){ + StringBuilder sb = new StringBuilder(); + for(int i=0; i 0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(val); } - return S.join(joinOnValues); + return sb.toString(); } /** @@ -201,7 +206,8 @@ public class FieldBinder extends BaseBinder { * @return */ private String buildMatchKey(Object annoObject, Map middleTableResultMap){ - List joinOnValues = new ArrayList<>(middleTable.getTrunkObjColMapping().size()); + StringBuilder sb = new StringBuilder(); + boolean appendComma = false; for(Map.Entry entry : middleTable.getTrunkObjColMapping().entrySet()){ String getterField = toAnnoObjField(entry.getKey()); String fieldValue = BeanUtils.getStringProperty(annoObject, getterField); @@ -210,13 +216,18 @@ public class FieldBinder extends BaseBinder { Object value = middleTableResultMap.get(fieldValue); fieldValue = String.valueOf(value); } - joinOnValues.add(fieldValue); + if(appendComma){ + sb.append(Cons.SEPARATOR_COMMA); + } + if(appendComma == false){ + appendComma = true; + } + sb.append(fieldValue); } // 查找匹配Key - return S.join(joinOnValues); + return sb.toString(); } - @Override protected void simplifySelectColumns() { List selectColumns = new ArrayList<>(8); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java index c035ac12..d8b4f7e1 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java @@ -16,9 +16,9 @@ package com.diboot.core.binding.binder; import com.baomidou.mybatisplus.extension.service.IService; +import com.diboot.core.config.Cons; import com.diboot.core.exception.BusinessException; import com.diboot.core.util.BeanUtils; -import com.diboot.core.util.S; import com.diboot.core.util.V; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,16 +128,20 @@ public class FieldListBinder extends FieldBinder { if(V.isEmpty(fromList) || V.isEmpty(valueMatchMap)){ return; } - List fieldValues = new ArrayList<>(annoObjJoinCols.size()); + StringBuilder sb = new StringBuilder(); try{ for(E object : fromList){ - fieldValues.clear(); - for(String annoObjJoinCol : annoObjJoinCols){ - String fieldValue = BeanUtils.getStringProperty(object, toAnnoObjField(annoObjJoinCol)); - fieldValues.add(fieldValue); + sb.setLength(0); + for(int i=0; i0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(val); } // 查找匹配Key - String matchKey = S.join(fieldValues); + String matchKey = sb.toString(); List entityList = valueMatchMap.get(matchKey); if(entityList != null){ // 赋值 @@ -147,6 +151,7 @@ public class FieldListBinder extends FieldBinder { } } } + sb.setLength(0); } catch (Exception e){ log.warn("设置属性值异常", e); @@ -164,18 +169,24 @@ public class FieldListBinder extends FieldBinder { if(V.isEmpty(fromList) || V.isEmpty(valueMatchMap)){ return; } - List fieldValues = new ArrayList<>(trunkObjColMapping.size()); + StringBuilder sb = new StringBuilder(); + boolean appendComma = false; try{ for(E object : fromList){ - fieldValues.clear(); + sb.setLength(0); for(Map.Entry entry :trunkObjColMapping.entrySet()){ String getterField = toAnnoObjField(entry.getKey()); String fieldValue = BeanUtils.getStringProperty(object, getterField); - fieldValues.add(fieldValue); + if(appendComma){ + sb.append(Cons.SEPARATOR_COMMA); + } + if(appendComma == false){ + appendComma = true; + } + sb.append(fieldValue); } // 查找匹配Key - String matchKey = S.join(fieldValues); - List entityList = valueMatchMap.get(matchKey); + List entityList = valueMatchMap.get(sb.toString()); if(entityList != null){ // 赋值 for(int i = 0; i< annoObjectSetterPropNameList.size(); i++){ @@ -197,14 +208,18 @@ public class FieldListBinder extends FieldBinder { */ private Map buildMatchKey2FieldListMap(List list){ Map key2TargetListMap = new HashMap<>(list.size()); - List joinOnValues = new ArrayList<>(refObjJoinCols.size()); + StringBuilder sb = new StringBuilder(); for(T entity : list){ - joinOnValues.clear(); - for(String refObjJoinOnCol : refObjJoinCols){ + sb.setLength(0); + for(int i=0; i 0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(fldValue); } - String matchKey = S.join(joinOnValues); + String matchKey = sb.toString(); // 获取list List entityList = key2TargetListMap.get(matchKey); if(entityList == null){ @@ -213,6 +228,7 @@ public class FieldListBinder extends FieldBinder { } entityList.add(entity); } + sb.setLength(0); return key2TargetListMap; } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java index 0f6902d6..aa9318b9 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java @@ -15,6 +15,7 @@ */ package com.diboot.core.binding.helper; +import com.diboot.core.config.Cons; import com.diboot.core.util.BeanUtils; import com.diboot.core.util.S; import com.diboot.core.util.V; @@ -39,25 +40,29 @@ public class ResultAssembler { * @param valueMatchMap * @param */ - public static void bindPropValue(String setterFieldName, List fromList, List getterFields, Map valueMatchMap){ + public static void bindPropValue(String setterFieldName, List fromList, String[] getterFields, Map valueMatchMap){ if(V.isEmpty(fromList) || V.isEmpty(valueMatchMap)){ return; } - List fieldValues = new ArrayList<>(getterFields.size()); + StringBuilder sb = new StringBuilder(); try{ for(E object : fromList){ - fieldValues.clear(); - for(String getterField : getterFields){ - String fieldValue = BeanUtils.getStringProperty(object, getterField); - fieldValues.add(fieldValue); + sb.setLength(0); + for(int i=0; i 0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append(fieldValue); } // 查找匹配Key - String matchKey = S.join(fieldValues); + String matchKey = sb.toString(); if(valueMatchMap.containsKey(matchKey)){ // 赋值 BeanUtils.setProperty(object, setterFieldName, valueMatchMap.get(matchKey)); } } + sb.setLength(0); } catch (Exception e){ log.warn("设置属性值异常, setterFieldName="+setterFieldName, e); @@ -76,10 +81,11 @@ public class ResultAssembler { if(V.isEmpty(fromList) || V.isEmpty(valueMatchMap)){ return; } - List fieldValues = new ArrayList<>(trunkObjColMapping.size()); + StringBuilder sb = new StringBuilder(); + boolean appendComma = false; try{ for(E object : fromList){ - fieldValues.clear(); + sb.setLength(0); for(Map.Entry entry :trunkObjColMapping.entrySet()){ //转换为字段名 String getterField = col2FieldMapping.get(entry.getKey()); @@ -87,16 +93,22 @@ public class ResultAssembler { getterField = S.toLowerCaseCamel(entry.getKey()); } String fieldValue = BeanUtils.getStringProperty(object, getterField); - fieldValues.add(fieldValue); + if(appendComma){ + sb.append(Cons.SEPARATOR_COMMA); + } + if(appendComma == false){ + appendComma = true; + } + sb.append(fieldValue); } // 查找匹配Key - String matchKey = S.join(fieldValues); + String matchKey = sb.toString(); if(valueMatchMap.containsKey(matchKey)){ // 赋值 BeanUtils.setProperty(object, setterFieldName, valueMatchMap.get(matchKey)); } } - fieldValues.clear(); + sb.setLength(0); } catch (Exception e){ log.warn("设置属性值异常, setterFieldName="+setterFieldName, e); @@ -119,14 +131,21 @@ public class ResultAssembler { String valueName = branchObjColMapping.entrySet().iterator().next().getKey(); // 合并list为map Map resultMap = new HashMap<>(resultSetMapList.size()); - List fieldValues = new ArrayList<>(trunkObjColMapping.size()); + StringBuilder sb = new StringBuilder(); + boolean appendComma = false; for(Map row : resultSetMapList){ - fieldValues.clear(); + sb.setLength(0); for(Map.Entry entry : trunkObjColMapping.entrySet()){ Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); - fieldValues.add(S.valueOf(keyObj)); + if(appendComma){ + sb.append(Cons.SEPARATOR_COMMA); + } + if(appendComma == false){ + appendComma = true; + } + sb.append(S.valueOf(keyObj)); } - String matchKeys = S.join(fieldValues); + String matchKeys = sb.toString(); Object valueObj = row.containsKey(valueName)? row.get(valueName) : row.get(valueName.toUpperCase()); resultMap.put(matchKeys, valueObj); } @@ -149,14 +168,21 @@ public class ResultAssembler { String valueName = branchObjColMapping.entrySet().iterator().next().getKey(); // 合并list为map Map resultMap = new HashMap<>(); - List fieldValues = new ArrayList<>(trunkObjColMapping.size()); + StringBuilder sb = new StringBuilder(); + boolean appendComma = false; for(Map row : resultSetMapList){ - fieldValues.clear(); + sb.setLength(0); for(Map.Entry entry : trunkObjColMapping.entrySet()){ Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); - fieldValues.add(S.valueOf(keyObj)); + if(appendComma){ + sb.append(Cons.SEPARATOR_COMMA); + } + if(appendComma == false){ + appendComma = true; + } + sb.append(S.valueOf(keyObj)); } - String matchKeys = S.join(fieldValues); + String matchKeys = sb.toString(); Object valueObj = row.containsKey(valueName)? row.get(valueName) : row.get(valueName.toUpperCase()); if(valueObj != null){ List valueList = resultMap.get(matchKeys); @@ -167,6 +193,7 @@ public class ResultAssembler { valueList.add(valueObj); } } + sb.setLength(0); return resultMap; } diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionParser.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionParser.java index bf165e2e..5a06d734 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionParser.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionParser.java @@ -40,7 +40,7 @@ public class ConditionParser implements ExpressionVisitor,ItemsListVisitor { } private List errorMsgList = null; - private List expressList = new ArrayList<>(); + private List expressList = new ArrayList<>(8); /** * 添加错误信息 diff --git a/diboot-core/src/main/java/com/diboot/core/binding/query/dynamic/DynamicSqlProvider.java b/diboot-core/src/main/java/com/diboot/core/binding/query/dynamic/DynamicSqlProvider.java index 31a41e92..a882c310 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/query/dynamic/DynamicSqlProvider.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/query/dynamic/DynamicSqlProvider.java @@ -21,12 +21,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.diboot.core.binding.QueryBuilder; import com.diboot.core.binding.parser.ParserCache; import com.diboot.core.config.BaseConfig; +import com.diboot.core.config.Cons; import com.diboot.core.util.S; import com.diboot.core.util.V; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.jdbc.SQL; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -141,12 +141,15 @@ public class DynamicSqlProvider { */ private String formatSqlSelect(String sqlSelect){ String[] columns = S.split(sqlSelect); - List selects = new ArrayList<>(columns.length); - for(String column : columns){ - column = S.removeDuplicateBlank(column).trim(); - selects.add("self."+S.toSnakeCase(column)); + StringBuilder sb = new StringBuilder(); + for(int i=0; i0){ + sb.append(Cons.SEPARATOR_COMMA); + } + sb.append("self."+S.toSnakeCase(column)); } - return S.join(selects); + return sb.toString(); } /** -- Gitee From af24dbf4dcecfba830f1df09f9d080c95c67395a Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 5 Jul 2021 11:12:38 +0800 Subject: [PATCH 50/83] =?UTF-8?q?*=20=E9=80=82=E9=85=8Did=E4=B8=BB?= =?UTF-8?q?=E9=94=AE=E9=87=8D=E5=AE=9A=E4=B9=89=E7=9A=84=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/binding/helper/ServiceAdaptor.java | 6 ++++-- .../main/java/com/diboot/core/binding/parser/PropInfo.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index a114d33d..2fb79a5d 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -144,8 +144,10 @@ public class ServiceAdaptor { return queryWrapper; } List columns = new ArrayList<>(); - String pk = ContextHelper.getIdFieldName(entityClass); - columns.add(pk); + String pk = ContextHelper.getIdColumnName(entityClass); + if(V.notEmpty(pk)){ + columns.add(pk); + } Map fieldsMap = BindingCacheManager.getFieldsMap(voClass); for(TableFieldInfo col : allColumns){ if(fieldsMap.containsKey(col.getField().getName()) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java index 4dcdddc0..4d1816ab 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/PropInfo.java @@ -75,7 +75,7 @@ public class PropInfo implements Serializable { } // 主键 TableId tableId = fld.getAnnotation(TableId.class); - if(tableId != null){ + if(tableId != null && this.idColumn == null){ if (V.notEmpty(tableId.value())){ columnName = tableId.value(); } -- Gitee From bb1973d0c52f47c0b9fec7110825ba0909cea3f5 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 6 Jul 2021 12:50:09 +0800 Subject: [PATCH 51/83] + is_deleted --- .../src/main/java/com/diboot/iam/mapper/IamUserMapper.java | 2 +- .../java/com/diboot/iam/service/impl/IamUserServiceImpl.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index a86a4d57..dc4ef293 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -38,7 +38,7 @@ public interface IamUserMapper extends BaseCrudMapper { * @param queryWrapper * @return */ - @Select("select u.* from iam_user u left join iam_org o on u.org_id=o.id ${ew.customSqlSegment} order by o.depth asc, o.sort_id desc, o.id desc, u.id desc") + @Select("SELECT u.* FROM iam_user u LEFT JOIN iam_org o ON u.org_id=o.id ${ew.customSqlSegment} ORDER BY o.depth ASC, o.sort_id DESC, o.id DESC, u.id DESC") IPage selectPageSortByOrg(IPage page, @Param("ew") Wrapper queryWrapper); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java index 5b2b8c14..5bbe7684 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java @@ -75,10 +75,12 @@ public class IamUserServiceImpl extends BaseIamServiceImpl getEntityListSortByOrg(QueryWrapper queryWrapper, Pagination pagination) { // 如果是动态join,则调用JoinsBinder if(queryWrapper instanceof DynamicJoinQueryWrapper){ - return Binder.joinQueryList((DynamicJoinQueryWrapper)queryWrapper, entityClass, pagination); + return Binder.joinQueryList(queryWrapper, entityClass, pagination); } // 否则,调用MP默认实现 if(pagination != null){ + queryWrapper.eq("u.is_deleted", false); + queryWrapper.eq("o.is_deleted", false); IPage page = convertToIPage(queryWrapper, pagination); page = super.getBaseMapper().selectPageSortByOrg(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 -- Gitee From d9e5e8f6349a852e73c84d1bea6f769a2ffb3b0c Mon Sep 17 00:00:00 2001 From: "yangzhao635226@163.com" Date: Tue, 13 Jul 2021 09:44:07 +0800 Subject: [PATCH 52/83] =?UTF-8?q?+=20=E4=BA=8B=E5=8A=A1=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=A4=9A=E6=9D=A1=E5=8A=A8=E6=80=81SQL=E5=8F=AF=E6=8A=9B?= =?UTF-8?q?=E5=87=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/core/util/SqlFileInitializer.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java index 543c0e9d..ae6de691 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java +++ b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java @@ -235,6 +235,19 @@ public class SqlFileInitializer { * @return */ public static boolean executeMultipleUpdateSqlsWithTransaction(List sqlStatementList){ + try { + return executeMultipleUpdateSqlsWithTransactionWithException(sqlStatementList); + } catch(Exception e) { + return false; + } + } + + /*** + * 执行多条批量更新SQL,并在执行异常时跑出异常(支持事务,有报错即回滚) + * @param sqlStatementList + * @return + */ + public static boolean executeMultipleUpdateSqlsWithTransactionWithException(List sqlStatementList) throws Exception{ if(V.isEmpty(sqlStatementList)){ return false; } @@ -256,7 +269,8 @@ public class SqlFileInitializer { catch (Exception e){ log.error("SQL执行异常,请检查:", e); session.rollback(); - return false; + session.close(); + throw e; } finally { if(session != null){ -- Gitee From 83543b9c210896bc732758e336623caa233ca2f0 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 13 Jul 2021 10:30:07 +0800 Subject: [PATCH 53/83] * rename ThrowException --- .../main/java/com/diboot/core/util/SqlFileInitializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java index ae6de691..8ca18167 100644 --- a/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java +++ b/diboot-core/src/main/java/com/diboot/core/util/SqlFileInitializer.java @@ -236,7 +236,7 @@ public class SqlFileInitializer { */ public static boolean executeMultipleUpdateSqlsWithTransaction(List sqlStatementList){ try { - return executeMultipleUpdateSqlsWithTransactionWithException(sqlStatementList); + return executeMultipleUpdateSqlsWithTransactionThrowException(sqlStatementList); } catch(Exception e) { return false; } @@ -247,7 +247,7 @@ public class SqlFileInitializer { * @param sqlStatementList * @return */ - public static boolean executeMultipleUpdateSqlsWithTransactionWithException(List sqlStatementList) throws Exception{ + public static boolean executeMultipleUpdateSqlsWithTransactionThrowException(List sqlStatementList) throws Exception{ if(V.isEmpty(sqlStatementList)){ return false; } -- Gitee From 4c9406b34d0511299468751a3c22e8504f10e28e Mon Sep 17 00:00:00 2001 From: wuy <1311695042@qq.com> Date: Tue, 13 Jul 2021 11:50:02 +0800 Subject: [PATCH 54/83] =?UTF-8?q?add:=20=E5=A2=9E=E5=8A=A0=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81=E7=99=BB?= =?UTF-8?q?=E9=99=86=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/IEncryptorHandler.java | 32 ++++++++++ .../com/diboot/iam/dto/EncryptCredential.java | 58 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 diboot-core/src/main/java/com/diboot/core/handler/IEncryptorHandler.java create mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/dto/EncryptCredential.java diff --git a/diboot-core/src/main/java/com/diboot/core/handler/IEncryptorHandler.java b/diboot-core/src/main/java/com/diboot/core/handler/IEncryptorHandler.java new file mode 100644 index 00000000..22c3e68a --- /dev/null +++ b/diboot-core/src/main/java/com/diboot/core/handler/IEncryptorHandler.java @@ -0,0 +1,32 @@ +package com.diboot.core.handler; + +/** + * 加解密接口 + * + * @author : uu + * @version : v1.0 + * @Date 2021/7/13 09:45 + */ +public interface IEncryptorHandler { + + /** + * 解密 + * @param content + * @return + * @throws Exception + */ + default String encrypt(String content) throws Exception{ + return content; + } + + /** + * 解密 + * @param content + * @return + * @throws Exception + */ + default String decrypt(String content) throws Exception{ + return content; + } + +} diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/dto/EncryptCredential.java b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/EncryptCredential.java new file mode 100644 index 00000000..58c71d82 --- /dev/null +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/EncryptCredential.java @@ -0,0 +1,58 @@ +package com.diboot.iam.dto; + +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.diboot.core.exception.BusinessException; +import com.diboot.core.handler.IEncryptorHandler; +import com.diboot.core.util.BeanUtils; +import com.diboot.core.util.JSON; +import com.diboot.core.util.V; +import com.diboot.core.vo.Status; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 加密认证 + * + * @author : uu + * @version : v1.0 + * @Date 2021/7/13 09:35 + */ +@Getter +@Setter +@Accessors(chain = true) +@Slf4j +public class EncryptCredential implements Serializable { + private static final long serialVersionUID = 8178800708883555475L; + + /** + * 密文 + */ + @NotNull(message = "认证信息不能为空") + private String ciphertext; + + /** + * 获取认证信息 + * + * @return + */ + public T getAuthCredential(IEncryptorHandler encryptorHandler, Class authCredentialCls) { + try { + String decryptContent = encryptorHandler.decrypt(ciphertext); + T result = (T) JSON.parseObject(decryptContent, authCredentialCls); + String errMsg = V.validateBean(result); + if (V.notEmpty(errMsg)) { + throw new BusinessException(Status.FAIL_INVALID_PARAM, errMsg); + } + return result; + } catch (Exception e) { + log.error("获取认证信息失败!", e); + throw new BusinessException(e.getMessage()); + } + } +} -- Gitee From f1287d621f64fccb066a90a257f3fc80515b6097 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 15 Jul 2021 14:37:46 +0800 Subject: [PATCH 55/83] =?UTF-8?q?*=20=E7=BB=93=E6=9E=9C=E7=BB=91=E5=AE=9A,?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/core/binding/binder/FieldBinder.java | 2 +- .../diboot/core/binding/binder/FieldListBinder.java | 4 ++-- .../diboot/core/binding/helper/ResultAssembler.java | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java index 6de92cff..94507cba 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldBinder.java @@ -219,10 +219,10 @@ public class FieldBinder extends BaseBinder { if(appendComma){ sb.append(Cons.SEPARATOR_COMMA); } + sb.append(fieldValue); if(appendComma == false){ appendComma = true; } - sb.append(fieldValue); } // 查找匹配Key return sb.toString(); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java index d8b4f7e1..425ab3e3 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/binder/FieldListBinder.java @@ -170,9 +170,9 @@ public class FieldListBinder extends FieldBinder { return; } StringBuilder sb = new StringBuilder(); - boolean appendComma = false; try{ for(E object : fromList){ + boolean appendComma = false; sb.setLength(0); for(Map.Entry entry :trunkObjColMapping.entrySet()){ String getterField = toAnnoObjField(entry.getKey()); @@ -180,10 +180,10 @@ public class FieldListBinder extends FieldBinder { if(appendComma){ sb.append(Cons.SEPARATOR_COMMA); } + sb.append(fieldValue); if(appendComma == false){ appendComma = true; } - sb.append(fieldValue); } // 查找匹配Key List entityList = valueMatchMap.get(sb.toString()); diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java index aa9318b9..a09a1a4b 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ResultAssembler.java @@ -82,9 +82,9 @@ public class ResultAssembler { return; } StringBuilder sb = new StringBuilder(); - boolean appendComma = false; try{ for(E object : fromList){ + boolean appendComma = false; sb.setLength(0); for(Map.Entry entry :trunkObjColMapping.entrySet()){ //转换为字段名 @@ -96,10 +96,10 @@ public class ResultAssembler { if(appendComma){ sb.append(Cons.SEPARATOR_COMMA); } + sb.append(fieldValue); if(appendComma == false){ appendComma = true; } - sb.append(fieldValue); } // 查找匹配Key String matchKey = sb.toString(); @@ -132,18 +132,18 @@ public class ResultAssembler { // 合并list为map Map resultMap = new HashMap<>(resultSetMapList.size()); StringBuilder sb = new StringBuilder(); - boolean appendComma = false; for(Map row : resultSetMapList){ + boolean appendComma = false; sb.setLength(0); for(Map.Entry entry : trunkObjColMapping.entrySet()){ Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); if(appendComma){ sb.append(Cons.SEPARATOR_COMMA); } + sb.append(S.valueOf(keyObj)); if(appendComma == false){ appendComma = true; } - sb.append(S.valueOf(keyObj)); } String matchKeys = sb.toString(); Object valueObj = row.containsKey(valueName)? row.get(valueName) : row.get(valueName.toUpperCase()); @@ -169,18 +169,18 @@ public class ResultAssembler { // 合并list为map Map resultMap = new HashMap<>(); StringBuilder sb = new StringBuilder(); - boolean appendComma = false; for(Map row : resultSetMapList){ + boolean appendComma = false; sb.setLength(0); for(Map.Entry entry : trunkObjColMapping.entrySet()){ Object keyObj = getValueIgnoreKeyCase(row, entry.getValue()); if(appendComma){ sb.append(Cons.SEPARATOR_COMMA); } + sb.append(S.valueOf(keyObj)); if(appendComma == false){ appendComma = true; } - sb.append(S.valueOf(keyObj)); } String matchKeys = sb.toString(); Object valueObj = row.containsKey(valueName)? row.get(valueName) : row.get(valueName.toUpperCase()); -- Gitee From f4096b4a1c78908d86a202e710ca3f05186dde86 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 15 Jul 2021 14:40:47 +0800 Subject: [PATCH 56/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/test/binder/entity/MyBaseEntity.java | 4 ---- .../java/diboot/core/test/query/TestJoinQuery.java | 2 +- diboot-core-starter/src/test/resources/init-mysql.sql | 10 ++++++++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/MyBaseEntity.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/MyBaseEntity.java index 44cf0cfd..d602552d 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/MyBaseEntity.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/entity/MyBaseEntity.java @@ -35,8 +35,4 @@ public abstract class MyBaseEntity implements Serializable { updateStrategy = FieldStrategy.NOT_NULL) private LocalDateTime updateTs; - - @Version - private Integer version; - } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java index b36f381b..59584131 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java @@ -79,7 +79,7 @@ public class TestJoinQuery { parentIds.add(10001L); queryWrapper = QueryBuilder.toQueryWrapper(departmentDTO); list = Binder.joinQueryList(queryWrapper, Department.class); - Assert.assertTrue(list.size() == 1); + Assert.assertTrue(list.size() > 0); } @Test diff --git a/diboot-core-starter/src/test/resources/init-mysql.sql b/diboot-core-starter/src/test/resources/init-mysql.sql index 74204d02..a7cd2f65 100644 --- a/diboot-core-starter/src/test/resources/init-mysql.sql +++ b/diboot-core-starter/src/test/resources/init-mysql.sql @@ -85,6 +85,8 @@ create table cc_city_info CREATE TABLE `db_goods_goods_info` ( `goods_id` bigint DEFAULT NULL, `goods_nm` varchar(10) DEFAULT NULL, + `create_ts` timestamp default CURRENT_TIMESTAMP null, + `update_ts` timestamp null, `is_del` tinyint DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -92,13 +94,17 @@ CREATE TABLE `db_purchase_rel_plan_goods` ( `rel_id` bigint DEFAULT NULL, `purchase_form_plan_id` bigint DEFAULT NULL, `goods_id` bigint DEFAULT NULL, + `create_ts` timestamp default CURRENT_TIMESTAMP null, + `update_ts` timestamp null, `is_del` tinyint DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `db_purchase_form_plan` ( `purchase_form_plan_id` bigint DEFAULT NULL, `name` varchar(100) DEFAULT NULL, - `is_del` tinyint DEFAULT '0' + `is_del` tinyint DEFAULT '0', + `create_ts` timestamp default CURRENT_TIMESTAMP null, + `update_ts` timestamp null ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 初始化样例数据 @@ -112,4 +118,4 @@ INSERT INTO user_role (user_type, user_id, role_id) VALUES ('SysUser', 1001, 101 INSERT INTO cc_city_info (id, parent_id, region_id, region_name) VALUES (10000, 0, 10000, '江苏省'), (10010, 10000, 10010, '苏州市'), (10020, 10010, 10020, '园区'); INSERT INTO db_goods_goods_info (goods_id, goods_nm, is_del) VALUES(1001, 'abcde', 0), (1002, 'abcd', 0); INSERT INTO db_purchase_rel_plan_goods(rel_id, purchase_form_plan_id, goods_id, is_del)VALUES(1, 1, 1001, 0), (2, 1, 1002, 0); -INSERT INTO db_purchase_form_plan(plan_id, name, is_del)VALUES(1, '5月份采购计划', 0); +INSERT INTO db_purchase_form_plan(purchase_form_plan_id, name, is_del)VALUES(1, '5月份采购计划', 0); -- Gitee From 28e2824aa79926a605727312ca66532ad7d0d951 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 16 Jul 2021 10:20:32 +0800 Subject: [PATCH 57/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96select=E5=AD=97?= =?UTF-8?q?=E6=AE=B5as=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/binding/helper/ServiceAdaptor.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index 2fb79a5d..adec70cc 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -152,9 +152,19 @@ public class ServiceAdaptor { for(TableFieldInfo col : allColumns){ if(fieldsMap.containsKey(col.getField().getName()) && V.notEmpty(col.getColumn())){ - columns.add(col.getColumn()); + String fieldName = col.getField().getName(); + if(V.equals(fieldName, col.getColumn()) || V.equals(fieldName, S.toLowerCaseCamel(col.getColumn()))){ + columns.add(col.getColumn()); + } + else{ + columns.add(col.getColumn() + " AS "+fieldName); + } } } + // select全部列,不特殊处理 + if(allColumns.size() == columns.size()){ + return queryWrapper; + } return ((QueryWrapper)queryWrapper).select(S.toStringArray(columns)); } -- Gitee From de3e58515fb56aa41d0a5c938f074e5082a26f4e Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 16 Jul 2021 10:21:14 +0800 Subject: [PATCH 58/83] =?UTF-8?q?+=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - .../src/test/resources/application.properties | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 diboot-core-starter/src/test/resources/application.properties diff --git a/.gitignore b/.gitignore index 2a223764..3f6cead8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # Ignore Gradle project-specific cache directory .gradle *.iml -application.properties application-*.properties .DS_Store diff --git a/diboot-core-starter/src/test/resources/application.properties b/diboot-core-starter/src/test/resources/application.properties new file mode 100644 index 00000000..a030edc6 --- /dev/null +++ b/diboot-core-starter/src/test/resources/application.properties @@ -0,0 +1,21 @@ +server.port=8080 +server.servlet.context-path=/api + +#datasource config +spring.datasource.url=jdbc:mysql://localhost:3306/playground?characterEncoding=utf8&serverTimezone=GMT%2B8 +spring.datasource.username=diboot +spring.datasource.password=123456 +spring.datasource.hikari.maximum-pool-size=5 +spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.main.allow-bean-definition-overriding=true + +mybatis-plus.global-config.mapper-locations=classpath*:mapper/*Mapper.xml +mybatis-plus.global-config.db-config.logic-delete-value=1 +mybatis-plus.global-config.db-config.logic-not-delete-value=0 + +logging.level.root=DEBUG +logging.level.org.apache=info +logging.level.org.hibernate.validator=info +logging.level.org.springframework=info +logging.level.com.zaxxer.hikari=info \ No newline at end of file -- Gitee From 9604a29e40a92795dd8a81b7ed06ae2d771b6440 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 16 Jul 2021 10:21:46 +0800 Subject: [PATCH 59/83] =?UTF-8?q?+=20=E4=BC=98=E5=8C=96lombok=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/diboot/core/test/binder/dto/DepartmentDTO.java | 5 +++++ .../src/test/java/diboot/core/test/binder/dto/UserDTO.java | 6 +++++- .../test/java/diboot/core/test/query/TestJoinQuery.java | 1 + .../main/java/com/diboot/file/starter/FileProperties.java | 6 +++++- .../main/java/com/diboot/iam/dto/IamPositionFormDTO.java | 7 ++++++- .../java/com/diboot/iam/dto/IamUserPositionBatchDTO.java | 7 ++++++- .../src/main/java/com/diboot/iam/vo/IamAccountVO.java | 7 ++++++- .../src/main/java/com/diboot/iam/vo/IamLoginTraceVO.java | 7 ++++++- .../src/main/java/com/diboot/iam/vo/IamRoleVO.java | 7 ++++++- .../src/main/java/com/diboot/iam/vo/IamUserVO.java | 7 ++++++- 10 files changed, 52 insertions(+), 8 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java index e90e8976..be0c98a0 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/DepartmentDTO.java @@ -15,6 +15,7 @@ */ package diboot.core.test.binder.dto; +import com.baomidou.mybatisplus.annotation.TableField; import com.diboot.core.binding.data.CheckpointType; import com.diboot.core.binding.data.DataAccessCheckpoint; import com.diboot.core.binding.query.BindQuery; @@ -69,6 +70,10 @@ public class DepartmentDTO implements Serializable { @BindQuery(field = "parent_id", comparison = Comparison.IN) private List parentIds; + @BindQuery(comparison = Comparison.LIKE) + @TableField("`character`") + private String character; + public Date getCreateTimeEnd(){ return D.nextDay(createTime); } diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java index 570f692a..5cb77e15 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/dto/UserDTO.java @@ -23,6 +23,9 @@ import diboot.core.test.binder.entity.Organization; import diboot.core.test.binder.entity.Role; import diboot.core.test.binder.entity.User; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -32,7 +35,8 @@ import java.util.List; * @version v2.0 * @date 2018/12/27 */ -@Data +@Getter +@Setter public class UserDTO extends User { // 字段关联 diff --git a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java index 59584131..29ea1103 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/query/TestJoinQuery.java @@ -61,6 +61,7 @@ public class TestJoinQuery { Department example = departmentService.list(null).get(0); DepartmentDTO departmentDTO = new DepartmentDTO(); departmentDTO.setCreateTime(example.getCreateTime()); + departmentDTO.setCharacter(example.getCharacter()); QueryWrapper queryWrapper = QueryBuilder.toQueryWrapper(departmentDTO); List list = departmentService.list(queryWrapper); Assert.assertTrue(list.size() >= 1); diff --git a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java index 848e10ca..ea78e9da 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java @@ -16,12 +16,16 @@ package com.diboot.file.starter; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @author diboot */ -@Data +@Getter +@Setter @ConfigurationProperties(prefix = "diboot.component.file") public class FileProperties { diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamPositionFormDTO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamPositionFormDTO.java index 22ffe995..23f4ea64 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamPositionFormDTO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamPositionFormDTO.java @@ -17,6 +17,9 @@ package com.diboot.iam.dto; import com.diboot.iam.entity.IamPosition; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -26,7 +29,9 @@ import java.util.List; * @version v2.2 * @date 2020/12/1 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamPositionFormDTO extends IamPosition { private static final long serialVersionUID = -2721951760052373607L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamUserPositionBatchDTO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamUserPositionBatchDTO.java index c9764ff3..0d302f24 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamUserPositionBatchDTO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/dto/IamUserPositionBatchDTO.java @@ -17,6 +17,9 @@ package com.diboot.iam.dto; import com.diboot.iam.entity.IamUserPosition; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -26,7 +29,9 @@ import java.util.List; * @version v2.2 * @date 2020/12/1 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamUserPositionBatchDTO extends IamUserPosition { private static final long serialVersionUID = 5531280576807490425L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamAccountVO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamAccountVO.java index fbe35c16..e8aad711 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamAccountVO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamAccountVO.java @@ -17,6 +17,9 @@ package com.diboot.iam.vo; import com.diboot.iam.entity.IamAccount; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; /** * 认证用户 VO定义 @@ -24,7 +27,9 @@ import lombok.Data; * @version 2.0 * @date 2019-12-03 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamAccountVO extends IamAccount { private static final long serialVersionUID = -6502855671661095919L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamLoginTraceVO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamLoginTraceVO.java index b2398e48..2d009783 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamLoginTraceVO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamLoginTraceVO.java @@ -18,6 +18,9 @@ package com.diboot.iam.vo; import com.diboot.core.binding.annotation.BindDict; import com.diboot.iam.entity.IamLoginTrace; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; /** * 登录记录 VO定义 @@ -25,7 +28,9 @@ import lombok.Data; * @version 2.0 * @date 2019-12-17 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamLoginTraceVO extends IamLoginTrace { private static final long serialVersionUID = -753084580143028183L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamRoleVO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamRoleVO.java index f7d050c1..425a5198 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamRoleVO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamRoleVO.java @@ -21,6 +21,9 @@ import com.diboot.iam.config.Cons; import com.diboot.iam.entity.IamResourcePermission; import com.diboot.iam.entity.IamRole; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -30,7 +33,9 @@ import java.util.List; * @version 2.0 * @date 2019-12-03 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamRoleVO extends IamRole { private static final long serialVersionUID = -6778550575399070076L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamUserVO.java b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamUserVO.java index a3e39166..cf378a8b 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamUserVO.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/vo/IamUserVO.java @@ -22,6 +22,9 @@ import com.diboot.iam.entity.IamOrg; import com.diboot.iam.entity.IamRole; import com.diboot.iam.entity.IamUser; import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -31,7 +34,9 @@ import java.util.List; * @version 2.0 * @date 2019-12-17 */ -@Data +@Getter +@Setter +@Accessors(chain = true) public class IamUserVO extends IamUser { private static final long serialVersionUID = 7571698765478647277L; -- Gitee From 9885abe3ce974e5315bdda6ae1c1e5a1837814d1 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Fri, 16 Jul 2021 17:11:09 +0800 Subject: [PATCH 60/83] =?UTF-8?q?*=20select=E5=AD=97=E6=AE=B5=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E6=83=85=E5=86=B5=E4=B8=8B=E7=9A=84AS=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/binding/helper/ServiceAdaptor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index adec70cc..fd8d106b 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -153,7 +153,10 @@ public class ServiceAdaptor { if(fieldsMap.containsKey(col.getField().getName()) && V.notEmpty(col.getColumn())){ String fieldName = col.getField().getName(); - if(V.equals(fieldName, col.getColumn()) || V.equals(fieldName, S.toLowerCaseCamel(col.getColumn()))){ + String colCamelName = S.toLowerCaseCamel(col.getColumn()); + if(V.equals(fieldName, col.getColumn()) + || fieldName.equals(colCamelName) + || (colCamelName.endsWith(Cons.SEPARATOR_UNDERSCORE) && S.substringBeforeLast(colCamelName, Cons.SEPARATOR_UNDERSCORE).equals(fieldName))){ columns.add(col.getColumn()); } else{ -- Gitee From e92c5609754ea2edfae65aae8cf58a8fd4fc3b5a Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Mon, 19 Jul 2021 18:29:13 +0800 Subject: [PATCH 61/83] =?UTF-8?q?+=20=E6=9D=83=E9=99=90=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=97=B6=E6=97=A0=E6=95=88token=E5=BC=82=E5=B8=B8=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/exception/BusinessException.java | 2 -- .../java/com/diboot/iam/auth/impl/IamCustomizeImpl.java | 5 +++++ .../java/com/diboot/iam/exception/PermissionException.java | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java b/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java index 52b798ca..78857d85 100644 --- a/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java +++ b/diboot-core/src/main/java/com/diboot/core/exception/BusinessException.java @@ -31,8 +31,6 @@ public class BusinessException extends RuntimeException { private Integer code; - private String msg; - /** * 错误的状态 */ diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/IamCustomizeImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/IamCustomizeImpl.java index 6d9fe2e2..e1135410 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/IamCustomizeImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/IamCustomizeImpl.java @@ -16,12 +16,14 @@ package com.diboot.iam.auth.impl; import com.diboot.core.util.AnnotationUtils; +import com.diboot.core.vo.Status; import com.diboot.iam.auth.IamCustomize; import com.diboot.iam.entity.BaseLoginUser; import com.diboot.iam.entity.IamAccount; import com.diboot.iam.exception.PermissionException; import com.diboot.iam.starter.IamProperties; import com.diboot.iam.util.IamSecurityUtils; +import org.apache.shiro.authz.UnauthenticatedException; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -63,6 +65,9 @@ public class IamCustomizeImpl implements IamCustomize { try{ IamSecurityUtils.getSubject().checkPermission(permissionCode); } + catch (UnauthenticatedException e){ + throw new PermissionException(Status.FAIL_INVALID_TOKEN, e); + } catch (Exception e){ throw new PermissionException(e); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/exception/PermissionException.java b/diboot-iam-starter/src/main/java/com/diboot/iam/exception/PermissionException.java index a5d3e834..cd41d645 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/exception/PermissionException.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/exception/PermissionException.java @@ -30,8 +30,12 @@ public class PermissionException extends BusinessException { super(Status.FAIL_NO_PERMISSION); } + public PermissionException(Status status,Throwable ex) { + super(status,ex); + } + public PermissionException(Throwable ex) { - super(Status.FAIL_NO_PERMISSION, ex); + this(Status.FAIL_NO_PERMISSION, ex); } public PermissionException(String msg) { -- Gitee From ea2e6a0be95e3faef8118a039d893de66b059417 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Tue, 20 Jul 2021 00:03:22 +0800 Subject: [PATCH 62/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96select=E5=AD=97?= =?UTF-8?q?=E6=AE=B5as=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/binding/helper/ServiceAdaptor.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java index fd8d106b..b4c09222 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/helper/ServiceAdaptor.java @@ -150,18 +150,8 @@ public class ServiceAdaptor { } Map fieldsMap = BindingCacheManager.getFieldsMap(voClass); for(TableFieldInfo col : allColumns){ - if(fieldsMap.containsKey(col.getField().getName()) - && V.notEmpty(col.getColumn())){ - String fieldName = col.getField().getName(); - String colCamelName = S.toLowerCaseCamel(col.getColumn()); - if(V.equals(fieldName, col.getColumn()) - || fieldName.equals(colCamelName) - || (colCamelName.endsWith(Cons.SEPARATOR_UNDERSCORE) && S.substringBeforeLast(colCamelName, Cons.SEPARATOR_UNDERSCORE).equals(fieldName))){ - columns.add(col.getColumn()); - } - else{ - columns.add(col.getColumn() + " AS "+fieldName); - } + if(fieldsMap.containsKey(col.getField().getName()) && V.notEmpty(col.getColumn())){ + columns.add(col.getSqlSelect()); } } // select全部列,不特殊处理 -- Gitee From 5b12eec4956573a165790e1b0c7804e54a4ae554 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Tue, 20 Jul 2021 09:50:11 +0800 Subject: [PATCH 63/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=9F=A5=E8=AF=A2sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/diboot/iam/mapper/IamUserMapper.java | 2 +- .../java/com/diboot/iam/service/impl/IamUserServiceImpl.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index dc4ef293..dd1dd24b 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -38,7 +38,7 @@ public interface IamUserMapper extends BaseCrudMapper { * @param queryWrapper * @return */ - @Select("SELECT u.* FROM iam_user u LEFT JOIN iam_org o ON u.org_id=o.id ${ew.customSqlSegment} ORDER BY o.depth ASC, o.sort_id DESC, o.id DESC, u.id DESC") + @Select("SELECT u.* FROM iam_user u LEFT JOIN iam_org o ON u.org_id=o.id AND o.is_deleted = 0 ${ew.customSqlSegment} ORDER BY o.depth ASC, o.sort_id DESC, o.id DESC, u.id DESC") IPage selectPageSortByOrg(IPage page, @Param("ew") Wrapper queryWrapper); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java index 5bbe7684..611d572e 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java @@ -80,7 +80,6 @@ public class IamUserServiceImpl extends BaseIamServiceImpl page = convertToIPage(queryWrapper, pagination); page = super.getBaseMapper().selectPageSortByOrg(page, queryWrapper); // 如果重新执行了count进行查询,则更新pagination中的总数 -- Gitee From 81aac5fdc7b271b17718121b3bc2b9a9b3b27fdf Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 20 Jul 2021 13:16:05 +0800 Subject: [PATCH 64/83] =?UTF-8?q?*=20Shiro=E9=80=80=E5=87=BA=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/starter/RedisAutoConfig.java | 6 ++ diboot-iam-starter/pom.xml | 7 ++ .../com/diboot/iam/entity/BaseLoginUser.java | 18 +++++ .../java/com/diboot/iam/jwt/BaseJwtRealm.java | 1 + .../diboot/iam/jwt/DefaultJwtAuthFilter.java | 7 +- .../iam/jwt/StatelessJwtAuthFilter.java | 2 +- .../com/diboot/iam/redis/ShiroRedisCache.java | 81 +++++++++++++++++++ .../iam/redis/ShiroRedisCacheManager.java | 47 +++++++++++ .../com/diboot/iam/starter/IamAutoConfig.java | 8 +- .../com/diboot/iam/util/IamSecurityUtils.java | 4 +- 10 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java create mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java diff --git a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java index 13cef8a8..a2d5a38f 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java @@ -16,8 +16,10 @@ package com.diboot.core.starter; import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -55,8 +57,12 @@ public class RedisAutoConfig { Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); + // 不显示为null的字段 + om.setSerializationInclusion(JsonInclude.Include.NON_NULL); + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + jackson2JsonRedisSerializer.setObjectMapper(om); // 用Jackson2JsonRedisSerializer 序列化和反序列化value值 diff --git a/diboot-iam-starter/pom.xml b/diboot-iam-starter/pom.xml index f30f1f6d..b0fb79ba 100644 --- a/diboot-iam-starter/pom.xml +++ b/diboot-iam-starter/pom.xml @@ -46,6 +46,13 @@ 1.9.6 + + + org.springframework.boot + spring-boot-starter-data-redis + provided + + org.springframework.boot diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/entity/BaseLoginUser.java b/diboot-iam-starter/src/main/java/com/diboot/iam/entity/BaseLoginUser.java index 923cd5a5..79cab470 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/entity/BaseLoginUser.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/entity/BaseLoginUser.java @@ -18,6 +18,7 @@ package com.diboot.iam.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.diboot.core.entity.BaseEntity; import com.diboot.core.vo.KeyValue; +import com.fasterxml.jackson.annotation.JsonIgnore; /** * 可登录用户Base类定义 @@ -39,6 +40,13 @@ public abstract class BaseLoginUser extends BaseEntity { */ public abstract String getUserType(); + /** + * 附加对象,当前auth-token + */ + @JsonIgnore + @TableField(exist = false) + private String authToken; + /** * 附加对象,用于岗位等扩展 */ @@ -52,4 +60,14 @@ public abstract class BaseLoginUser extends BaseEntity { this.extentionObj = extentionObj; } + public String getAuthToken(){ + return this.authToken; + } + public void setAuthToken(String authToken){ + this.authToken = authToken; + } + + public String toString(){ + return this.authToken; + } } \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtRealm.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtRealm.java index 020af3e9..2f191770 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtRealm.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtRealm.java @@ -104,6 +104,7 @@ public class BaseJwtRealm extends AuthorizingRealm { if(loginUser == null){ throw new AuthenticationException("用户不存在"); } + loginUser.setAuthToken(jwtToken.getAuthtoken()); IamExtensible iamExtensible = getIamUserRoleService().getIamExtensible(); if(iamExtensible != null){ KeyValue extentionObj = iamExtensible.getUserExtentionObj(jwtToken.getUserTypeClass().getSimpleName(), account.getUserId(), jwtToken.getExtObj()); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java index 7e6a54de..73533d44 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java @@ -56,7 +56,7 @@ public class DefaultJwtAuthFilter extends BasicHttpAuthenticationFilter { } //解密是否成功 if(V.notEmpty(claims.getSubject())){ - log.debug("Token验证成功!account={}", claims.getSubject()); + log.debug("Token验证成功!account={}, url={}", claims.getSubject(), httpRequest.getRequestURI()); // 如果临近过期,则生成新的token返回 String refreshToken = JwtUtils.generateNewTokenIfRequired(claims); if(refreshToken != null){ @@ -65,7 +65,7 @@ public class DefaultJwtAuthFilter extends BasicHttpAuthenticationFilter { } return true; } - log.debug("Token验证失败!url=" + httpRequest.getRequestURL()); + log.debug("Token验证失败!url=" + httpRequest.getRequestURI()); return false; } @@ -75,7 +75,8 @@ public class DefaultJwtAuthFilter extends BasicHttpAuthenticationFilter { */ @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { - log.debug("Token认证失败: onAccessDenied"); + HttpServletRequest httpRequest = (HttpServletRequest) request; + log.debug("Token认证失败: onAccessDenied。url={}", httpRequest.getRequestURI()); JsonResult jsonResult = new JsonResult(Status.FAIL_INVALID_TOKEN); this.responseJson((HttpServletResponse) response, jsonResult); return false; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java index e1428316..b8e66587 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java @@ -46,7 +46,7 @@ import java.io.PrintWriter; * @Date 2020/11/19 10:46 */ @Slf4j -@Getter@Setter +@Getter @Setter public class StatelessJwtAuthFilter extends BasicHttpAuthenticationFilter { /** diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java new file mode 100644 index 00000000..372b30fe --- /dev/null +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2015-2021, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.iam.redis; + +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Collection; +import java.util.Set; + +/** + * RedisCache缓存定义 + * + * @author : uu + * @version : v1.0 + * @Date 2021/6/8 18:36 + * Copyright © diboot.com + */ +public class ShiroRedisCache implements Cache { + private static final Logger log = LoggerFactory.getLogger(ShiroRedisCache.class); + + private RedisTemplate redisTemplate; + private String cacheName; + + public ShiroRedisCache(String cacheName, RedisTemplate redisTemplate) { + this.cacheName = cacheName; + this.redisTemplate = redisTemplate; + } + + @Override + public V get(K k) throws CacheException { + return (V)redisTemplate.opsForHash().get(cacheName, k.toString()); + } + + @Override + public V put(K k , V v) throws CacheException { + redisTemplate.opsForHash().put(cacheName, k.toString(), v); + return v; + } + + @Override + public V remove(K k) throws CacheException { + return (V)redisTemplate.opsForHash().delete(cacheName, k.toString()); + } + + @Override + public void clear() throws CacheException { + redisTemplate.delete(cacheName); + } + + @Override + public int size() { + return redisTemplate.opsForHash().size(cacheName).intValue(); + } + + @Override + public Set keys() { + return redisTemplate.opsForHash().keys(cacheName); + } + + @Override + public Collection values() { + return redisTemplate.opsForHash().values(cacheName); + } +} diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java new file mode 100644 index 00000000..480c3a1f --- /dev/null +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015-2021, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.iam.redis; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.cache.AbstractCacheManager; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheException; +import org.springframework.data.redis.core.RedisTemplate; + +/** + * ShiroRedisCacheManager + * + * @author : uu + * @version : v1.0 + * @Date 2021/6/8 18:36 + * Copyright © diboot.com + */ +@Slf4j +public class ShiroRedisCacheManager extends AbstractCacheManager { + + private RedisTemplate redisTemplate; + + public ShiroRedisCacheManager(RedisTemplate redisTemplate){ + this.redisTemplate = redisTemplate; + } + + @Override + protected Cache createCache(String cacheName) throws CacheException { + log.debug("init cache: {}", cacheName); + return new ShiroRedisCache(cacheName, redisTemplate); + } + +} diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java index 3798898d..a81683f8 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java @@ -75,6 +75,13 @@ public class IamAutoConfig { public CacheManager shiroCacheManager() { return new MemoryConstrainedCacheManager(); } + /** + * 启用RedisCacheManager 定义示例 + * @return + @Bean(name = "shiroCacheManager") + public CacheManager shiroCacheManager(RedisTemplate redisTemplate) { + return new ShiroRedisCacheManager(redisTemplate); + }*/ @Bean @DependsOn({"shiroCacheManager"}) @@ -166,7 +173,6 @@ public class IamAutoConfig { } } filterChainMap.put("/login", "authc"); - filterChainMap.put("/logout", "logout"); if (allAnon && iamProperties.isEnablePermissionCheck() == false) { filterChainMap.put("/**", "anon"); } else { diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamSecurityUtils.java b/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamSecurityUtils.java index c689a52f..4e70378a 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamSecurityUtils.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamSecurityUtils.java @@ -106,9 +106,7 @@ public class IamSecurityUtils extends SecurityUtils { if(baseJwtRealm != null){ Cache cache = baseJwtRealm.getAuthorizationCache(); if(cache != null) { - for(Object key : cache.keys()) { - cache.remove(key); - } + cache.clear(); log.debug("已清空全部登录用户的权限缓存,以便新权限生效."); } } -- Gitee From edce16b85f38a0aa6c64238070ab76ef1cc24c68 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 20 Jul 2021 13:43:16 +0800 Subject: [PATCH 65/83] =?UTF-8?q?+=20redis=20CacheManager=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/iam/starter/IamAutoConfig.java | 9 +-- .../iam/starter/IamRedisAutoConfig.java | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java index a81683f8..1f4af580 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java @@ -43,6 +43,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; +import org.springframework.core.annotation.Order; import javax.servlet.Filter; import java.util.LinkedHashMap; @@ -56,6 +57,7 @@ import java.util.Map; * @Date 2019-10-11 10:54 */ @Slf4j +@Order(922) @Configuration @EnableConfigurationProperties({IamProperties.class}) @ComponentScan(basePackages = {"com.diboot.iam"}) @@ -75,13 +77,6 @@ public class IamAutoConfig { public CacheManager shiroCacheManager() { return new MemoryConstrainedCacheManager(); } - /** - * 启用RedisCacheManager 定义示例 - * @return - @Bean(name = "shiroCacheManager") - public CacheManager shiroCacheManager(RedisTemplate redisTemplate) { - return new ShiroRedisCacheManager(redisTemplate); - }*/ @Bean @DependsOn({"shiroCacheManager"}) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java new file mode 100644 index 00000000..8372fcfa --- /dev/null +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015-2021, www.dibo.ltd (service@dibo.ltd). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.diboot.iam.starter; + +import com.diboot.iam.redis.ShiroRedisCacheManager; +import org.apache.shiro.cache.CacheManager; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.core.RedisTemplate; + +/** + * Shiro の Redis 缓存自动配置 + * + * @author wind + * @version v2.3.0 + * @date 2021/7/20 + * Copyright © diboot.com + */ +@Order(921) +@Configuration +@ConditionalOnBean(RedisTemplate.class) +@ConditionalOnClass(RedisOperations.class) +@ConditionalOnResource(resources = "org/springframework/data/redis") +public class IamRedisAutoConfig { + + /** + * 启用RedisCacheManager定义 + * @return + */ + @Bean(name = "shiroCacheManager") + @ConditionalOnMissingBean + public CacheManager shiroCacheManager(RedisTemplate redisTemplate) { + return new ShiroRedisCacheManager(redisTemplate); + } + +} \ No newline at end of file -- Gitee From bee4a9dace65f3812efb5733a50f1a5385ca7541 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 20 Jul 2021 14:17:34 +0800 Subject: [PATCH 66/83] =?UTF-8?q?*=20=E6=9B=B4=E6=96=B0=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/META-INF/sql/init-iam-mysql.sql | 4 ++-- .../src/main/resources/META-INF/sql/init-iam-oracle.sql | 4 ++-- .../src/main/resources/META-INF/sql/init-iam-postgresql.sql | 4 ++-- .../src/main/resources/META-INF/sql/init-iam-sqlserver.sql | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-mysql.sql b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-mysql.sql index ca40d219..f6e5a136 100644 --- a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-mysql.sql +++ b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-mysql.sql @@ -18,7 +18,7 @@ create table iam_user -- 索引 create index idx_iam_user_1 on iam_user (org_id); create index idx_iam_user_2 on iam_user (mobile_phone); -create unique index uidx_iam_user on iam_user (tenant_id, user_num); +create unique index uidx_iam_user on iam_user (tenant_id, user_num, is_deleted); create index idx_iam_user_tenant on iam_user (tenant_id); -- 账号表 @@ -37,7 +37,7 @@ create table iam_account create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间' ) AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8 COMMENT '登录账号'; -- 创建索引 -create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type); +create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type, is_deleted); create index idx_iam_account_tenant on iam_account (tenant_id); -- 角色表 diff --git a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-oracle.sql b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-oracle.sql index 2b2f21d1..5146314d 100644 --- a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-oracle.sql +++ b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-oracle.sql @@ -34,7 +34,7 @@ comment on table ${SCHEMA}.iam_user is '系统用户'; -- 索引 create index idx_iam_user_1 on ${SCHEMA}.iam_user (org_id); create index idx_iam_user_2 on ${SCHEMA}.iam_user (mobile_phone); -create unique index uidx_iam_user on ${SCHEMA}.iam_user (tenant_id, user_num); +create unique index uidx_iam_user on ${SCHEMA}.iam_user (tenant_id, user_num, is_deleted); create index idx_iam_user_tenant on ${SCHEMA}.iam_user (tenant_id); -- 账号表 @@ -66,7 +66,7 @@ comment on column ${SCHEMA}.iam_account.is_deleted is '是否删除'; comment on column ${SCHEMA}.iam_account.create_time is '创建时间'; comment on table ${SCHEMA}.iam_account is '登录账号'; -- 创建索引 -create unique index idx_iam_account on ${SCHEMA}.iam_account(tenant_id, auth_account, auth_type, user_type); +create unique index idx_iam_account on ${SCHEMA}.iam_account(tenant_id, auth_account, auth_type, user_type, is_deleted); create index idx_iam_account_tenant on ${SCHEMA}.iam_account (tenant_id); -- 角色表 diff --git a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-postgresql.sql b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-postgresql.sql index 0f71c36f..4cdbaff7 100644 --- a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-postgresql.sql +++ b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-postgresql.sql @@ -33,7 +33,7 @@ comment on table iam_user is '系统用户'; -- 索引 create index idx_iam_user_1 on iam_user (org_id); create index idx_iam_user_2 on iam_user (mobile_phone); -create unique index uidx_iam_user on iam_user (tenant_id, user_num); +create unique index uidx_iam_user on iam_user (tenant_id, user_num, is_deleted); create index idx_iam_user_tenant on iam_user(tenant_id); -- 账号表 @@ -64,7 +64,7 @@ comment on column iam_account.is_deleted is '是否删除'; comment on column iam_account.create_time is '创建时间'; comment on table iam_account is '登录账号'; -- 创建索引 -create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type); +create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type, is_deleted); create index idx_iam_account_tenant on iam_account(tenant_id); -- 角色表 diff --git a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-sqlserver.sql b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-sqlserver.sql index ba6c6579..635e08f4 100644 --- a/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-sqlserver.sql +++ b/diboot-iam-starter/src/main/resources/META-INF/sql/init-iam-sqlserver.sql @@ -34,7 +34,7 @@ execute sp_addextendedproperty 'MS_Description', N'系统用户', 'SCHEMA', '${S -- 索引 create nonclustered index idx_iam_user_1 on iam_user (org_id); create nonclustered index idx_iam_user_2 on iam_user (mobile_phone); -create unique index uidx_iam_user on iam_user (tenant_id, user_num); +create unique index uidx_iam_user on iam_user (tenant_id, user_num, is_deleted); create nonclustered index idx_iam_user_tenant on iam_user(tenant_id); -- 账号表 @@ -66,7 +66,7 @@ execute sp_addextendedproperty 'MS_Description', N'是否删除', 'SCHEMA', '${S execute sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', '${SCHEMA}', 'table', iam_account, 'column', 'create_time'; execute sp_addextendedproperty 'MS_Description', N'登录账号', 'SCHEMA', '${SCHEMA}', 'table', iam_account, null, null; -- 创建索引 -create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type); +create unique index idx_iam_account on iam_account(tenant_id, auth_account, auth_type, user_type, is_deleted); create nonclustered index idx_iam_account_tenant on iam_account(tenant_id); -- 角色表 -- Gitee From de63ec1c4cb7c20aef7ba1f53a090a434bd338ae Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Tue, 20 Jul 2021 15:25:16 +0800 Subject: [PATCH 67/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= =?UTF-8?q?-=E5=8C=BF=E5=90=8D=E7=9A=84url=E7=9A=84=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=EF=BC=8C=E6=94=B9=E4=B8=BASet=E6=8E=A5?= =?UTF-8?q?=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/diboot/iam/starter/IamAutoConfig.java | 7 ++++--- .../main/java/com/diboot/iam/starter/IamProperties.java | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java index 1f4af580..404adf8b 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java @@ -48,6 +48,7 @@ import org.springframework.core.annotation.Order; import javax.servlet.Filter; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; /** * IAM自动配置类 @@ -158,9 +159,9 @@ public class IamAutoConfig { filterChainMap.put("/uploadFile/download/*/image", "anon"); boolean allAnon = false; - String anonUrls = iamProperties.getAnonUrls(); + Set anonUrls = iamProperties.getAnonUrls(); if (V.notEmpty(anonUrls)) { - for (String url : anonUrls.split(Cons.SEPARATOR_COMMA)) { + for (String url : anonUrls) { filterChainMap.put(url, "anon"); if (url.equals("/**")) { allAnon = true; @@ -168,7 +169,7 @@ public class IamAutoConfig { } } filterChainMap.put("/login", "authc"); - if (allAnon && iamProperties.isEnablePermissionCheck() == false) { + if (allAnon && !iamProperties.isEnablePermissionCheck()) { filterChainMap.put("/**", "anon"); } else { filterChainMap.put("/**", "jwt"); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java index a4198b0a..4dfd943f 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java @@ -19,6 +19,8 @@ import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.Set; + /** * 认证相关的配置参数 * @author mazc@dibo.ltd @@ -51,7 +53,7 @@ public class IamProperties { /** * 匿名的url,以,逗号分隔 */ - private String anonUrls; + private Set anonUrls; /** * 是否初始化SQL */ -- Gitee From ec1b9a7f96872345a76e30db1bc4826f8006f070 Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Wed, 21 Jul 2021 10:15:55 +0800 Subject: [PATCH 68/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96BaseCrudRestControl?= =?UTF-8?q?ler=E6=B3=9B=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/controller/BaseCrudRestController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java index f7ca3623..fc5b8343 100644 --- a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java +++ b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java @@ -303,7 +303,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected String beforeCreate(Object entityOrDto) throws Exception { + protected String beforeCreate(E entityOrDto) throws Exception { return null; } @@ -312,7 +312,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected void afterCreated(Object entityOrDto) throws Exception { + protected void afterCreated(E entityOrDto) throws Exception { } /*** @@ -320,7 +320,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected String beforeUpdate(Object entityOrDto) throws Exception { + protected String beforeUpdate(E entityOrDto) throws Exception { return null; } @@ -329,7 +329,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected void afterUpdated(Object entityOrDto) throws Exception { + protected void afterUpdated(E entityOrDto) throws Exception { } /*** @@ -337,7 +337,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected String beforeDelete(Object entityOrDto) throws Exception{ + protected String beforeDelete(E entityOrDto) throws Exception{ return null; } @@ -346,7 +346,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @return */ - protected void afterDeleted(Object entityOrDto) throws Exception { + protected void afterDeleted(E entityOrDto) throws Exception { } /*** @@ -354,7 +354,7 @@ public class BaseCrudRestController extends BaseContro * @param entityOrDto * @throws Exception */ - protected void afterDeletedCanceled(Object entityOrDto) throws Exception { + protected void afterDeletedCanceled(E entityOrDto) throws Exception { } /*** -- Gitee From 3c1a3b4fda146ce5f8ad0a12b8bde2027208a733 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 21 Jul 2021 19:06:46 +0800 Subject: [PATCH 69/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96redis=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/starter/RedisAutoConfig.java | 20 +- .../iam/auth/impl/PwdAuthServiceImpl.java | 10 +- .../iam/auth/impl/SSOAuthServiceImpl.java | 6 +- .../com/diboot/iam/cache/IamCacheManager.java | 3 +- .../main/java/com/diboot/iam/config/Cons.java | 4 + .../com/diboot/iam/jwt/BaseJwtAuthToken.java | 2 +- .../diboot/iam/jwt/DefaultJwtAuthFilter.java | 1 + .../com/diboot/iam/redis/ShiroRedisCache.java | 50 ++- .../iam/redis/ShiroRedisCacheManager.java | 8 +- .../iam/starter/IamRedisAutoConfig.java | 9 +- .../java/com/diboot/iam/util/IamHelper.java | 4 +- .../java/com/diboot/iam/util/JwtUtils.java | 11 + .../subject/SimplePrincipalCollection.java | 302 ++++++++++++++++++ 13 files changed, 394 insertions(+), 36 deletions(-) create mode 100644 diboot-iam-starter/src/main/java/org/apache/shiro/subject/SimplePrincipalCollection.java diff --git a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java index a2d5a38f..257995c4 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java @@ -15,13 +15,13 @@ */ package com.diboot.core.starter; -import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; @@ -57,11 +57,15 @@ public class RedisAutoConfig { Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); - // 不显示为null的字段 + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , false); + om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS , false); + om.activateDefaultTyping(om.getPolymorphicTypeValidator() , ObjectMapper.DefaultTyping.NON_FINAL); om.setSerializationInclusion(JsonInclude.Include.NON_NULL); - om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + + // + FilterProvider filterProvider = new SimpleFilterProvider() + .addFilter("rewrite-bean" , SimpleBeanPropertyFilter.serializeAllExcept("realmNames")); + om.setFilterProvider(filterProvider); jackson2JsonRedisSerializer.setObjectMapper(om); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/PwdAuthServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/PwdAuthServiceImpl.java index 40114fdb..0d9e55ba 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/PwdAuthServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/PwdAuthServiceImpl.java @@ -133,11 +133,11 @@ public class PwdAuthServiceImpl implements AuthService { private BaseJwtAuthToken initBaseJwtAuthToken(AuthCredential credential){ BaseJwtAuthToken token = new BaseJwtAuthToken(getAuthType(), credential.getUserTypeClass()); // 设置账号密码 - token.setAuthAccount(credential.getAuthAccount()) - .setAuthSecret(credential.getAuthSecret()) - .setRememberMe(credential.isRememberMe()) - .setTenantId(credential.getTenantId()) - .setExtObj(credential.getExtObj()); + token.setAuthAccount(credential.getAuthAccount()); + token.setAuthSecret(credential.getAuthSecret()); + token.setRememberMe(credential.isRememberMe()); + token.setTenantId(credential.getTenantId()); + token.setExtObj(credential.getExtObj()); // 生成token return token.generateAuthtoken(getExpiresInMinutes()); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/SSOAuthServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/SSOAuthServiceImpl.java index de407d51..fcb795f7 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/SSOAuthServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/impl/SSOAuthServiceImpl.java @@ -137,9 +137,9 @@ public class SSOAuthServiceImpl implements AuthService { String username = parseCasTicket(ssoCredential); ssoCredential.setAuthAccount(username); // 设置账号密码 - token.setAuthAccount(ssoCredential.getAuthAccount()) - .setTenantId(credential.getTenantId()) - .setRememberMe(ssoCredential.isRememberMe()); + token.setAuthAccount(ssoCredential.getAuthAccount()); + token.setTenantId(credential.getTenantId()); + token.setRememberMe(ssoCredential.isRememberMe()); // 生成token return token.generateAuthtoken(getExpiresInMinutes()); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java b/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java index 54b574d4..bfe50a32 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/cache/IamCacheManager.java @@ -51,6 +51,7 @@ public class IamCacheManager { if(iamMemoryCacheManager == null){ iamMemoryCacheManager = new StaticMemoryCacheManager( CACHE_NAME_CONTROLLER_API); + URL_PERMISSIONCODE_CACHE.clear(); } return iamMemoryCacheManager; } @@ -106,7 +107,7 @@ public class IamCacheManager { /** * 初始化 */ - private static void initApiPermissionCache() { + private static synchronized void initApiPermissionCache() { StaticMemoryCacheManager cacheManager = getCacheManager(); if (cacheManager.isUninitializedCache(CACHE_NAME_CONTROLLER_API) == false) { return; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java b/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java index ce56fd8c..52af88a6 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/config/Cons.java @@ -114,4 +114,8 @@ public class Cons extends com.diboot.core.config.Cons { * 超级管理员 */ public static final String ROLE_SUPER_ADMIN = "SUPER_ADMIN"; + + public static final String AUTHENTICATION_CAHCE_NAME = "com.diboot.iam.jwt.BaseJwtRealm.authenticationCache"; + public static final String AUTHORIZATION_CAHCE_NAME = "com.diboot.iam.jwt.BaseJwtRealm.authorizationCache"; + } \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java index a9f8e275..c3e789c1 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java @@ -31,7 +31,7 @@ import java.util.Map; * @version v2.0 * @date 2019/6/6 */ -@Getter @Setter @Accessors(chain = true) +@Getter @Setter @Slf4j public class BaseJwtAuthToken implements RememberMeAuthenticationToken { private static final long serialVersionUID = -5518501153334708409L; diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java index 73533d44..df6b5c9c 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/DefaultJwtAuthFilter.java @@ -62,6 +62,7 @@ public class DefaultJwtAuthFilter extends BasicHttpAuthenticationFilter { if(refreshToken != null){ // 写入response header中 JwtUtils.addTokenToResponseHeader((HttpServletResponse) response, refreshToken); + log.debug("返回新的token: {}", refreshToken); } return true; } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java index 372b30fe..facc61fc 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCache.java @@ -21,8 +21,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisTemplate; -import java.util.Collection; -import java.util.Set; +import java.util.*; +import java.util.concurrent.TimeUnit; /** * RedisCache缓存定义 @@ -37,45 +37,73 @@ public class ShiroRedisCache implements Cache { private RedisTemplate redisTemplate; private String cacheName; + private int tokenExpireMinutes; - public ShiroRedisCache(String cacheName, RedisTemplate redisTemplate) { + public ShiroRedisCache(String cacheName, RedisTemplate redisTemplate, int tokenExpireMinutes) { this.cacheName = cacheName; this.redisTemplate = redisTemplate; + this.tokenExpireMinutes = tokenExpireMinutes; + } + + private String getKey(String key){ + return this.cacheName + ":" + key; } @Override public V get(K k) throws CacheException { - return (V)redisTemplate.opsForHash().get(cacheName, k.toString()); + String key = this.getKey(k.toString()); + log.debug("get key : {}", key); + return (V)redisTemplate.opsForValue().get(key); } @Override public V put(K k , V v) throws CacheException { - redisTemplate.opsForHash().put(cacheName, k.toString(), v); + if (k == null || v == null) { + return null; + } + String key = this.getKey(k.toString()); + log.debug("put key : {}, value: {}", key, v); + redisTemplate.opsForValue().set(key, v, tokenExpireMinutes, TimeUnit.MINUTES); return v; } @Override public V remove(K k) throws CacheException { - return (V)redisTemplate.opsForHash().delete(cacheName, k.toString()); + if (k == null) { + return null; + } + String key = this.getKey(k.toString()); + V value = get(k); + log.debug("remove key : {}", key); + redisTemplate.delete(key); + return value; } @Override public void clear() throws CacheException { - redisTemplate.delete(cacheName); + redisTemplate.delete(this.keys()); } @Override public int size() { - return redisTemplate.opsForHash().size(cacheName).intValue(); + return keys().size(); } @Override public Set keys() { - return redisTemplate.opsForHash().keys(cacheName); + return redisTemplate.keys(getKey("*")); } @Override public Collection values() { - return redisTemplate.opsForHash().values(cacheName); + Set keys = keys(); + Set values = new HashSet<>(keys.size()); + for (K key: keys) { + V value = (V)redisTemplate.opsForValue().get(key); + if(value != null){ + values.add(value); + } + } + return values; } -} +} \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java index 480c3a1f..46ce2011 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/redis/ShiroRedisCacheManager.java @@ -33,15 +33,17 @@ import org.springframework.data.redis.core.RedisTemplate; public class ShiroRedisCacheManager extends AbstractCacheManager { private RedisTemplate redisTemplate; + private int tokenExpireMinutes; - public ShiroRedisCacheManager(RedisTemplate redisTemplate){ + public ShiroRedisCacheManager(RedisTemplate redisTemplate, int tokenExpireMinutes){ this.redisTemplate = redisTemplate; + this.tokenExpireMinutes = tokenExpireMinutes; } @Override protected Cache createCache(String cacheName) throws CacheException { - log.debug("init cache: {}", cacheName); - return new ShiroRedisCache(cacheName, redisTemplate); + log.debug("create redis cache: {}", cacheName); + return new ShiroRedisCache(cacheName, redisTemplate, tokenExpireMinutes); } } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java index 8372fcfa..24b65fee 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamRedisAutoConfig.java @@ -17,6 +17,8 @@ package com.diboot.iam.starter; import com.diboot.iam.redis.ShiroRedisCacheManager; import org.apache.shiro.cache.CacheManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -40,16 +42,19 @@ import org.springframework.data.redis.core.RedisTemplate; @ConditionalOnBean(RedisTemplate.class) @ConditionalOnClass(RedisOperations.class) @ConditionalOnResource(resources = "org/springframework/data/redis") +@AutoConfigureBefore({IamAutoConfig.class}) public class IamRedisAutoConfig { + @Autowired + private IamProperties iamProperties; /** * 启用RedisCacheManager定义 * @return */ @Bean(name = "shiroCacheManager") - @ConditionalOnMissingBean + @ConditionalOnMissingBean(CacheManager.class) public CacheManager shiroCacheManager(RedisTemplate redisTemplate) { - return new ShiroRedisCacheManager(redisTemplate); + return new ShiroRedisCacheManager(redisTemplate, iamProperties.getJwtTokenExpiresMinutes()); } } \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamHelper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamHelper.java index 2b290aff..b6d827dc 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamHelper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/util/IamHelper.java @@ -56,8 +56,8 @@ public class IamHelper { return null; } // 对RoleList做聚合处理,以适配前端 - List nameList = new ArrayList<>(); - List codeList = new ArrayList<>(); + List nameList = new ArrayList<>(roleVOList.size()); + List codeList = new ArrayList<>(roleVOList.size()); List allPermissionList = new ArrayList<>(); roleVOList.forEach(vo -> { nameList.add(vo.getName()); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/util/JwtUtils.java b/diboot-iam-starter/src/main/java/com/diboot/iam/util/JwtUtils.java index 431a66b7..1320baa5 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/util/JwtUtils.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/util/JwtUtils.java @@ -16,6 +16,7 @@ package com.diboot.iam.util; import com.diboot.core.config.BaseConfig; +import com.diboot.core.util.ContextHelper; import com.diboot.core.util.S; import com.diboot.core.util.V; import com.diboot.iam.config.Cons; @@ -23,6 +24,7 @@ import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import org.apache.shiro.cache.CacheManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,6 +69,15 @@ public class JwtUtils { } catch (ExpiredJwtException e) { log.warn("token已过期:{}", authtoken); + CacheManager cacheManager = ContextHelper.getBean(CacheManager.class); + if(cacheManager != null){ + if(cacheManager.getCache(Cons.AUTHENTICATION_CAHCE_NAME) != null){ + cacheManager.getCache(Cons.AUTHENTICATION_CAHCE_NAME).remove(authtoken); + } + if(cacheManager.getCache(Cons.AUTHORIZATION_CAHCE_NAME) != null){ + cacheManager.getCache(Cons.AUTHORIZATION_CAHCE_NAME).remove(authtoken); + } + } } catch (Exception e){ log.warn("token解析异常", e); diff --git a/diboot-iam-starter/src/main/java/org/apache/shiro/subject/SimplePrincipalCollection.java b/diboot-iam-starter/src/main/java/org/apache/shiro/subject/SimplePrincipalCollection.java new file mode 100644 index 00000000..47046621 --- /dev/null +++ b/diboot-iam-starter/src/main/java/org/apache/shiro/subject/SimplePrincipalCollection.java @@ -0,0 +1,302 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.shiro.subject; + +import com.fasterxml.jackson.annotation.JsonFilter; +import org.apache.shiro.util.CollectionUtils; +import org.apache.shiro.util.StringUtils; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.*; + +/** + * A simple implementation of the {@link MutablePrincipalCollection} interface that tracks principals internally + * by storing them in a {@link LinkedHashMap}. + * + * @since 0.9 + */ +@SuppressWarnings({"unchecked"}) +@JsonFilter("rewrite-bean") +public class SimplePrincipalCollection implements MutablePrincipalCollection { + + // Serialization reminder: + // You _MUST_ change this number if you introduce a change to this class + // that is NOT serialization backwards compatible. Serialization-compatible + // changes do not require a change to this number. If you need to generate + // a new number in this case, use the JDK's 'serialver' program to generate it. + private static final long serialVersionUID = -6305224034025797558L; + + //TODO - complete JavaDoc + + private Map realmPrincipals; + + private transient String cachedToString; //cached toString() result, as this can be printed many times in logging + + public SimplePrincipalCollection() { + } + + public SimplePrincipalCollection(Object principal, String realmName) { + if (principal instanceof Collection) { + addAll((Collection) principal, realmName); + } else { + add(principal, realmName); + } + } + + public SimplePrincipalCollection(Collection principals, String realmName) { + addAll(principals, realmName); + } + + public SimplePrincipalCollection(PrincipalCollection principals) { + addAll(principals); + } + + protected Collection getPrincipalsLazy(String realmName) { + if (realmPrincipals == null) { + realmPrincipals = new LinkedHashMap(); + } + Set principals = realmPrincipals.get(realmName); + if (principals == null) { + principals = new LinkedHashSet(); + realmPrincipals.put(realmName, principals); + } + return principals; + } + + /** + * Returns the first available principal from any of the {@code Realm} principals, or {@code null} if there are + * no principals yet. + *

+ * The 'first available principal' is interpreted as the principal that would be returned by + * {@link #iterator() iterator()}.{@link java.util.Iterator#next() next()}. + * + * @inheritDoc + */ + public Object getPrimaryPrincipal() { + if (isEmpty()) { + return null; + } + return iterator().next(); + } + + public void add(Object principal, String realmName) { + if (realmName == null) { + throw new NullPointerException("realmName argument cannot be null."); + } + if (principal == null) { + throw new NullPointerException("principal argument cannot be null."); + } + this.cachedToString = null; + getPrincipalsLazy(realmName).add(principal); + } + + public void addAll(Collection principals, String realmName) { + if (realmName == null) { + throw new NullPointerException("realmName argument cannot be null."); + } + if (principals == null) { + throw new NullPointerException("principals argument cannot be null."); + } + if (principals.isEmpty()) { + throw new IllegalArgumentException("principals argument cannot be an empty collection."); + } + this.cachedToString = null; + getPrincipalsLazy(realmName).addAll(principals); + } + + public void addAll(PrincipalCollection principals) { + if (principals.getRealmNames() != null) { + for (String realmName : principals.getRealmNames()) { + for (Object principal : principals.fromRealm(realmName)) { + add(principal, realmName); + } + } + } + } + + public T oneByType(Class type) { + if (realmPrincipals == null || realmPrincipals.isEmpty()) { + return null; + } + Collection values = realmPrincipals.values(); + for (Set set : values) { + for (Object o : set) { + if (type.isAssignableFrom(o.getClass())) { + return (T) o; + } + } + } + return null; + } + + public Collection byType(Class type) { + if (realmPrincipals == null || realmPrincipals.isEmpty()) { + return Collections.EMPTY_SET; + } + Set typed = new LinkedHashSet(); + Collection values = realmPrincipals.values(); + for (Set set : values) { + for (Object o : set) { + if (type.isAssignableFrom(o.getClass())) { + typed.add((T) o); + } + } + } + if (typed.isEmpty()) { + return Collections.EMPTY_SET; + } + return Collections.unmodifiableSet(typed); + } + + public List asList() { + Set all = asSet(); + if (all.isEmpty()) { + return Collections.EMPTY_LIST; + } + return Collections.unmodifiableList(new ArrayList(all)); + } + + public Set asSet() { + if (realmPrincipals == null || realmPrincipals.isEmpty()) { + return Collections.EMPTY_SET; + } + Set aggregated = new LinkedHashSet(); + Collection values = realmPrincipals.values(); + for (Set set : values) { + aggregated.addAll(set); + } + if (aggregated.isEmpty()) { + return Collections.EMPTY_SET; + } + return Collections.unmodifiableSet(aggregated); + } + + public Collection fromRealm(String realmName) { + if (realmPrincipals == null || realmPrincipals.isEmpty()) { + return Collections.EMPTY_SET; + } + Set principals = realmPrincipals.get(realmName); + if (principals == null || principals.isEmpty()) { + principals = Collections.EMPTY_SET; + } + return Collections.unmodifiableSet(principals); + } + + public Set getRealmNames() { + if (realmPrincipals == null) { + return null; + } else { + return realmPrincipals.keySet(); + } + } + + public boolean isEmpty() { + return realmPrincipals == null || realmPrincipals.isEmpty(); + } + + public void clear() { + this.cachedToString = null; + if (realmPrincipals != null) { + realmPrincipals.clear(); + realmPrincipals = null; + } + } + + public Iterator iterator() { + return asSet().iterator(); + } + + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o instanceof SimplePrincipalCollection) { + SimplePrincipalCollection other = (SimplePrincipalCollection) o; + return this.realmPrincipals != null ? this.realmPrincipals.equals(other.realmPrincipals) : other.realmPrincipals == null; + } + return false; + } + + public int hashCode() { + if (this.realmPrincipals != null && !realmPrincipals.isEmpty()) { + return realmPrincipals.hashCode(); + } + return super.hashCode(); + } + + /** + * Returns a simple string representation suitable for printing. + * + * @return a simple string representation suitable for printing. + * @since 1.0 + */ + public String toString() { + if (this.cachedToString == null) { + Set principals = asSet(); + if (!CollectionUtils.isEmpty(principals)) { + this.cachedToString = StringUtils.toString(principals.toArray()); + } else { + this.cachedToString = "empty"; + } + } + return this.cachedToString; + } + + + /** + * Serialization write support. + *

+ * NOTE: Don't forget to change the serialVersionUID constant at the top of this class + * if you make any backwards-incompatible serialization changes!!! + * (use the JDK 'serialver' program for this) + * + * @param out output stream provided by Java serialization + * @throws IOException if there is a stream error + */ + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + boolean principalsExist = !CollectionUtils.isEmpty(realmPrincipals); + out.writeBoolean(principalsExist); + if (principalsExist) { + out.writeObject(realmPrincipals); + } + } + + /** + * Serialization read support - reads in the Map principals collection if it exists in the + * input stream. + *

+ * NOTE: Don't forget to change the serialVersionUID constant at the top of this class + * if you make any backwards-incompatible serialization changes!!! + * (use the JDK 'serialver' program for this) + * + * @param in input stream provided by + * @throws IOException if there is an input/output problem + * @throws ClassNotFoundException if the underlying Map implementation class is not available to the classloader. + */ + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + boolean principalsExist = in.readBoolean(); + if (principalsExist) { + this.realmPrincipals = (Map) in.readObject(); + } + } +} -- Gitee From 94536f86ff88eddd34a493df11ea446035e645d3 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 22 Jul 2021 10:32:37 +0800 Subject: [PATCH 70/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E6=97=A0=E7=8A=B6?= =?UTF-8?q?=E6=80=81token=E8=87=AA=E5=8A=A8=E7=99=BB=E5=BD=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iam/jwt/StatelessJwtAuthFilter.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java index b8e66587..00211dde 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java @@ -21,6 +21,7 @@ import com.diboot.core.util.V; import com.diboot.core.vo.JsonResult; import com.diboot.core.vo.Status; import com.diboot.iam.config.Cons; +import com.diboot.iam.entity.IamUser; import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.JwtUtils; import io.jsonwebtoken.Claims; @@ -79,21 +80,26 @@ public class StatelessJwtAuthFilter extends BasicHttpAuthenticationFilter { JwtUtils.addTokenToResponseHeader((HttpServletResponse) response, refreshToken); } // 构建登陆的token - // tenantId,account,userTypeClass,authType,60 - String[] subjectDetail = subject.split(Cons.SEPARATOR_COMMA); - BaseJwtAuthToken baseJwtAuthToken = new BaseJwtAuthToken(); - baseJwtAuthToken.setTenantId(Long.valueOf(subjectDetail[0])); - baseJwtAuthToken.setAuthAccount(subjectDetail[1]); - try { - baseJwtAuthToken.setUserTypeClass(Class.forName(subjectDetail[2])); - } catch (ClassNotFoundException e) { - log.debug("Token验证失败!用户类型{}不存在,url={}", subjectDetail[2], httpRequest.getRequestURL()); - return false; + log.debug("isAuthenticated = {}", IamSecurityUtils.getSubject().isAuthenticated()); + if(IamSecurityUtils.getSubject().isAuthenticated() == false){ + // tenantId,account,userTypeClass,authType,60 + String[] subjectDetail = subject.split(Cons.SEPARATOR_COMMA); + BaseJwtAuthToken baseJwtAuthToken = new BaseJwtAuthToken(); + baseJwtAuthToken.setTenantId(Long.valueOf(subjectDetail[0])); + baseJwtAuthToken.setAuthAccount(subjectDetail[1]); + if(!IamUser.class.getName().equals(subjectDetail[2])){ + try { + baseJwtAuthToken.setUserTypeClass(Class.forName(subjectDetail[2])); + } catch (ClassNotFoundException e) { + log.debug("Token验证失败!用户类型{}不存在,url={}", subjectDetail[2], httpRequest.getRequestURL()); + return false; + } + } + baseJwtAuthToken.setAuthType(subjectDetail[3]); + baseJwtAuthToken.setAuthtoken(currentToken); + baseJwtAuthToken.setValidPassword(false); + IamSecurityUtils.getSubject().login(baseJwtAuthToken); } - baseJwtAuthToken.setAuthType(subjectDetail[3]); - baseJwtAuthToken.setAuthtoken(currentToken); - baseJwtAuthToken.setValidPassword(false); - IamSecurityUtils.getSubject().login(baseJwtAuthToken); return true; } log.debug("Token验证失败!url=" + httpRequest.getRequestURL()); -- Gitee From be9799ad42d901ff47083299056a9081a178dda6 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 22 Jul 2021 11:41:34 +0800 Subject: [PATCH 71/83] =?UTF-8?q?*=20=E6=97=A0=E7=8A=B6=E6=80=81=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diboot/core/starter/RedisAutoConfig.java | 36 ++++++++++--------- .../com/diboot/iam/jwt/BaseJwtAuthToken.java | 6 ++-- .../iam/jwt/StatelessJwtAuthFilter.java | 2 +- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java index 257995c4..055868ad 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/RedisAutoConfig.java @@ -15,7 +15,9 @@ */ package com.diboot.core.starter; +import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -55,26 +57,28 @@ public class RedisAutoConfig { redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); - ObjectMapper om = new ObjectMapper(); - om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , false); - om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS , false); - om.activateDefaultTyping(om.getPolymorphicTypeValidator() , ObjectMapper.DefaultTyping.NON_FINAL); - om.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - // - FilterProvider filterProvider = new SimpleFilterProvider() - .addFilter("rewrite-bean" , SimpleBeanPropertyFilter.serializeAllExcept("realmNames")); - om.setFilterProvider(filterProvider); - - jackson2JsonRedisSerializer.setObjectMapper(om); - // 用Jackson2JsonRedisSerializer 序列化和反序列化value值 - redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); - redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); redisTemplate.setConnectionFactory(connectionFactory); redisTemplate.afterPropertiesSet(); return redisTemplate; } + + private Jackson2JsonRedisSerializer jackson2JsonRedisSerializer() { + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL , JsonAutoDetect.Visibility.ANY); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , false); + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS , false); + objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator() , ObjectMapper.DefaultTyping.NON_FINAL); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + FilterProvider filterProvider = new SimpleFilterProvider().addFilter("rewrite-bean" , SimpleBeanPropertyFilter.serializeAllExcept("realmNames")); + objectMapper.setFilterProvider(filterProvider); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + return jackson2JsonRedisSerializer; + } + } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java index c3e789c1..5188b615 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/BaseJwtAuthToken.java @@ -75,6 +75,10 @@ public class BaseJwtAuthToken implements RememberMeAuthenticationToken { */ private boolean validPassword = true; + private Object principal; + + private Object credentials; + public BaseJwtAuthToken(){ } @@ -117,8 +121,6 @@ public class BaseJwtAuthToken implements RememberMeAuthenticationToken { return userTypeClass.getSimpleName(); } - - /** * 生成token tenantId,account,userTypeClass,authType,60 * @param expiresInMinutes diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java index 00211dde..91ada38e 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/jwt/StatelessJwtAuthFilter.java @@ -80,7 +80,6 @@ public class StatelessJwtAuthFilter extends BasicHttpAuthenticationFilter { JwtUtils.addTokenToResponseHeader((HttpServletResponse) response, refreshToken); } // 构建登陆的token - log.debug("isAuthenticated = {}", IamSecurityUtils.getSubject().isAuthenticated()); if(IamSecurityUtils.getSubject().isAuthenticated() == false){ // tenantId,account,userTypeClass,authType,60 String[] subjectDetail = subject.split(Cons.SEPARATOR_COMMA); @@ -99,6 +98,7 @@ public class StatelessJwtAuthFilter extends BasicHttpAuthenticationFilter { baseJwtAuthToken.setAuthtoken(currentToken); baseJwtAuthToken.setValidPassword(false); IamSecurityUtils.getSubject().login(baseJwtAuthToken); + log.debug("无状态token自动登录完成"); } return true; } -- Gitee From 3eacbc438ba3897466a9ccd121d45612f41bc766 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Thu, 22 Jul 2021 13:24:13 +0800 Subject: [PATCH 72/83] =?UTF-8?q?*=20condition=E4=B8=AD=E6=9C=89this?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E7=9A=84=E6=9D=A1=E4=BB=B6=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B7=A6=E5=8F=B3=E6=8D=A2=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/diboot/core/test/binder/vo/DeepBindVO.java | 2 +- .../com/diboot/core/binding/parser/ConditionManager.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/DeepBindVO.java b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/DeepBindVO.java index 760e7c8e..bac3e464 100644 --- a/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/DeepBindVO.java +++ b/diboot-core-starter/src/test/java/diboot/core/test/binder/vo/DeepBindVO.java @@ -45,7 +45,7 @@ public class DeepBindVO extends Department{ @BindEntity(entity = Organization.class, condition = "this.org_id=id", deepBind = true) // AND ... private OrganizationVO organizationVO; - @BindEntityList(entity = Department.class, condition = "this.id=parent_id AND this.name IS NOT NULL", deepBind = true) // AND ... + @BindEntityList(entity = Department.class, condition = "parent_id=this.id AND this.name IS NOT NULL", deepBind = true) // AND ... private List children; } \ No newline at end of file diff --git a/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionManager.java b/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionManager.java index 5bdc8297..45dd384d 100644 --- a/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionManager.java +++ b/diboot-core/src/main/java/com/diboot/core/binding/parser/ConditionManager.java @@ -74,7 +74,13 @@ public class ConditionManager extends BaseConditionManager{ String annoColumn = removeLeftAlias(express.getLeftExpression().toString()); if(express.getRightExpression() instanceof Column){ String entityColumn = removeLeftAlias(express.getRightExpression().toString()); - binder.joinOn(annoColumn, entityColumn); + // xx=this.yy,翻转 + if(isCurrentObjColumn(express.getRightExpression().toString()) && !isCurrentObjColumn(express.getLeftExpression().toString())){ + binder.joinOn(entityColumn, annoColumn); + } + else{ + binder.joinOn(annoColumn, entityColumn); + } } else{ binder.andEQ(annoColumn, express.getRightExpression().toString()); -- Gitee From 7424381cc480edc195e8b3ecad3225d3b738af8e Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Fri, 23 Jul 2021 11:29:10 +0800 Subject: [PATCH 73/83] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=B2=97=E4=BD=8D=E6=9B=B4=E6=96=B0=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/iam/service/impl/IamPositionServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamPositionServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamPositionServiceImpl.java index e55a472f..21330cfd 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamPositionServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamPositionServiceImpl.java @@ -36,6 +36,7 @@ import java.util.List; /** * 岗位相关Service实现 + * * @author mazc@dibo.ltd * @version 2.2 * @date 2019-12-03 @@ -93,7 +94,8 @@ public class IamPositionServiceImpl extends BaseIamServiceImpl Date: Fri, 23 Jul 2021 11:31:15 +0800 Subject: [PATCH 74/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96iam=5Fuser=E5=92=8C?= =?UTF-8?q?iam=5Faccount=E6=95=B0=E6=8D=AE=E9=87=8D=E5=A4=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/impl/BaseServiceImpl.java | 16 +++++ .../diboot/iam/service/IamAccountService.java | 7 ++ .../diboot/iam/service/IamUserService.java | 8 +++ .../service/impl/IamAccountServiceImpl.java | 64 +++++++++++++------ .../iam/service/impl/IamUserServiceImpl.java | 41 ++++++++++++ .../resources/META-INF/sql/init-iam-mysql.sql | 4 +- .../META-INF/sql/init-iam-oracle.sql | 4 +- .../META-INF/sql/init-iam-postgresql.sql | 4 +- .../META-INF/sql/init-iam-sqlserver.sql | 4 +- 9 files changed, 125 insertions(+), 27 deletions(-) diff --git a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java index 8c4d4f81..df1b23c5 100644 --- a/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java +++ b/diboot-core/src/main/java/com/diboot/core/service/impl/BaseServiceImpl.java @@ -208,14 +208,27 @@ public class BaseServiceImpl, T> extends ServiceImpl } } + /** + * 用于更新之前的自动填充等场景调用 + */ + protected void beforeUpdateEntity(T entity){ + } + + @Override + public boolean updateById(T entity) { + return updateEntity(entity); + } + @Override public boolean updateEntity(T entity) { + beforeUpdateEntity(entity); boolean success = super.updateById(entity); return success; } @Override public boolean updateEntity(T entity, Wrapper updateWrapper) { + beforeUpdateEntity(entity); boolean success = super.update(entity, updateWrapper); return success; } @@ -232,6 +245,9 @@ public class BaseServiceImpl, T> extends ServiceImpl if(V.isEmpty(entityList)){ return false; } + for(T entity : entityList){ + beforeUpdateEntity(entity); + } boolean success = super.updateBatchById(entityList); return success; } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamAccountService.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamAccountService.java index 228031c1..9ec544c0 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamAccountService.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamAccountService.java @@ -59,4 +59,11 @@ public interface IamAccountService extends BaseIamService { */ String getAuthAccount(String userType, Long userId); + /** + * 账号是否已存在 + * @param iamAccount + * @return + */ + boolean isAccountExists(IamAccount iamAccount); + } \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java index 5d9c3dfc..12f4f2cf 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java @@ -96,4 +96,12 @@ public interface IamUserService extends BaseIamService { */ List filterDuplicateUserNums(List userNumList); + /** + * 用户编号是否存在 + * @param id + * @param userNum + * @return + */ + boolean isUserNumExists(Long id, String userNum); + } \ No newline at end of file diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamAccountServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamAccountServiceImpl.java index e697e11b..92399a18 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamAccountServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamAccountServiceImpl.java @@ -53,32 +53,22 @@ public class IamAccountServiceImpl extends BaseIamServiceImpl accountList){ - if(V.notEmpty(accountList)){ - accountList.stream().forEach(account->{ - // 生成加密盐并加密 - iamCustomize.encryptPwd(account); - }); - } - // 保存 - try{ - return super.createEntities(accountList); + if(V.isEmpty(accountList)){ + return true; } - catch (Exception e){ // 重复账号创建会异常 - log.warn("保存账号异常: "+e.getMessage(), e); - throw new BusinessException(Status.FAIL_VALIDATION, "账号中可能包含已存在账号,请检查!"); + for(IamAccount account : accountList){ + // 生成加密盐并加密 + if (V.notEmpty(account.getAuthSecret())){ + iamCustomize.encryptPwd(account); + } } + return super.createEntities(accountList); } @Override @@ -119,4 +109,40 @@ public class IamAccountServiceImpl extends BaseIamServiceImpl queryWrapper = new QueryWrapper().lambda() + .eq(IamAccount::getAuthAccount, iamAccount.getAuthAccount()) + .eq(IamAccount::getAuthType, iamAccount.getAuthType()) + .eq(IamAccount::getUserType, iamAccount.getUserType()); + if(iamAccount.getId() != null){ + queryWrapper.ne(IamAccount::getId, iamAccount.getId()); + } + return exists(queryWrapper); + } + + /** + * 判断账号是否存在 + * @param iamAccount + * @return + */ + @Override + protected void beforeCreateEntity(IamAccount iamAccount){ + if(isAccountExists(iamAccount)){ + String errorMsg = "账号 "+ iamAccount.getAuthAccount() +" 已存在,请重新设置!"; + log.warn("保存账号异常: {}", errorMsg); + throw new BusinessException(Status.FAIL_VALIDATION, errorMsg); + } + } + + /** + * 判断账号是否存在 + * @param iamAccount + * @return + */ + @Override + protected void beforeUpdateEntity(IamAccount iamAccount){ + beforeCreateEntity(iamAccount); + } + } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java index 611d572e..3a21531d 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java @@ -15,6 +15,7 @@ */ package com.diboot.iam.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -230,6 +231,20 @@ public class IamUserServiceImpl extends BaseIamServiceImpl wrapper = Wrappers.lambdaQuery() + .select(IamUser::getUserNum) + .eq(IamUser::getUserNum, userNum); + if (V.notEmpty(id)){ + wrapper.ne(IamUser::getId, id); + } + return exists(wrapper); + } + /*** * 检查重复用户编号 * @param userNumList @@ -278,6 +293,32 @@ public class IamUserServiceImpl extends BaseIamServiceImpl Date: Fri, 23 Jul 2021 11:35:06 +0800 Subject: [PATCH 75/83] =?UTF-8?q?-=20=E7=A7=BB=E9=99=A4=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8C=89=E7=85=A7orgId=E5=B1=82=E7=BA=A7?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/diboot/iam/mapper/IamUserMapper.java | 8 ---- .../diboot/iam/service/IamUserService.java | 18 +-------- .../iam/service/impl/IamUserServiceImpl.java | 39 ------------------- 3 files changed, 1 insertion(+), 64 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java index dd1dd24b..7db8518f 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/mapper/IamUserMapper.java @@ -32,13 +32,5 @@ import org.apache.ibatis.annotations.Select; @Mapper public interface IamUserMapper extends BaseCrudMapper { - /*** - * 通过org层级的排序来获取用户分页数据 - * @param page - * @param queryWrapper - * @return - */ - @Select("SELECT u.* FROM iam_user u LEFT JOIN iam_org o ON u.org_id=o.id AND o.is_deleted = 0 ${ew.customSqlSegment} ORDER BY o.depth ASC, o.sort_id DESC, o.id DESC, u.id DESC") - IPage selectPageSortByOrg(IPage page, @Param("ew") Wrapper queryWrapper); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java index 5d9c3dfc..bfe11464 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/IamUserService.java @@ -31,22 +31,6 @@ import java.util.List; */ public interface IamUserService extends BaseIamService { - /*** - * 通过org进行排序 - * @param queryWrapper - * @param pagination - * @return - */ - List getEntityListSortByOrg(QueryWrapper queryWrapper, Pagination pagination); - - /*** - * 通过org进行排序 - * @param queryWrapper - * @param pagination - * @return - */ - List getViewObjectListSortByOrg(QueryWrapper queryWrapper, Pagination pagination, Class voClass); - /** * 构建role-permission角色权限数据格式(合并role等),用于前端适配 * @param iamUser @@ -96,4 +80,4 @@ public interface IamUserService extends BaseIamService { */ List filterDuplicateUserNums(List userNumList); -} \ No newline at end of file +} diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java index 611d572e..2b71edb9 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/service/impl/IamUserServiceImpl.java @@ -71,42 +71,6 @@ public class IamUserServiceImpl extends BaseIamServiceImpl getEntityListSortByOrg(QueryWrapper queryWrapper, Pagination pagination) { - // 如果是动态join,则调用JoinsBinder - if(queryWrapper instanceof DynamicJoinQueryWrapper){ - return Binder.joinQueryList(queryWrapper, entityClass, pagination); - } - // 否则,调用MP默认实现 - if(pagination != null){ - queryWrapper.eq("u.is_deleted", false); - IPage page = convertToIPage(queryWrapper, pagination); - page = super.getBaseMapper().selectPageSortByOrg(page, queryWrapper); - // 如果重新执行了count进行查询,则更新pagination中的总数 - if(page.searchCount()){ - pagination.setTotalCount(page.getTotal()); - } - return page.getRecords(); - } - else{ - List list = super.list(queryWrapper); - if(list == null){ - list = Collections.emptyList(); - } - else if(list.size() > BaseConfig.getBatchSize()){ - log.warn("单次查询记录数量过大,返回结果数={}", list.size()); - } - return list; - } - } - - @Override - public List getViewObjectListSortByOrg(QueryWrapper queryWrapper, Pagination pagination, Class voClass) { - List entityList = this.getEntityListSortByOrg(queryWrapper, pagination); - List voList = RelationsBinder.convertAndBind(entityList, voClass); - return voList; - } - @Override public IamRoleVO buildRoleVo4FrontEnd(IamUser iamUser) { List roleVOList = getAllRoleVOList(iamUser); @@ -277,7 +241,4 @@ public class IamUserServiceImpl extends BaseIamServiceImpl Date: Sun, 25 Jul 2021 11:55:43 +0800 Subject: [PATCH 76/83] =?UTF-8?q?+=20=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=8F=AF=E5=BC=80=E5=90=AF=E6=97=A0=E7=8A=B6=E6=80=81Jwt?= =?UTF-8?q?=E8=BA=AB=E4=BB=BD=E9=AA=8C=E8=AF=81=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/diboot/iam/starter/IamAutoConfig.java | 4 +++- .../src/main/java/com/diboot/iam/starter/IamProperties.java | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java index 404adf8b..3fd11b0b 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java @@ -16,7 +16,6 @@ package com.diboot.iam.starter; import com.diboot.core.util.V; -import com.diboot.iam.config.Cons; import com.diboot.iam.jwt.BaseJwtRealm; import com.diboot.iam.jwt.DefaultJwtAuthFilter; import com.diboot.iam.jwt.StatelessJwtAuthFilter; @@ -112,6 +111,9 @@ public class IamAutoConfig { @Bean @ConditionalOnMissingBean public BasicHttpAuthenticationFilter shiroFilter() { + if (iamProperties.isEnabledStatelessSession()) { + return new StatelessJwtAuthFilter(); + } return new DefaultJwtAuthFilter(); } diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java index 4dfd943f..c33fc0f2 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java @@ -62,5 +62,8 @@ public class IamProperties { * 是否开启权限检查(开发环境可关闭方便调试) */ private boolean enablePermissionCheck = true; - + /** + * 是否开启无状态 Jwt 身份验证过滤器 + */ + private boolean enabledStatelessSession = false; } -- Gitee From 7a6590f44b24b8f5ae9f2fdeb0ce408d2a68a0c3 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Mon, 26 Jul 2021 11:00:07 +0800 Subject: [PATCH 77/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0=E6=94=AF=E6=8C=81=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 5 ++++ .../diboot/core/starter/CoreProperties.java | 26 ++++++++++++++++++- .../com/diboot/core/config/BaseConfig.java | 6 ++--- diboot-file-starter/pom.xml | 5 ++++ .../diboot/file/starter/FileProperties.java | 5 ++++ .../java/com/diboot/file/util/FileHelper.java | 2 +- diboot-iam-starter/pom.xml | 6 ++++- diboot-message-starter/pom.xml | 5 ++++ diboot-scheduler-starter/pom.xml | 5 ++++ 9 files changed, 59 insertions(+), 6 deletions(-) diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index f29cb014..bd8d88b1 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -22,6 +22,11 @@ spring-boot-starter-web ${spring-boot.version} + + org.springframework.boot + spring-boot-configuration-processor + true + org.springframework.boot diff --git a/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreProperties.java b/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreProperties.java index 9a262436..57f5a3f9 100644 --- a/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreProperties.java +++ b/diboot-core-starter/src/main/java/com/diboot/core/starter/CoreProperties.java @@ -25,7 +25,14 @@ import org.springframework.boot.context.properties.ConfigurationProperties; */ @ConfigurationProperties(prefix = "diboot.core") public class CoreProperties { - + /** + * 每页记录数量 + */ + private int pageSize = 20; + /** + * 每批次数量 + */ + private int batchSize = 1000; /** * 是否初始化,默认true自动安装SQL */ @@ -38,4 +45,21 @@ public class CoreProperties { public void setInitSql(boolean initSql) { this.initSql = initSql; } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public int getBatchSize() { + return batchSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPageSize() { + return pageSize; + } + } diff --git a/diboot-core/src/main/java/com/diboot/core/config/BaseConfig.java b/diboot-core/src/main/java/com/diboot/core/config/BaseConfig.java index c6646bca..5546e785 100644 --- a/diboot-core/src/main/java/com/diboot/core/config/BaseConfig.java +++ b/diboot-core/src/main/java/com/diboot/core/config/BaseConfig.java @@ -83,7 +83,7 @@ public class BaseConfig { */ public static int getCutLength(){ if(cutLength == null){ - cutLength = PropertiesUtils.getInteger("system.default.cutLength"); + cutLength = PropertiesUtils.getInteger("diboot.core.cutLength"); if(cutLength == null){ cutLength = 20; } @@ -98,7 +98,7 @@ public class BaseConfig { */ public static int getPageSize() { if(pageSize == null){ - pageSize = PropertiesUtils.getInteger("system.pagination.pageSize"); + pageSize = PropertiesUtils.getInteger("diboot.core.pageSize"); if(pageSize == null){ pageSize = 20; } @@ -113,7 +113,7 @@ public class BaseConfig { */ public static int getBatchSize() { if(batchSize == null){ - batchSize = PropertiesUtils.getInteger("system.batch.size"); + batchSize = PropertiesUtils.getInteger("diboot.core.batchSize"); if(batchSize == null){ batchSize = 1000; } diff --git a/diboot-file-starter/pom.xml b/diboot-file-starter/pom.xml index eaba93d5..ff924f80 100644 --- a/diboot-file-starter/pom.xml +++ b/diboot-file-starter/pom.xml @@ -22,6 +22,11 @@ diboot-core-spring-boot-starter ${diboot.version} + + org.springframework.boot + spring-boot-configuration-processor + true + commons-fileupload diff --git a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java index ea78e9da..d363a874 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/starter/FileProperties.java @@ -29,6 +29,11 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "diboot.component.file") public class FileProperties { + /** + * 文件存储路径 + */ + private String storageDirectory; + /** * 是否初始化,默认true自动安装SQL */ diff --git a/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java b/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java index d8e39ced..090d2167 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/util/FileHelper.java @@ -51,7 +51,7 @@ public class FileHelper{ /** * 文件存储路径参数名 */ - public static final String FILE_STORAGE_DIRECTORY = "files.storage.directory"; + public static final String FILE_STORAGE_DIRECTORY = "diboot.component.file.storageDirectory"; /** * 文件存储路径 */ diff --git a/diboot-iam-starter/pom.xml b/diboot-iam-starter/pom.xml index b0fb79ba..a89f2f6c 100644 --- a/diboot-iam-starter/pom.xml +++ b/diboot-iam-starter/pom.xml @@ -16,7 +16,11 @@ diboot IAM project - + + org.springframework.boot + spring-boot-configuration-processor + true + com.diboot diff --git a/diboot-message-starter/pom.xml b/diboot-message-starter/pom.xml index fded314f..ee43172a 100644 --- a/diboot-message-starter/pom.xml +++ b/diboot-message-starter/pom.xml @@ -15,6 +15,11 @@ diboot消息组件 + + org.springframework.boot + spring-boot-configuration-processor + true + com.diboot diff --git a/diboot-scheduler-starter/pom.xml b/diboot-scheduler-starter/pom.xml index ba31c8a0..7473f99e 100644 --- a/diboot-scheduler-starter/pom.xml +++ b/diboot-scheduler-starter/pom.xml @@ -14,6 +14,11 @@ 2.3.0 + + org.springframework.boot + spring-boot-configuration-processor + true + com.diboot -- Gitee From 6b63f4d3ff710b6ada8f8f33970aba444320a6dd Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 27 Jul 2021 10:52:25 +0800 Subject: [PATCH 78/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96pom=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=EF=BC=8C=E5=8D=87=E7=BA=A7spring=20boot=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- diboot-core-starter/pom.xml | 5 ----- diboot-file-starter/pom.xml | 5 ----- diboot-iam-starter/pom.xml | 5 ----- diboot-message-starter/pom.xml | 5 ----- diboot-scheduler-starter/pom.xml | 5 ----- pom.xml | 9 +++++++-- 6 files changed, 7 insertions(+), 27 deletions(-) diff --git a/diboot-core-starter/pom.xml b/diboot-core-starter/pom.xml index bd8d88b1..f29cb014 100644 --- a/diboot-core-starter/pom.xml +++ b/diboot-core-starter/pom.xml @@ -22,11 +22,6 @@ spring-boot-starter-web ${spring-boot.version} - - org.springframework.boot - spring-boot-configuration-processor - true - org.springframework.boot diff --git a/diboot-file-starter/pom.xml b/diboot-file-starter/pom.xml index ff924f80..eaba93d5 100644 --- a/diboot-file-starter/pom.xml +++ b/diboot-file-starter/pom.xml @@ -22,11 +22,6 @@ diboot-core-spring-boot-starter ${diboot.version} - - org.springframework.boot - spring-boot-configuration-processor - true - commons-fileupload diff --git a/diboot-iam-starter/pom.xml b/diboot-iam-starter/pom.xml index a89f2f6c..0e340478 100644 --- a/diboot-iam-starter/pom.xml +++ b/diboot-iam-starter/pom.xml @@ -16,11 +16,6 @@ diboot IAM project - - org.springframework.boot - spring-boot-configuration-processor - true - com.diboot diff --git a/diboot-message-starter/pom.xml b/diboot-message-starter/pom.xml index ee43172a..fded314f 100644 --- a/diboot-message-starter/pom.xml +++ b/diboot-message-starter/pom.xml @@ -15,11 +15,6 @@ diboot消息组件 - - org.springframework.boot - spring-boot-configuration-processor - true - com.diboot diff --git a/diboot-scheduler-starter/pom.xml b/diboot-scheduler-starter/pom.xml index 7473f99e..ba31c8a0 100644 --- a/diboot-scheduler-starter/pom.xml +++ b/diboot-scheduler-starter/pom.xml @@ -14,11 +14,6 @@ 2.3.0 - - org.springframework.boot - spring-boot-configuration-processor - true - com.diboot diff --git a/pom.xml b/pom.xml index 58e2d319..9f56c356 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.5.2 + 2.5.3 @@ -27,7 +27,7 @@ 1.8 - 2.5.2 + 2.5.3 6.2.0.Final 3.4.3.1 4.9.1 @@ -48,6 +48,11 @@ 8.0.23 provided + + org.springframework.boot + spring-boot-configuration-processor + true + -- Gitee From 8f2823563cba538cfd2a4171e0a4f2e41b3d07cc Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 27 Jul 2021 10:53:50 +0800 Subject: [PATCH 79/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96AuthService?= =?UTF-8?q?=E5=A4=9A=E5=AE=9E=E7=8E=B0=E5=8A=A0=E8=BD=BD=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/iam/auth/AuthServiceFactory.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java index 79f17180..a2a0a8be 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/auth/AuthServiceFactory.java @@ -18,6 +18,7 @@ package com.diboot.iam.auth; import com.diboot.core.util.ContextHelper; import com.diboot.core.util.V; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; import java.util.HashMap; import java.util.List; @@ -43,7 +44,14 @@ public class AuthServiceFactory { List authServiceList = ContextHelper.getBeans(AuthService.class); if(V.notEmpty(authServiceList)){ authServiceList.stream().forEach((service)->{ - AUTHTYPE_SERVICE_CACHE.put(service.getAuthType(), service); + if(AUTHTYPE_SERVICE_CACHE.containsKey(service.getAuthType())){ + if(service.getClass().getAnnotation(Primary.class) != null){ + AUTHTYPE_SERVICE_CACHE.put(service.getAuthType(), service); + } + } + else{ + AUTHTYPE_SERVICE_CACHE.put(service.getAuthType(), service); + } }); } } -- Gitee From a77f22a80be673e2843b31cc8d409a1bc525d7aa Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Tue, 27 Jul 2021 13:05:20 +0800 Subject: [PATCH 80/83] =?UTF-8?q?*=20=E8=B0=83=E6=95=B4=E6=92=A4=E9=94=80?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3=E6=96=B9=E6=B3=95=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/core/controller/BaseCrudRestController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java index fc5b8343..8d37ea46 100644 --- a/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java +++ b/diboot-core/src/main/java/com/diboot/core/controller/BaseCrudRestController.java @@ -240,7 +240,7 @@ public class BaseCrudRestController extends BaseContro * @return * @throws Exception */ - public JsonResult cancelDeletedEntityMapping(Serializable id) throws Exception { + public JsonResult cancelDeletedEntity(Serializable id) throws Exception { boolean success = getService().cancelDeletedById(id); E entity = null; if (success){ -- Gitee From a730e2d19f7a6313e8b67830f4079b1fd03c66fc Mon Sep 17 00:00:00 2001 From: wind <1103642893@qq.com> Date: Tue, 27 Jul 2021 16:25:10 +0800 Subject: [PATCH 81/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96Excel=E5=86=99?= =?UTF-8?q?=E5=85=A5=E5=8D=95=E5=85=83=E6=A0=BC=E4=B8=8B=E6=8B=89=E9=80=89?= =?UTF-8?q?=E9=A1=B9=EF=BC=8C=E5=85=B3=E8=81=94=E5=AD=97=E5=85=B8=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7=E5=A4=A7=E4=BA=8E=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/diboot/file/excel/annotation/ExcelOption.java | 6 +++--- .../com/diboot/file/excel/write/OptionWriteHandler.java | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java index f36fdf05..d75eb22c 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/annotation/ExcelOption.java @@ -20,7 +20,7 @@ import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; /** - * Excel 单元格验证 (单元下拉选项) + * Excel 单元格验证 (单元格下拉选项) *

* 可自定义选项或关联字典 * @@ -48,7 +48,7 @@ public @interface ExcelOption { *

* {@link #value}是此属性的别名(并与之互斥)。 *

- * 优先级: options > dict + * 优先级: dict > options */ @AliasFor("value") String[] options() default {}; @@ -56,7 +56,7 @@ public @interface ExcelOption { /** * 关联字典类型 *

- * 优先级: options > dict + * 优先级: dict > options */ String dict() default ""; diff --git a/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java index 7e38d7d8..73d86cd7 100644 --- a/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java +++ b/diboot-file-starter/src/main/java/com/diboot/file/excel/write/OptionWriteHandler.java @@ -100,11 +100,14 @@ public class OptionWriteHandler extends AbstractSheetWriteHandler { ExcelOption option = AnnotationUtils.getAnnotation(entry.getValue(), ExcelOption.class); // 行数不大于0时不添加 单元格验证(单元下拉选项) if (option != null && option.rows() > 0) { - String[] options = option.options(); + String[] options = null; String dictType = option.dict(); - if (options.length == 0 || V.notEmpty(dictType)) { + if (V.notEmpty(dictType)) { options = getDictOptions(dictType); } + if (V.isEmpty(options)) { + options = option.options(); + } // 下拉框选为空时不添加 单元格验证(单元下拉选项) if (V.notEmpty(options)) { int col = entry.getKey(); -- Gitee From 42a783d609e473b1a8084b116744940cc8f1fb3e Mon Sep 17 00:00:00 2001 From: JerryMa Date: Tue, 27 Jul 2021 20:55:05 +0800 Subject: [PATCH 82/83] =?UTF-8?q?*=20=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/diboot/iam/starter/IamAutoConfig.java | 2 +- .../src/main/java/com/diboot/iam/starter/IamProperties.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java index 3fd11b0b..b36b8e4c 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamAutoConfig.java @@ -111,7 +111,7 @@ public class IamAutoConfig { @Bean @ConditionalOnMissingBean public BasicHttpAuthenticationFilter shiroFilter() { - if (iamProperties.isEnabledStatelessSession()) { + if (iamProperties.isEnableStatelessSession()) { return new StatelessJwtAuthFilter(); } return new DefaultJwtAuthFilter(); diff --git a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java index c33fc0f2..e8cfe065 100644 --- a/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java +++ b/diboot-iam-starter/src/main/java/com/diboot/iam/starter/IamProperties.java @@ -65,5 +65,5 @@ public class IamProperties { /** * 是否开启无状态 Jwt 身份验证过滤器 */ - private boolean enabledStatelessSession = false; + private boolean enableStatelessSession = false; } -- Gitee From 706a6855863ceab4ed979b97008b948da2a750b8 Mon Sep 17 00:00:00 2001 From: JerryMa Date: Wed, 28 Jul 2021 14:27:44 +0800 Subject: [PATCH 83/83] =?UTF-8?q?*=20=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index f97f48bb..0c368225 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -> 从此告别常规SQL和CRUD了! diboot新用户: [看视频快速了解diboot](https://www.bilibili.com/video/BV17V411r7Cc) 、 [手把手跟我来体验](https://www.diboot.com/guide/newer/bootstrap.html) 、 +> 用上diboot,告别常规SQL和CRUD,写的更少,性能更好! -> [看diboot如何把关联查询性能提升10倍](https://www.bilibili.com/video/BV1tL411p7CD) +> 新用户指南: [手把手来体验](https://www.diboot.com/guide/newer/bootstrap.html) 、[看视频了解我](https://www.bilibili.com/video/BV17V411r7Cc) 、[如何做到高性能](https://www.bilibili.com/video/BV1tL411p7CD) # diboot - 基础组件化繁为简,高效工具以简驭繁

@@ -16,9 +16,9 @@ ![diboot平台组成结构图](https://www.diboot.com/structure.png) -> [spring cloud版本,移步这里->](https://github.com/dibo-software/diboot-cloud) +> [diboot-cloud 微服务版本,看这里->](https://www.diboot.com/ent/service.html) -> [diboot-workflow 工作流授权](https://www.diboot.com/ent/service.html) +> [diboot-workflow 工作流版本,看这里->](https://www.diboot.com/ent/service.html) ## diboot基础组件 ### 1、 diboot-core: 精简优化内核:写的更少,性能更好 @@ -28,7 +28,7 @@ * 数据字典无SQL(注解自动绑定) * 跨表查询无SQL(自动构建QueryWrapper与查询) * BaseService扩展增强,支持常规的单表及关联开发场景接口 -* 其他常用工具类、状态码、异常处理的最佳实践封装 +* 其他常用工具类、状态码、异常处理的更优实践封装 基于diboot-core的CRUD和常规关联的功能实现,代码量比传统Mybatis项目减少80%+,且性能更好更易维护。 > 详细文档: [diboot-core文档](https://www.diboot.com/guide/diboot-core/%E7%AE%80%E4%BB%8B.html). @@ -36,18 +36,19 @@ ### 2、IAM 身份认证基础组件 及 配套VUE前端框架(diboot-antd-admin、diboot-element-admin) * 开箱即用的RBAC角色权限模型与预置组织人员岗位模型 -* 基于JWT的认证授权,支持申请token、刷新token +* 基于JWT的认证授权,支持申请token、刷新token、无状态认证 * 简化的BindPermission注解,支持兼容shiro的简化权限绑定与自动鉴权 -* 简化的Log注解记录操作日志 * 自动提取需要验证的后端接口, 借助前端功能方便绑定前后端菜单按钮权限 -* 支持基于注解的数据权限实现 +* 无缝适配redis,引入redis依赖即可启用shiro的redis缓存 +* 支持基于注解的数据权限实现、简化的Log注解记录操作日志等 * 支持灵活的扩展能力(扩展多种登录方式、灵活替换用户实体类、自定义缓存等) > 详细文档: [diboot-iam文档](https://www.diboot.com/guide/diboot-iam/%E4%BB%8B%E7%BB%8D.html). ### 3、diboot-file 文件相关处理组件 * EasyExcel轻量封装,支持Java注解校验与@ExcelBind*注解实现字典及关联字段的name-value转换,并提供完善的校验错误提示 -* 封装常用的文件本地存储、上传下载、图片压缩水印等常用处理 +* 文件存储接口化,预置本地存储,简单扩展OSS、分布式存储等实现 +* 封装常用的文件上传下载、图片压缩水印等常用处理 > 详细文档: [diboot-file文档](https://www.diboot.com/guide/diboot-file/%E4%BB%8B%E7%BB%8D.html). ### 4、diboot-scheduler 定时任务组件 @@ -61,22 +62,18 @@ * 支持多通道的消息通知发送 ## devtools开发助理 +* 极简易用(引入依赖jar,配置参数后,即可随应用启动运行) +* 功能强大(数据结构与代码同步、前后端代码一键生成、前端面板组件编排) +* 配置灵活(可按需配置生成代码路径及启用`Lombok`、`Swagger`等) +* 代码标准(devtools标准化了数据结构定义与代码实现,降低维护成本) +* 支持多库(MySQL、MariaDB、ORACLE、SQLServer、PostgreSQL) -* 使用很简单(UI界面操作,引入依赖配置参数后,即可随Spring boot/Spring cloud本地项目启动运行) -* 功能很强大: - * 单表与关联场景CRUD导入导出的完整功能全自动生成,无需手写代码 - * 结合前端面板组件编排能力,覆盖更多场景的自动化生成 - * 数据结构变更与代码联动同步,自动记录变更SQL、维护索引 - * 一键生成代码&非覆盖式更新本地后端代码 -* 配置很灵活(可按需配置生成代码路径,是否启用`Lombok`、`Swagger`等) -* SQL与代码很标准(devtools标准化了数据结构定义与代码实现) -* 支持多数据库(MySQL、MariaDB、ORACLE、SQLServer、PostgreSQL) > 详细文档: [diboot-devtools文档](https://www.diboot.com/guide/diboot-devtools/%E4%BB%8B%E7%BB%8D.html). ## 捐助支持 捐助二维码 -感谢所有捐助的朋友为开源事业的发展做出的努力。 +感谢每一位支持diboot的粉丝朋友。 ## 技术交流 如遇diboot相关技术问题,欢迎加群交流: -- Gitee