orgModelList;
}
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserPassword.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserPassword.java
index 467a19ee..a6d65a2c 100644
--- a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserPassword.java
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserPassword.java
@@ -17,7 +17,7 @@ package org.opsli.api.wrapper.system.user;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.common.annotation.validator.Validator;
@@ -25,12 +25,13 @@ import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.annotation.validator.ValidatorLenMin;
import org.opsli.common.enums.ValidatorType;
+import java.io.Serial;
import java.io.Serializable;
/**
* 用户 修改密码
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@Data
@@ -38,28 +39,29 @@ import java.io.Serializable;
@ExcelIgnoreUnannotated
public class UserPassword implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** User Id */
- @ApiModelProperty(value = "用户Id")
+ @Schema(description = "用户Id")
private String userId;
/** 旧密码 */
- @ApiModelProperty(value = "旧密码")
+ @Schema(description = "旧密码")
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMin(6)
@ValidatorLenMax(50)
private String oldPassword;
/** 新密码 */
- @ApiModelProperty(value = "新密码")
+ @Schema(description = "新密码")
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_SECURITY_PASSWORD})
@ValidatorLenMin(6)
@ValidatorLenMax(50)
private String newPassword;
/** 登录密码强度 前端不可改 */
- @ApiModelProperty(value = "登录密码强度 前端不可改")
+ @Schema(description = "登录密码强度 前端不可改")
@ExcelIgnore
@ValidatorLenMin(1)
@ValidatorLenMax(1)
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserRoleRefModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserRoleRefModel.java
index 854d1f73..0bf4ddd0 100644
--- a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserRoleRefModel.java
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserRoleRefModel.java
@@ -16,7 +16,7 @@
package org.opsli.api.wrapper.system.user;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.opsli.common.annotation.validator.Validator;
import org.opsli.common.annotation.validator.ValidatorLenMax;
@@ -27,7 +27,7 @@ import java.io.Serializable;
/**
* 用户 - 角色表
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@Data
@@ -39,17 +39,17 @@ import java.io.Serializable;
public class UserRoleRefModel implements Serializable {
/** 用户ID */
- @ApiModelProperty(value = "用户ID")
+ @Schema(description = "用户ID")
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(50)
private String userId;
/** 角色数组 */
- @ApiModelProperty(value = "权限数组")
+ @Schema(description = "权限数组")
private String[] roleIds;
/** 默认角色ID */
- @ApiModelProperty(value = "默认角色")
+ @Schema(description = "默认角色")
@Validator({ValidatorType.IS_NOT_NULL})
private String defRoleId;
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserSelfSaveModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserSelfSaveModel.java
new file mode 100644
index 00000000..46eaefa3
--- /dev/null
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserSelfSaveModel.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com
+ *
+ * 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
+ *
+ * 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.opsli.api.wrapper.system.user;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.opsli.api.base.warpper.ApiWrapper;
+import org.opsli.common.annotation.validator.Validator;
+import org.opsli.common.annotation.validator.ValidatorLenMax;
+import org.opsli.common.annotation.validator.ValidatorLenMin;
+import org.opsli.common.enums.ValidatorType;
+import org.opsli.plugins.excel.annotation.ExcelInfo;
+
+/**
+ * 用户信息表
+ *
+ * @author Pace
+ * @date 2020-09-16 17:33
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class UserSelfSaveModel extends ApiWrapper {
+
+ /** 登录账户 */
+ @Schema(description = "登录账户")
+ @ExcelIgnore
+ @Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
+ @ValidatorLenMax(32)
+ @ValidatorLenMin(4)
+ private String username;
+
+ /** 登录密码 */
+ @Schema(description = "登录密码")
+ @ExcelIgnore
+ @ValidatorLenMin(6)
+ @ValidatorLenMax(50)
+ private String password;
+
+ /** 登录密码强度 */
+ @Schema(description = "登录密码强度")
+ @ExcelIgnore
+ @ValidatorLenMin(1)
+ @ValidatorLenMax(1)
+ private String passwordLevel;
+
+ /** 是否启用 */
+ @Schema(description = "是否启用")
+ @ExcelIgnore
+ @ValidatorLenMax(1)
+ private String enable;
+
+ /** 真实姓名 */
+ @Schema(description = "真实姓名")
+ @ExcelProperty(value = "真实姓名", order = 1)
+ @ExcelInfo
+ @Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL_WITH_CHINESE})
+ @ValidatorLenMax(50)
+ private String realName;
+
+ /** 手机 */
+ @Schema(description = "手机")
+ @ExcelProperty(value = "手机", order = 2)
+ @ExcelInfo
+ private String mobile;
+
+ /** 邮箱 */
+ @Schema(description = "邮箱")
+ @ExcelProperty(value = "邮箱", order = 3)
+ @ExcelInfo
+ private String email;
+
+ /** 工号 */
+ @Schema(description = "工号")
+ @ExcelProperty(value = "工号", order = 4)
+ @ExcelInfo
+ @Validator({ValidatorType.IS_GENERAL})
+ @ValidatorLenMax(32)
+ private String no;
+
+ /** 头像 */
+ @Schema(description = "头像")
+ @ExcelIgnore
+ @ValidatorLenMax(255)
+ private String avatar;
+
+ /** 最后登陆IP */
+ @Schema(description = "最后登陆IP")
+ @ExcelIgnore
+ @Validator(ValidatorType.IS_IPV4)
+ private String loginIp;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ @ExcelProperty(value = "备注", order = 5)
+ @ExcelInfo
+ @ValidatorLenMax(255)
+ private String remark;
+
+ /** 签名 */
+ @Schema(description = "签名")
+ @ExcelProperty(value = "签名", order = 5)
+ @ExcelInfo
+ @ValidatorLenMax(255)
+ private String sign;
+
+
+ /** 多租户字段 */
+ @Schema(description = "多租户ID")
+ @ExcelIgnore
+ @ValidatorLenMax(20)
+ private String tenantId;
+
+ /** 是否租户管理员 */
+ @Schema(description = "是否租户管理员")
+ @ExcelIgnore
+ @ValidatorLenMax(1)
+ private String izTenantAdmin;
+
+ /** 是否存在组织 */
+ @JsonIgnore
+ @ExcelIgnore
+ @ValidatorLenMax(1)
+ private String izExistOrg;
+
+ /** 允许切换租户(0 不允许 1 允许) */
+ @Schema(description = "是否允许切换运营商")
+ @ExcelIgnore
+ private String enableSwitchTenant;
+
+ /** 切换后的租户id*/
+ @JsonIgnore
+ @ExcelIgnore
+ private String switchTenantId;
+
+ /** 切换后的租户管理员*/
+ @JsonIgnore
+ @ExcelIgnore
+ private String switchTenantUserId;
+
+}
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserWebModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserWebModel.java
index a6f569ac..bb42cd7c 100644
--- a/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserWebModel.java
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/user/UserWebModel.java
@@ -17,7 +17,7 @@ package org.opsli.api.wrapper.system.user;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -30,7 +30,7 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* 用户信息表
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@Data
@@ -38,12 +38,12 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
public class UserWebModel extends ApiWrapper {
/** 角色名称 */
- @ApiModelProperty(value = "角色名称")
+ @Schema(description = "角色名称")
@ExcelIgnore
private String roleNames;
/** 登录账户 */
- @ApiModelProperty(value = "登录账户")
+ @Schema(description = "登录账户")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
@ValidatorLenMax(32)
@@ -51,28 +51,28 @@ public class UserWebModel extends ApiWrapper {
private String username;
/** 登录密码 */
- @ApiModelProperty(value = "登录密码")
+ @Schema(description = "登录密码")
@ExcelIgnore
@ValidatorLenMin(6)
@ValidatorLenMax(50)
private String password;
/** 登录密码强度 */
- @ApiModelProperty(value = "登录密码强度")
+ @Schema(description = "登录密码强度")
@ExcelIgnore
@ValidatorLenMin(1)
@ValidatorLenMax(1)
private String passwordLevel;
/** 启用状态 */
- @ApiModelProperty(value = "启用状态")
+ @Schema(description = "启用状态")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(1)
private String enable;
/** 真实姓名 */
- @ApiModelProperty(value = "真实姓名")
+ @Schema(description = "真实姓名")
@ExcelProperty(value = "真实姓名", order = 1)
@ExcelInfo
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL_WITH_CHINESE})
@@ -80,14 +80,14 @@ public class UserWebModel extends ApiWrapper {
private String realName;
/** 手机 */
- @ApiModelProperty(value = "手机")
+ @Schema(description = "手机")
@ExcelProperty(value = "手机", order = 2)
@ExcelInfo
@Validator({ValidatorType.IS_MOBILE})
private String mobile;
/** 邮箱 */
- @ApiModelProperty(value = "邮箱")
+ @Schema(description = "邮箱")
@ExcelProperty(value = "邮箱", order = 3)
@ExcelInfo
@Validator({ValidatorType.IS_EMAIL})
@@ -95,7 +95,7 @@ public class UserWebModel extends ApiWrapper {
private String email;
/** 工号 */
- @ApiModelProperty(value = "工号")
+ @Schema(description = "工号")
@ExcelProperty(value = "工号", order = 4)
@ExcelInfo
@Validator({ValidatorType.IS_GENERAL})
@@ -103,26 +103,26 @@ public class UserWebModel extends ApiWrapper {
private String no;
/** 头像 */
- @ApiModelProperty(value = "头像")
+ @Schema(description = "头像")
@ExcelIgnore
@ValidatorLenMax(255)
private String avatar;
/** 最后登陆IP */
- @ApiModelProperty(value = "最后登陆IP")
+ @Schema(description = "最后登陆IP")
@ExcelIgnore
@Validator(ValidatorType.IS_IPV4)
private String loginIp;
/** 备注 */
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
@ExcelProperty(value = "备注", order = 5)
@ExcelInfo
@ValidatorLenMax(255)
private String remark;
/** 签名 */
- @ApiModelProperty(value = "签名")
+ @Schema(description = "签名")
@ExcelProperty(value = "签名", order = 5)
@ExcelInfo
@ValidatorLenMax(255)
@@ -130,13 +130,13 @@ public class UserWebModel extends ApiWrapper {
/** 多租户字段 */
- @ApiModelProperty(value = "多租户ID")
+ @Schema(description = "多租户ID")
@ExcelIgnore
@ValidatorLenMax(20)
private String tenantId;
/** 允许切换租户(0 不允许 1 允许) */
- @ApiModelProperty(value = "是否允许切换运营商")
+ @Schema(description = "是否允许切换运营商")
private String enableSwitchTenant;
}
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java
index 80b5e2c3..779f48af 100644
--- a/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java
@@ -16,8 +16,7 @@
package org.opsli.api.wrapper.test;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -27,25 +26,25 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
* 测试类
* 测试导入导出
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value="测试接口返回Model",description="测试接口返回Model")
+@Schema(description="测试接口返回Model")
@Data
public class TestModel extends ApiWrapper {
- @ApiModelProperty(value = "名称")
+ @Schema(description = "名称")
@ExcelProperty(value = "名称", order = 1)
@ExcelInfo
private String name;
- @ApiModelProperty(value = "分类")
+ @Schema(description = "分类")
@ExcelProperty(value = "分类", order = 2)
@ExcelInfo(dictType = "test_type")
private String type;
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
@ExcelProperty(value = "备注", order = 3)
@ExcelInfo
private String remark;
diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/testt/Test3Model.java b/opsli-api/src/main/java/org/opsli/api/wrapper/testt/Test3Model.java
index d86a8560..f7a7cfa7 100644
--- a/opsli-api/src/main/java/org/opsli/api/wrapper/testt/Test3Model.java
+++ b/opsli-api/src/main/java/org/opsli/api/wrapper/testt/Test3Model.java
@@ -17,7 +17,7 @@ package org.opsli.api.wrapper.testt;
import java.util.Date;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -31,7 +31,7 @@ import org.springframework.format.annotation.DateTimeFormat;
/**
* 测试3
*
- * @author Parker
+ * @author Pace
* @date 2020-12-20 18:27:04
*/
@Data
@@ -39,7 +39,7 @@ import org.springframework.format.annotation.DateTimeFormat;
public class Test3Model extends ApiWrapper {
/** 金钱 */
- @ApiModelProperty(value = "金钱")
+ @Schema(description = "金钱")
@ExcelProperty(value = "金钱", order = 1)
@ExcelInfo
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_MONEY})
@@ -47,7 +47,7 @@ public class Test3Model extends ApiWrapper {
private Double money;
/** 年龄 */
- @ApiModelProperty(value = "年龄")
+ @Schema(description = "年龄")
@ExcelProperty(value = "年龄", order = 2)
@ExcelInfo
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_INTEGER})
@@ -55,7 +55,7 @@ public class Test3Model extends ApiWrapper {
private Integer age;
/** 名称 */
- @ApiModelProperty(value = "名称")
+ @Schema(description = "名称")
@ExcelProperty(value = "名称", order = 3)
@ExcelInfo
@Validator({ValidatorType.IS_CHINESE})
@@ -63,7 +63,7 @@ public class Test3Model extends ApiWrapper {
private String name;
/** 生日 */
- @ApiModelProperty(value = "生日")
+ @Schema(description = "生日")
@ExcelProperty(value = "生日", order = 4)
@ExcelInfo
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@@ -71,7 +71,7 @@ public class Test3Model extends ApiWrapper {
private Date birth;
/** 是否启用 */
- @ApiModelProperty(value = "是否启用")
+ @Schema(description = "是否启用")
@ExcelProperty(value = "是否启用", order = 5)
@ExcelInfo( dictType = "no_yes" )
@ValidatorLenMax(1)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiRestController.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiRestController.java
index 60d2be3a..b6550440 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiRestController.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiRestController.java
@@ -24,7 +24,7 @@ import java.lang.annotation.*;
/**
* controller层统一使用该注解
*
- * @author Parker
+ * @author Pace
* @date 2021年5月18日14:46:09
*/
@Target(ElementType.TYPE)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiVersion.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiVersion.java
index 2a4af62c..3182b1ad 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiVersion.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/ApiVersion.java
@@ -5,7 +5,7 @@ import java.lang.annotation.*;
/**
* 标识版本号,从1开始
*
- * @author Parker
+ * @author Pace
* @date 2021年10月27日12:36:55
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@@ -15,4 +15,4 @@ public @interface ApiVersion {
int value() default 1;
-}
\ No newline at end of file
+}
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/Limiter.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/Limiter.java
index 07103eb8..1f90ff7b 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/Limiter.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/Limiter.java
@@ -24,7 +24,7 @@ import java.lang.annotation.*;
/**
* Java 限流器
*
- * @author Parker
+ * @author Pace
* @date 2020-12-31
*/
@Target(ElementType.METHOD)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/OptionDict.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/OptionDict.java
index 8c7a9602..01191103 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/OptionDict.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/OptionDict.java
@@ -21,7 +21,7 @@ import java.lang.annotation.*;
/**
* 参数配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
@Target(ElementType.FIELD)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/SearchHis.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/SearchHis.java
index 44989516..874a3189 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/SearchHis.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/SearchHis.java
@@ -21,7 +21,7 @@ import java.lang.annotation.*;
* 搜索历史注解
* 默认按照当前用户 key, 搜索记录排行最高
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
@Target(ElementType.METHOD)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/EnableHotData.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/EnableHotData.java
index dff6ff73..31e0f74f 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/EnableHotData.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/EnableHotData.java
@@ -31,7 +31,7 @@ import java.lang.annotation.*;
*
* 并发更新 不建议使用 热数据 ☆☆☆☆☆
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 16:36
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java
index f0b0fd45..b6e1fa25 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataDel.java
@@ -28,7 +28,7 @@ import java.lang.annotation.*;
*
* 并发更新 不建议使用 热数据 ☆☆☆☆☆
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 16:36
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java
index 0ef0725b..ee42b749 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/hotdata/HotDataPut.java
@@ -28,7 +28,7 @@ import java.lang.annotation.*;
*
* 并发更新 不建议使用 热数据 ☆☆☆☆☆
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 16:36
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/Validator.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/Validator.java
index 2eecf7d4..3d1daf99 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/Validator.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/Validator.java
@@ -22,7 +22,7 @@ import java.lang.annotation.*;
/**
* 字段验证器
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMax.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMax.java
index b39b7779..746bb759 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMax.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMax.java
@@ -22,7 +22,7 @@ import java.lang.annotation.*;
* 字段验证器 - 字段最大长度
* 对应 数据库 真实长度数
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMin.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMin.java
index b178aed0..3c6f659c 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMin.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/annotation/validator/ValidatorLenMin.java
@@ -22,7 +22,7 @@ import java.lang.annotation.*;
* 字段验证器 - 字段最大长度
* 对应 数据库 真实长度数
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
@Retention(RetentionPolicy.RUNTIME)
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultDto.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultDto.java
index 47f53b17..a94e29e7 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultDto.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultDto.java
@@ -30,7 +30,7 @@ import java.util.Map;
*
* 所以要加上 @JsonProperty ,否者返回则为一个null
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
public class ResultDto implements Serializable {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultVoMap.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultVoMap.java
index 4b9e6c0a..1b94a112 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultVoMap.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/api/ResultVoMap.java
@@ -26,7 +26,7 @@ import java.util.Map;
/**
* Web统一返回参数
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
public class ResultVoMap extends HashMap implements Serializable {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/base/msg/BaseMsg.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/base/msg/BaseMsg.java
index fd0e64b9..b43a973c 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/base/msg/BaseMsg.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/base/msg/BaseMsg.java
@@ -19,7 +19,7 @@ package org.opsli.common.base.msg;
* 总消息类 用来存放消息
* opsli将消息全部提取出至一个总文件
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
public interface BaseMsg {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java
index e3030294..7a2e0137 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/CacheConstants.java
@@ -18,7 +18,7 @@ package org.opsli.common.constants;
/**
* 缓存 常量
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 17:07
*/
public final class CacheConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MenuConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MenuConstants.java
index 5ec14da4..e668fd61 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MenuConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MenuConstants.java
@@ -18,7 +18,7 @@ package org.opsli.common.constants;
/**
* 菜单常量
*
- * @author Parker
+ * @author Pace
* @date 2021年3月10日15:50:16
*/
public final class MenuConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MyBatisConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MyBatisConstants.java
index c418f11b..99ce82e4 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MyBatisConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/MyBatisConstants.java
@@ -20,7 +20,7 @@ package org.opsli.common.constants;
/**
* MyBatis 常量
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public final class MyBatisConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/OrderConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/OrderConstants.java
index c5fdf7f5..692a1803 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/OrderConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/OrderConstants.java
@@ -18,7 +18,7 @@ package org.opsli.common.constants;
/**
* Order 排序
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public final class OrderConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/RedisConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/RedisConstants.java
index 82378d12..af018d7d 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/RedisConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/RedisConstants.java
@@ -3,7 +3,7 @@ package org.opsli.common.constants;
/**
* Redis 常量
* {} 为项目名称
- * @author Parker
+ * @author Pace
* @date 2021/12/10 19:52
*/
public final class RedisConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/SignConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/SignConstants.java
index eafb22c0..bcf302b3 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/SignConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/SignConstants.java
@@ -3,7 +3,7 @@ package org.opsli.common.constants;
/**
* 签名
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public final class SignConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenConstants.java
index 803d85b7..b2470f47 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenConstants.java
@@ -18,7 +18,7 @@ package org.opsli.common.constants;
/**
* Token 常量类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public final class TokenConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenTypeConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenTypeConstants.java
index 99808164..c2a13f8d 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenTypeConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TokenTypeConstants.java
@@ -3,7 +3,7 @@ package org.opsli.common.constants;
/**
* Token类型
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public final class TokenTypeConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TreeConstants.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TreeConstants.java
index ce0360d1..ce01754e 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TreeConstants.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/constants/TreeConstants.java
@@ -18,7 +18,7 @@ package org.opsli.common.constants;
/**
* 菜单常量
*
- * @author Parker
+ * @author Pace
* @date 2021年3月10日15:50:16
*/
public final class TreeConstants {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/AlertType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/AlertType.java
index b517fdeb..1dfc297a 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/AlertType.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/AlertType.java
@@ -19,7 +19,7 @@ package org.opsli.common.enums;
/**
* 字典
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public enum AlertType {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java
index 9583512d..2d429b63 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/CacheType.java
@@ -18,7 +18,7 @@ package org.opsli.common.enums;
/**
* 数据库类型
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public enum CacheType {
@@ -57,4 +57,4 @@ public enum CacheType {
this.name = name;
this.desc = desc;
}
-}
\ No newline at end of file
+}
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ExcelOperate.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ExcelOperate.java
index c68d5a51..723d74c4 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ExcelOperate.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ExcelOperate.java
@@ -19,7 +19,7 @@ package org.opsli.common.enums;
/**
* Excel 操作类型
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:42
*/
public enum ExcelOperate {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginLimitRefuse.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginLimitRefuse.java
index b199df7d..cbdf0312 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginLimitRefuse.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginLimitRefuse.java
@@ -19,7 +19,7 @@ package org.opsli.common.enums;
/**
* 登录拒绝策略
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public enum LoginLimitRefuse {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginModelType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginModelType.java
index 00708b6e..d3785c68 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginModelType.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/LoginModelType.java
@@ -21,7 +21,7 @@ import cn.hutool.core.util.StrUtil;
/**
* 登陆类型
*
- * @author Parker
+ * @author Pace
* @date 2022-07-21 2:07 PM
**/
public enum LoginModelType {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/OptionsType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/OptionsType.java
index d735691f..fdc964d0 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/OptionsType.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/OptionsType.java
@@ -18,7 +18,7 @@ package org.opsli.common.enums;
/**
* 参数类型
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public enum OptionsType {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/SystemInfo.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/SystemInfo.java
index 6677d875..479c53be 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/SystemInfo.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/SystemInfo.java
@@ -20,7 +20,7 @@ import java.util.UUID;
/**
* 通过单例 模式 生成系统唯一标示
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public enum SystemInfo {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ValidatorType.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ValidatorType.java
index 09177308..6d1c0f4c 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ValidatorType.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/enums/ValidatorType.java
@@ -19,7 +19,7 @@ package org.opsli.common.enums;
/**
* 通过单例 模式 生成系统唯一标示
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public enum ValidatorType {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/EmptyException.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/EmptyException.java
index 5df9f0b2..6d9b5adf 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/EmptyException.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/EmptyException.java
@@ -19,7 +19,7 @@ package org.opsli.common.exception;
/**
* 空异常
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public class EmptyException extends ServiceException{
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/JwtException.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/JwtException.java
index 6ca8949e..ca905d7c 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/JwtException.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/JwtException.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* Jwt 异常
*
- * @author Parker
+ * @author Pace
* @date 2020-09-17 23:40
*/
public class JwtException extends ServiceException {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/ServiceException.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/ServiceException.java
index 1839a6ab..002f9922 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/ServiceException.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/ServiceException.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 框架服务异常
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:41
*/
public class ServiceException extends RuntimeException{
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/TokenException.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/TokenException.java
index d4701986..4fbe7f99 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/TokenException.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/TokenException.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 认证 异常
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:41
*/
public class TokenException extends ServiceException {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/WafException.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/WafException.java
index 3e89c29e..a6e44c8f 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/WafException.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/exception/WafException.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* Java 防火墙 异常类
*
- * @author Parker
+ * @author Pace
* @date 2020-10-09
*/
public class WafException extends ServiceException {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/CommonMsg.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/CommonMsg.java
index 23803f3c..22bc4fd7 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/CommonMsg.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/CommonMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 核心类 - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:41
*/
public enum CommonMsg implements BaseMsg {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/ValidatorMsg.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/ValidatorMsg.java
index f62ea260..3384045a 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/ValidatorMsg.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/msg/ValidatorMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 参数验证 - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public enum ValidatorMsg implements BaseMsg {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutor.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutor.java
index 6139577d..2f4c7f43 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutor.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutor.java
@@ -20,7 +20,7 @@ import java.util.function.Function;
/**
* 异步进程 执行器
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日13:43:37
*/
public interface AsyncProcessExecutor {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByNormal.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByNormal.java
index d623c5e0..fcd0de0d 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByNormal.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByNormal.java
@@ -27,7 +27,7 @@ import java.util.function.Function;
/**
* 多线程锁执行器 正常处理
*
- * @author Parker
+ * @author Pace
* @date 2020-12-10 10:36
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByWait.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByWait.java
index 0676a566..9c7d9037 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByWait.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorByWait.java
@@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* 用于当前方法中复杂业务多线程处理,等待线程执行完毕后 获得统一结果
* 2021年11月2日14:07:54 重构 多线程异步等待执行器
*
- * @author Parker
+ * @author Pace
* @date 2020-12-10 10:36
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorFactory.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorFactory.java
index ca05231e..16335f8f 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorFactory.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorFactory.java
@@ -3,7 +3,7 @@ package org.opsli.common.thread;
/**
* 异步进程 执行器 工厂
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日13:43:37
*/
public final class AsyncProcessExecutorFactory {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorOldByWait.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorOldByWait.java
index 71ae43e3..ee743db8 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorOldByWait.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessExecutorOldByWait.java
@@ -31,7 +31,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* 多线程锁执行器
* 用于当前方法中复杂业务多线程处理,等待线程执行完毕后 获得统一结果
*
- * @author Parker
+ * @author Pace
* @date 2020-12-10 10:36
*/
@Slf4j
@@ -144,7 +144,7 @@ public class AsyncProcessExecutorOldByWait implements AsyncProcessExecutor {
/**
* 线程锁对象
*
- * @author Parker
+ * @author Pace
* @date 2020-10-08 10:24
*/
@Getter
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessor.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessor.java
index cd202149..5a455e71 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessor.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/AsyncProcessor.java
@@ -29,7 +29,7 @@ import java.util.function.Function;
/**
* 自定义线程执行器 - 等待线程执行完毕不拒绝
*
- * @author Parker
+ * @author Pace
* @date 2020-10-08 10:24
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/SyncProcessSingleExecutor.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/SyncProcessSingleExecutor.java
index 71f0c4dd..0c4d77a9 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/SyncProcessSingleExecutor.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/SyncProcessSingleExecutor.java
@@ -26,7 +26,7 @@ import java.util.concurrent.ExecutorService;
/**
* 单线程池
*
- * @author Parker
+ * @author Pace
* @date 2021/8/27 17:00
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/ThreadPoolFactory.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/ThreadPoolFactory.java
index 15031c85..28d202e7 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/ThreadPoolFactory.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/thread/ThreadPoolFactory.java
@@ -9,7 +9,7 @@ import java.util.concurrent.*;
/**
* 线程池工厂
*
- * @author Parker
+ * @author Pace
* @date 2021/11/2 10:48
*/
public final class ThreadPoolFactory {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/BigDecimalUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/BigDecimalUtil.java
index cce84045..b3bf4e46 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/BigDecimalUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/BigDecimalUtil.java
@@ -20,7 +20,7 @@ import java.math.BigDecimal;
/**
* 小数精度处理工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
public class BigDecimalUtil {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ConvertBytesUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ConvertBytesUtil.java
index 3523f969..fbaf14b0 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ConvertBytesUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ConvertBytesUtil.java
@@ -18,7 +18,7 @@ package org.opsli.common.utils;
/**
* 字节转换
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
public final class ConvertBytesUtil {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/FieldUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/FieldUtil.java
index d6ce39c5..f477a083 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/FieldUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/FieldUtil.java
@@ -26,7 +26,7 @@ import java.util.function.Function;
/**
* 字段处理工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
public final class FieldUtil {
@@ -115,36 +115,67 @@ public final class FieldUtil {
* @return String
*/
public static String getFileName(SFunction fn) {
- // 从function取出序列化方法
- Method writeReplaceMethod;
- try {
- writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
+ if (fn == null) {
+ throw new IllegalArgumentException("Function cannot be null");
}
- // 从序列化方法取出序列化的lambda信息
- boolean isAccessible = writeReplaceMethod.isAccessible();
- writeReplaceMethod.setAccessible(true);
- SerializedLambda serializedLambda;
try {
- serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
+ // 获取writeReplace方法
+ Method writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
+
+ // 使用新的canAccess API替代isAccessible
+ boolean wasAccessible = writeReplaceMethod.canAccess(fn);
+ if (!wasAccessible) {
+ writeReplaceMethod.setAccessible(true);
+ }
+
+ try {
+ // 获取序列化Lambda信息
+ SerializedLambda serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
+
+ // 提取并转换字段名
+ return extractFieldName(serializedLambda.getImplMethodName());
+
+ } finally {
+ // 恢复原始访问性
+ if (!wasAccessible) {
+ writeReplaceMethod.setAccessible(false);
+ }
+ }
+
+ } catch (NoSuchMethodException e) {
+ throw new IllegalArgumentException("Invalid lambda function: missing writeReplace method", e);
} catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
+ throw new RuntimeException("Failed to extract lambda information", e);
+ }
+ }
+
+ /**
+ * 从方法名提取字段名
+ * 支持 get/is/has 等前缀
+ */
+ private static String extractFieldName(String methodName) {
+ if (methodName == null || methodName.isEmpty()) {
+ throw new IllegalArgumentException("Method name cannot be null or empty");
+ }
+
+ String fieldName;
+
+ // 处理不同的getter前缀
+ if (methodName.startsWith("get") && methodName.length() > 3) {
+ fieldName = methodName.substring(3);
+ } else if (methodName.startsWith("is") && methodName.length() > 2) {
+ fieldName = methodName.substring(2);
+ } else if (methodName.startsWith("has") && methodName.length() > 3) {
+ fieldName = methodName.substring(3);
+ } else {
+ // 如果不是标准getter,直接返回方法名
+ return methodName;
}
- writeReplaceMethod.setAccessible(isAccessible);
-
- // 从lambda信息取出method、field、class等
- String fieldName = serializedLambda.getImplMethodName().substring("get".length());
- fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase());
-// Field field;
-// try {
-// field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName);
-// } catch (ClassNotFoundException | NoSuchFieldException e) {
-// throw new RuntimeException(e);
-// }
-
- return fieldName;
+
+ // 首字母小写
+ return Character.toLowerCase(fieldName.charAt(0)) + fieldName.substring(1);
+
}
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/IPUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/IPUtil.java
index 667b9172..d6ae1cd3 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/IPUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/IPUtil.java
@@ -18,12 +18,12 @@ package org.opsli.common.utils;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.StrUtil;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
/**
* IP 工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
public final class IPUtil {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ListDistinctUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ListDistinctUtil.java
index 996bc48b..4fc9c46d 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ListDistinctUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ListDistinctUtil.java
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
/**
* List 去重
*
- * @author Parker
+ * @author Pace
* @date 2021-01-05 14:26
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/MessUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/MessUtil.java
index e425a8c5..64e074af 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/MessUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/MessUtil.java
@@ -24,7 +24,7 @@ import java.util.regex.Pattern;
/**
* 获得 占位符中的内容
*
- * @author Parker
+ * @author Pace
* @date 2021年6月2日15:41:36
*/
public class MessUtil {
@@ -48,7 +48,7 @@ public class MessUtil {
}
/**
- * 组装信息
+ * 组装信息
* @param soap 原始信息
* @param regex 条件 占位符
* @param startStr 删除掉的内容
@@ -86,4 +86,4 @@ public class MessUtil {
}
-}
\ No newline at end of file
+}
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/OutputStreamUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/OutputStreamUtil.java
index bb5ecdfa..93c2f62e 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/OutputStreamUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/OutputStreamUtil.java
@@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.opsli.common.exception.ServiceException;
import org.opsli.common.msg.CommonMsg;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
@@ -29,7 +29,7 @@ import java.nio.charset.StandardCharsets;
/**
* OutputStream 处理
*
- * @author Parker
+ * @author Pace
* @date 2021-01-05 14:26
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/PackageUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/PackageUtil.java
index b0c52c3d..3ec190f8 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/PackageUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/PackageUtil.java
@@ -25,7 +25,7 @@ import java.util.jar.JarInputStream;
/**
* 名称空间实用工具
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
public final class PackageUtil {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/Props.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/Props.java
index b5836495..c79df08e 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/Props.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/Props.java
@@ -68,7 +68,7 @@ import java.util.concurrent.ConcurrentHashMap;
* 针对 hutool 工具类 Props不是很有好, 重新写了自定义Yaml工具类
*
*
- * @author Parker
+ * @author Pace
* @date 2021-01-05 14:26
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/RateLimiterUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/RateLimiterUtil.java
index c47c2a80..474c36ae 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/RateLimiterUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/RateLimiterUtil.java
@@ -26,7 +26,7 @@ import lombok.extern.slf4j.Slf4j;
import org.opsli.common.thread.AsyncProcessExecutor;
import org.opsli.common.thread.AsyncProcessExecutorFactory;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit;
/**
* 单机限流
*
- * @author Parker
+ * @author Pace
* @date 2021-01-05 16:06
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/UniqueStrGeneratorUtils.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/UniqueStrGeneratorUtils.java
index 0b4ccc3d..a1f1e6fb 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/UniqueStrGeneratorUtils.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/UniqueStrGeneratorUtils.java
@@ -21,7 +21,7 @@ import cn.hutool.core.util.RandomUtil;
* 唯一字符串生成器
* 参考 ...
*
- * @author Parker
+ * @author Pace
* @date 2022年07月11日 14:07
*/
public final class UniqueStrGeneratorUtils {
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/WrapperUtil.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/WrapperUtil.java
index 6f913da1..e8882526 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/WrapperUtil.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/WrapperUtil.java
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
* 转化对象工具类
* 用于 Wrapper 对象 转化为本地对象,或者本地对象转化为Wrapper对象
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 00:08
*/
@Slf4j
diff --git a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ZipUtils.java b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ZipUtils.java
index 4f650b98..9bfff8cf 100644
--- a/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ZipUtils.java
+++ b/opsli-base-support/opsli-common/src/main/java/org/opsli/common/utils/ZipUtils.java
@@ -29,7 +29,7 @@ import java.util.zip.ZipOutputStream;
/**
* 文件流转压缩包工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-01-07
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/pom.xml b/opsli-base-support/opsli-core/pom.xml
index 2771ce97..53d2ae18 100644
--- a/opsli-base-support/opsli-core/pom.xml
+++ b/opsli-base-support/opsli-core/pom.xml
@@ -76,13 +76,6 @@
${plugins.version}
-
-
- org.opsliframework.boot
- opsli-plugins-ehcache
- ${plugins.version}
-
-
org.opsliframework.boot
@@ -115,59 +108,44 @@
com.baomidou
- mybatis-plus-boot-starter
+ mybatis-plus-spring-boot3-starter
-
- org.opsliframework.boot
- opsli-plugins-pagehelper
- ${pagehelper.version}
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
com.alibaba
- druid-spring-boot-starter
+ druid-spring-boot-3-starter
com.baomidou
- dynamic-datasource-spring-boot-starter
+ dynamic-datasource-spring-boot3-starter
- mysql
- mysql-connector-java
- ${mysql.version}
+ com.mysql
+ mysql-connector-j
runtime
-
-
-
- com.google.protobuf
- protobuf-java
-
-
-
-
-
- com.google.protobuf
- protobuf-java
com.microsoft.sqlserver
- sqljdbc4
+ mssql-jdbc
runtime
- com.oracle
- ojdbc6
+ com.oracle.database.jdbc
+ ojdbc11
runtime
@@ -176,7 +154,6 @@
org.postgresql
postgresql
runtime
- ${postgresql.version}
@@ -190,6 +167,12 @@
net.java.dev.jna
jna-platform
+
+ net.jcip
+ jcip-annotations
+ RELEASE
+ compile
+
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiRequestMappingHandlerMapping.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiRequestMappingHandlerMapping.java
index 16f0a668..00b02929 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiRequestMappingHandlerMapping.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiRequestMappingHandlerMapping.java
@@ -12,7 +12,7 @@ import java.util.Objects;
/**
* 重写RequestMappingHandlerMapping,自定义匹配的处理器
*
- * @author Parker
+ * @author Pace
* @date 2021年10月27日12:40:45
*/
public class ApiRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@@ -41,4 +41,4 @@ public class ApiRequestMappingHandlerMapping extends RequestMappingHandlerMappin
return new ApiVersionCondition(value);
}
-}
\ No newline at end of file
+}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiVersionCondition.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiVersionCondition.java
index 738c1c7c..dfc26f24 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiVersionCondition.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/api/ApiVersionCondition.java
@@ -4,7 +4,7 @@ import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.mvc.condition.RequestCondition;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -12,7 +12,7 @@ import java.util.regex.Pattern;
* API 版本条件
* 重写
*
- * @author Parker
+ * @author Pace
* @date 2021年10月27日12:39:09
*/
@Data
@@ -60,4 +60,4 @@ public class ApiVersionCondition implements RequestCondition headers
+ // 默认关闭 Security 的 xss防护,与系统本身的 xss防护冲突
+ .httpStrictTransportSecurity(HeadersConfigurer.HstsConfig::disable)
+ // 允许Iframe加载
+ .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)
+ )
+ // 关闭csrf token认证不需要csrf防护
+ .csrf(AbstractHttpConfigurer::disable)
+ // 关闭Session会话管理器 JWT 不需要
+ .sessionManagement(session -> session
+ .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ )
+ // 关闭记住我功能 JWT 不需要
+ .rememberMe(AbstractHttpConfigurer::disable);
+
+ // 初始化 授权请求配置
this.initAuthorizeRequests(http);
+
+ return http.build();
}
/**
@@ -84,55 +94,89 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
private void initAuthorizeRequests(HttpSecurity http) throws Exception {
// 设置URL白名单
List permitAll = authProperties.getUrlExclusion().getPermitAll();
- if(null != permitAll){
- String[] urlExclusionArray = permitAll.toArray(new String[0]);
- http.authorizeRequests()
- // URL 白名单
- .antMatchers(urlExclusionArray).permitAll();
- }
+ http.authorizeHttpRequests(authz -> {
+ // 处理其他白名单路径
+ if (permitAll != null && !permitAll.isEmpty()) {
+ String[] urlArray = permitAll.toArray(new String[0]);
+ authz.requestMatchers(urlArray).permitAll();
+ }
- // 除上面外的所有请求全部需要鉴权认证
- http.authorizeRequests()
- .anyRequest().authenticated();
+ // 其他请求需要认证
+ authz.anyRequest().authenticated();
+ });
// 添加过滤器
// 注意 自定义 Filter 不要交给 Spring管理
http.addFilterBefore(new JwtAuthenticationTokenFilter(uidUserDetailDetailService),
UsernamePasswordAuthenticationFilter.class);
-
-
// 异常处理
- http.exceptionHandling()
+ http.exceptionHandling(exceptions -> exceptions
.accessDeniedHandler(accessDeniedHandler)
- .authenticationEntryPoint(authenticationEntryPoint);
+ .authenticationEntryPoint(authenticationEntryPoint)
+ );
}
/**
- * 认证管理器
+ * 主要的认证管理器 - 使用自定义的多Provider实现
+ * 移除了默认的 AuthenticationManager Bean,避免循环依赖
*/
@Bean
- @Override
- public AuthenticationManager authenticationManagerBean() throws Exception {
- return super.authenticationManagerBean();
+ @Primary
+ public AuthenticationManager authenticationManager() {
+ // 延迟获取 AuthenticationProvider,避免循环依赖
+ return new LazyAuthenticationManager();
}
-
- @Override
- protected AuthenticationManager authenticationManager() {
- // 设置 多Provider
- Map providerMap =
- SpringUtil.getBeansOfType(AuthenticationProvider.class);
- List authenticationProviderList =
- Lists.newArrayListWithCapacity(providerMap.size());
- for (Map.Entry providerEntry : providerMap.entrySet()) {
- authenticationProviderList.add(providerEntry.getValue());
+ /**
+ * 延迟初始化的认证管理器,避免循环依赖
+ */
+ private static class LazyAuthenticationManager implements AuthenticationManager {
+
+ private volatile AuthenticationManager delegate;
+
+ @Override
+ public org.springframework.security.core.Authentication authenticate(
+ org.springframework.security.core.Authentication authentication)
+ throws org.springframework.security.core.AuthenticationException {
+
+ if (delegate == null) {
+ synchronized (this) {
+ if (delegate == null) {
+ delegate = createAuthenticationManager();
+ }
+ }
+ }
+ return delegate.authenticate(authentication);
}
- ProviderManager authenticationManager = new ProviderManager(authenticationProviderList);
- //不擦除认证密码,擦除会导致TokenBasedRememberMeServices因为找不到Credentials再调用UserDetailsService而抛出UsernameNotFoundException
- authenticationManager.setEraseCredentialsAfterAuthentication(false);
- return authenticationManager;
+ private AuthenticationManager createAuthenticationManager() {
+ // 获取所有的 AuthenticationProvider
+ Map providerMap =
+ SpringUtil.getBeansOfType(AuthenticationProvider.class);
+
+ List authenticationProviderList =
+ Lists.newArrayListWithCapacity(providerMap.size());
+
+ for (Map.Entry providerEntry : providerMap.entrySet()) {
+ authenticationProviderList.add(providerEntry.getValue());
+ }
+
+ // 如果没有自定义Provider,使用默认配置
+ if (authenticationProviderList.isEmpty()) {
+ try {
+ AuthenticationConfiguration authConfig =
+ SpringUtil.getBean(AuthenticationConfiguration.class);
+ return authConfig.getAuthenticationManager();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to create default AuthenticationManager", e);
+ }
+ }
+
+ ProviderManager authenticationManager = new ProviderManager(authenticationProviderList);
+ // 不擦除认证密码,擦除会导致TokenBasedRememberMeServices因为找不到Credentials再调用UserDetailsService而抛出UsernameNotFoundException
+ authenticationManager.setEraseCredentialsAfterAuthentication(false);
+ return authenticationManager;
+ }
}
-
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringDocConfig.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringDocConfig.java
new file mode 100644
index 00000000..2804ecd1
--- /dev/null
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringDocConfig.java
@@ -0,0 +1,47 @@
+package org.opsli.core.autoconfigure.conf;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SpringDocConfig {
+
+ private static final String SECURITY_SCHEME_NAME = "OPSLI-Authorization";
+ @Bean
+ public OpenAPI OpenApi() {
+ OpenAPI openApi = new OpenAPI();
+ openApi.info(new Info()
+ .title("OPSLI 快速开发平台-API")
+ .summary("OPSLI 快速开发平台基于springboot、vue、element-ui ,项目采用前后端分离架构,热插拔式业务模块与插件扩展性高 ,代码简洁,功能丰富,开箱即用")
+ .description("用于可在线调试OPSLI后端接口")
+ .contact(new Contact()
+ .name("OPSLI 快速开发平台")
+ .url("http://www.opsli.com")
+ .email("meet.pace@foxmail.com")
+ )
+ .version("3.0.1")
+ .license(new License().name("Apache 2.0").url("http://www.opsli.com")));
+ openApi.externalDocs(new ExternalDocumentation()
+ .description("OPSLi 快速开发平台官方文档")
+ .url("https://wiki.opsli.bedebug.com/docs/opsliopsli-1e29udgrb4hog/opsli-1c83h9o28e1cm"));
+ openApi.addSecurityItem(new SecurityRequirement().addList(SECURITY_SCHEME_NAME));
+ openApi.components(new Components()
+ .addSecuritySchemes(SECURITY_SCHEME_NAME
+ , new SecurityScheme()
+ .name("T-Authorization")
+ .type(SecurityScheme.Type.APIKEY)
+ //.scheme("Bearer")
+ .bearerFormat("JWT")
+ .in(SecurityScheme.In.HEADER)));
+ return openApi;
+ }
+
+}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringWebMvcConfig.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringWebMvcConfig.java
index df2e8ec6..a3f144b6 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringWebMvcConfig.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SpringWebMvcConfig.java
@@ -27,12 +27,12 @@ import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
/**
* 配置统一的后台接口访问路径的前缀
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SwaggerConfig.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SwaggerConfig.java
index 15d40cb4..e7d30c0a 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SwaggerConfig.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/conf/SwaggerConfig.java
@@ -1,199 +1,199 @@
-/**
- * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com
- *
- * 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
- *
- * 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.opsli.core.autoconfigure.conf;
-
-import com.fasterxml.classmate.TypeResolver;
-import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
-import com.google.common.collect.Lists;
-import io.swagger.annotations.ApiOperation;
-import org.opsli.core.autoconfigure.properties.GlobalProperties;
-import org.opsli.core.utils.UserTokenUtil;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.util.ReflectionUtils;
-import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
-import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.ParameterBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.schema.ModelRef;
-import springfox.documentation.service.*;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spi.service.contexts.SecurityContext;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
-import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-import javax.annotation.Resource;
-import java.lang.reflect.Field;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Swagger 配置类
- *
- * @author Parker
- * @date 2020-09-15
- */
-@Configuration
-@EnableSwagger2
-@EnableKnife4j
-@Import(BeanValidatorPluginsConfiguration.class)
-public class SwaggerConfig {
-
- /** 配置类 */
- @Resource
- private GlobalProperties globalProperties;
-
- private final TypeResolver typeResolver;
-
- @Autowired
- public SwaggerConfig(TypeResolver typeResolver) {
- this.typeResolver = typeResolver;
- }
-
- // ========================= Swagger =========================
-
- /**
- * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
- *
- * @return Docket
- */
- @Bean
- public Docket createRestApi() {
- return new Docket(DocumentationType.SWAGGER_2)
- .apiInfo(apiInfo())
- .groupName("opsli 2.X")
- .select()
- //此包路径下的类,才生成接口文档
- .apis(RequestHandlerSelectors.basePackage("org.opsli"))
- //加了ApiOperation注解的类,才生成接口文档
- .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
- .paths(PathSelectors.any())
- .build()
- .securityContexts(Lists.newArrayList(securityContext()))
- .securitySchemes(Lists.newArrayList(apiKey()));
-
- }
-
-
- /**
- * api文档的详细信息函数,注意这里的注解引用的是哪个
- *
- * @return ApiInfo
- */
- private ApiInfo apiInfo() {
- return new ApiInfoBuilder()
- // //大标题
- .title(globalProperties.getSystemName() + " 服务API接口文档")
- // 版本号
- .version("1.0")
- // 描述
- .description("后台API接口")
- // 作者
- .contact(new Contact("Parker", "https://opsli.com", "meet.parker@foxmail.com"))
- .license("The Apache License, Version 2.0")
- .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
- .build();
- }
-
-
- /**
- * 安全模块
- * @return SecurityContext
- */
- private SecurityContext securityContext() {
- return SecurityContext.builder()
- .securityReferences(defaultAuth())
- .forPaths(PathSelectors.regex("/.*"))
- .build();
- }
-
- /**
- * jwt token
- * @return List
- */
- private List defaultToken() {
- ParameterBuilder parameterBuilder = new ParameterBuilder();
- List parameters= Lists.newArrayList();
- parameterBuilder.name(UserTokenUtil.TOKEN_NAME)
- .description("Token 令牌")
- .modelRef(new ModelRef("String"))
- .parameterType("header")
- .required(false).build();
- parameters.add(parameterBuilder.build());
- return parameters;
- }
-
- /**
- * oauth2 授权
- * @return List
- */
- List defaultAuth() {
- AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
- AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
- authorizationScopes[0] = authorizationScope;
- return Lists.newArrayList(new SecurityReference(UserTokenUtil.TOKEN_NAME, authorizationScopes));
- }
-
- private ApiKey apiKey() {
- return new ApiKey(UserTokenUtil.TOKEN_NAME, UserTokenUtil.TOKEN_NAME, "header");
- }
-
- /**
- * 解决springboot2.6 和springfox不兼容问题
- * @return
- */
- @Bean
- public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
- return new BeanPostProcessor() {
-
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
- customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
- }
- return bean;
- }
-
- private void customizeSpringfoxHandlerMappings(List mappings) {
- List copy = mappings.stream()
- .filter(mapping -> mapping.getPatternParser() == null)
- .collect(Collectors.toList());
- mappings.clear();
- mappings.addAll(copy);
- }
-
- @SuppressWarnings("unchecked")
- private List getHandlerMappings(Object bean) {
- try {
- Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
- field.setAccessible(true);
- return (List) field.get(bean);
- } catch (IllegalArgumentException | IllegalAccessException e) {
- throw new IllegalStateException(e);
- }
- }
- };
- }
-
-}
+///**
+// * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com
+// *
+// * 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
+// *
+// * 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.opsli.core.autoconfigure.conf;
+//
+//import com.fasterxml.classmate.TypeResolver;
+//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+//import com.google.common.collect.Lists;
+//import io.swagger.annotations.ApiOperation;
+//import org.opsli.core.autoconfigure.properties.GlobalProperties;
+//import org.opsli.core.utils.UserTokenUtil;
+//import org.springframework.beans.BeansException;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.config.BeanPostProcessor;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Import;
+//import org.springframework.util.ReflectionUtils;
+//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
+//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
+//import springfox.documentation.builders.ApiInfoBuilder;
+//import springfox.documentation.builders.ParameterBuilder;
+//import springfox.documentation.builders.PathSelectors;
+//import springfox.documentation.builders.RequestHandlerSelectors;
+//import springfox.documentation.schema.ModelRef;
+//import springfox.documentation.service.*;
+//import springfox.documentation.spi.DocumentationType;
+//import springfox.documentation.spi.service.contexts.SecurityContext;
+//import springfox.documentation.spring.web.plugins.Docket;
+//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
+//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
+//import springfox.documentation.swagger2.annotations.EnableSwagger2;
+//
+//import jakarta.annotation.Resource;
+//import java.lang.reflect.Field;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//
+///**
+// * Swagger 配置类
+// *
+// * @author Pace
+// * @date 2020-09-15
+// */
+//@Configuration
+//@EnableSwagger2
+//@EnableKnife4j
+//@Import(BeanValidatorPluginsConfiguration.class)
+//public class SwaggerConfig {
+//
+// /** 配置类 */
+// @Resource
+// private GlobalProperties globalProperties;
+//
+// private final TypeResolver typeResolver;
+//
+// @Autowired
+// public SwaggerConfig(TypeResolver typeResolver) {
+// this.typeResolver = typeResolver;
+// }
+//
+// // ========================= Swagger =========================
+//
+// /**
+// * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
+// *
+// * @return Docket
+// */
+// @Bean
+// public Docket createRestApi() {
+// return new Docket(DocumentationType.SWAGGER_2)
+// .apiInfo(apiInfo())
+// .groupName("opsli 2.X")
+// .select()
+// //此包路径下的类,才生成接口文档
+// .apis(RequestHandlerSelectors.basePackage("org.opsli"))
+// //加了ApiOperation注解的类,才生成接口文档
+// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+// .paths(PathSelectors.any())
+// .build()
+// .securityContexts(Lists.newArrayList(securityContext()))
+// .securitySchemes(Lists.newArrayList(apiKey()));
+//
+// }
+//
+//
+// /**
+// * api文档的详细信息函数,注意这里的注解引用的是哪个
+// *
+// * @return ApiInfo
+// */
+// private ApiInfo apiInfo() {
+// return new ApiInfoBuilder()
+// // //大标题
+// .title(globalProperties.getSystemName() + " 服务API接口文档")
+// // 版本号
+// .version("1.0")
+// // 描述
+// .description("后台API接口")
+// // 作者
+// .contact(new Contact("Parker", "https://opsli.com", "meet.parker@foxmail.com"))
+// .license("The Apache License, Version 2.0")
+// .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
+// .build();
+// }
+//
+//
+// /**
+// * 安全模块
+// * @return SecurityContext
+// */
+// private SecurityContext securityContext() {
+// return SecurityContext.builder()
+// .securityReferences(defaultAuth())
+// .forPaths(PathSelectors.regex("/.*"))
+// .build();
+// }
+//
+// /**
+// * jwt token
+// * @return List
+// */
+// private List defaultToken() {
+// ParameterBuilder parameterBuilder = new ParameterBuilder();
+// List parameters= Lists.newArrayList();
+// parameterBuilder.name(UserTokenUtil.TOKEN_NAME)
+// .description("Token 令牌")
+// .modelRef(new ModelRef("String"))
+// .parameterType("header")
+// .required(false).build();
+// parameters.add(parameterBuilder.build());
+// return parameters;
+// }
+//
+// /**
+// * oauth2 授权
+// * @return List
+// */
+// List defaultAuth() {
+// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+// authorizationScopes[0] = authorizationScope;
+// return Lists.newArrayList(new SecurityReference(UserTokenUtil.TOKEN_NAME, authorizationScopes));
+// }
+//
+// private ApiKey apiKey() {
+// return new ApiKey(UserTokenUtil.TOKEN_NAME, UserTokenUtil.TOKEN_NAME, "header");
+// }
+//
+// /**
+// * 解决springboot2.6 和springfox不兼容问题
+// * @return
+// */
+// @Bean
+// public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
+// return new BeanPostProcessor() {
+//
+// @Override
+// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+// if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
+// customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
+// }
+// return bean;
+// }
+//
+// private void customizeSpringfoxHandlerMappings(List mappings) {
+// List copy = mappings.stream()
+// .filter(mapping -> mapping.getPatternParser() == null)
+// .collect(Collectors.toList());
+// mappings.clear();
+// mappings.addAll(copy);
+// }
+//
+// @SuppressWarnings("unchecked")
+// private List getHandlerMappings(Object bean) {
+// try {
+// Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
+// field.setAccessible(true);
+// return (List) field.get(bean);
+// } catch (IllegalArgumentException | IllegalAccessException e) {
+// throw new IllegalStateException(e);
+// }
+// }
+// };
+// }
+//
+//}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java
index ea893870..9fb0e7ae 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java
@@ -24,7 +24,7 @@ import org.springframework.stereotype.Component;
/**
* 接口路径前缀配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Configuration
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java
index 16e074dc..46afe445 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java
@@ -24,7 +24,7 @@ import org.springframework.stereotype.Component;
/**
* 接口路径前缀配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Configuration
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/DbSourceProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/DbSourceProperties.java
index 056c7b28..460dadae 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/DbSourceProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/DbSourceProperties.java
@@ -2,7 +2,7 @@ package org.opsli.core.autoconfigure.properties;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
-import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.google.common.collect.Maps;
import lombok.Data;
@@ -16,7 +16,7 @@ import java.util.Map;
/**
* 获得数据源工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java
index 8e21aec1..72d61e72 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java
@@ -8,7 +8,7 @@ import org.springframework.context.annotation.Configuration;
/**
* 加密配置加载
*
- * @author Parker
+ * @author Pace
* @date 2022-08-07
*/
@Configuration
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java
index 3dd47515..0db6a203 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/GlobalProperties.java
@@ -11,7 +11,7 @@ import java.util.Set;
/**
* OPSLI 配置文件
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
**/
@Configuration
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java
index 38d3bd1e..432efbb7 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java
@@ -24,7 +24,7 @@ import org.springframework.stereotype.Component;
/**
* Token配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Configuration
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java
index b61dd0ba..0018b86e 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/controller/BaseRestController.java
@@ -21,13 +21,13 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
+import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.support.ExcelTypeEnum;
-import com.alibaba.excel.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@@ -66,8 +66,10 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -76,7 +78,7 @@ import java.util.function.Function;
/**
* 默认 范型引用 子类的Service , 为简单的CRUD做足准备
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Slf4j
@@ -124,7 +126,7 @@ public abstract class BaseRestController itr = request.getFileNames();
String uploadedFile = itr.next();
List files = request.getFiles(uploadedFile);
- if (CollectionUtils.isEmpty(files)) {
+ if (CollUtil.isEmpty(files)) {
// 请选择文件
return ResultWrapper.getCustomResultWrapper(CoreMsg.EXCEL_FILE_NULL);
}
@@ -366,6 +368,7 @@ public abstract class BaseRestController , T extends BaseEntity>
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/impl/CrudServiceImpl.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/impl/CrudServiceImpl.java
index f3e11f20..5b424b09 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/impl/CrudServiceImpl.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/impl/CrudServiceImpl.java
@@ -42,7 +42,7 @@ import org.opsli.core.persistence.querybuilder.conf.WebQueryConf;
import org.springframework.core.GenericTypeResolver;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;
@@ -61,7 +61,7 @@ import java.util.Map;
* 单独按照ID查询数据 和 按照ID修改、删除数据 隔离级别暂时不需要
* 既然能从page列表中看到的数据 则是这个租户的数据
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/BaseServiceInterface.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/BaseServiceInterface.java
index caf6e354..5aee44c2 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/BaseServiceInterface.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/BaseServiceInterface.java
@@ -20,7 +20,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* 基础服务接口
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
public interface BaseServiceInterface extends IService {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/CrudServiceInterface.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/CrudServiceInterface.java
index 2be02a82..56f3d9e8 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/CrudServiceInterface.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/base/service/interfaces/CrudServiceInterface.java
@@ -38,7 +38,7 @@ import java.util.List;
* @param
* @param
*
- * @author Parker
+ * @author Pace
* @date 2020-09-15
*/
public interface CrudServiceInterface extends BaseServiceInterface {
@@ -208,7 +208,7 @@ public interface CrudServiceInterface
*/
Page findPageNotCount(Page page);
-
+
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/CacheUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/CacheUtil.java
index 98e3333e..936e6a7d 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/CacheUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/CacheUtil.java
@@ -30,7 +30,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 缓存工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 16:20
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/SecurityCache.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/SecurityCache.java
index 49ca251d..32aef6ed 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/SecurityCache.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/cache/SecurityCache.java
@@ -42,7 +42,7 @@ import java.util.function.Function;
* 实际业务的话 这两种一般也是足够了
* 依赖于 RedisTemplate 和 LRU cache,多套业务部署 最大穿透次数为 业务服务N次
*
- * @author Parker
+ * @author Pace
* @date 2021/12/10 12:39
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/AbstractSpringEventBus.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/AbstractSpringEventBus.java
index 266b92c9..a3a685e1 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/AbstractSpringEventBus.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/AbstractSpringEventBus.java
@@ -22,7 +22,7 @@ import org.springframework.context.ApplicationContextAware;
/**
* EventBus 与 Spring 打通桥梁
*
- * @author Parker
+ * @author Pace
* @date 2021年12月7日10:39:16
*/
public abstract class AbstractSpringEventBus implements IEventBus, ApplicationContextAware {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventBus.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventBus.java
index 01e6659a..a8d3bfaf 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventBus.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventBus.java
@@ -18,7 +18,7 @@ package org.opsli.core.eventbus;
/**
* EventBus 接口
*
- * @author Parker
+ * @author Pace
* @date 2021年12月7日10:38:24
*/
public interface IEventBus {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventConsumer.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventConsumer.java
index 3bc24f8e..5271b0d9 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventConsumer.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/eventbus/IEventConsumer.java
@@ -18,7 +18,7 @@ package org.opsli.core.eventbus;
/**
* EventBus 消费者接口
*
- * @author Parker
+ * @author Pace
* @date 2020/9/25 12:19
*/
public interface IEventConsumer {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/factory/CodeFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/factory/CodeFactory.java
index 253004b7..bba20f17 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/factory/CodeFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/factory/CodeFactory.java
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
/**
* 编号生成 工厂
*
- * @author parker
+ * @author Pace
* @date 2022/1/13 18:28
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/LimiterAop.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/LimiterAop.java
index 7d4dbc32..ad4dde23 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/LimiterAop.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/LimiterAop.java
@@ -15,7 +15,8 @@
*/
package org.opsli.core.filters.aspect;
-
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
@@ -34,16 +35,25 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
+import java.time.Duration;
+import java.util.concurrent.atomic.LongAdder;
import static org.opsli.common.constants.OrderConstants.LIMITER_AOP_SORT;
/**
- * 限流器
+ * 限流器 - 极致性能优化版本
+ *
+ * 优化要点:
+ * 1. 缓存注解信息避免重复解析
+ * 2. 快速路径优化
+ * 3. 减少对象创建
+ * 4. 优化异常处理
+ * 5. 添加性能监控
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16
*/
@Slf4j
@@ -52,51 +62,171 @@ import static org.opsli.common.constants.OrderConstants.LIMITER_AOP_SORT;
@Component
public class LimiterAop {
+ /** 限流器配置缓存 - 避免重复解析注解 */
+ private static final Cache LIMITER_CONFIG_CACHE = Caffeine.newBuilder()
+ .maximumSize(1000)
+ .expireAfterWrite(Duration.ofHours(1))
+ .build();
+
+ /** 性能统计 */
+ private static final LongAdder PROCESS_COUNT = new LongAdder();
+ private static final LongAdder BLOCKED_COUNT = new LongAdder();
+ private static final LongAdder ERROR_COUNT = new LongAdder();
+
+ /** 预定义的异常实例,避免重复创建 */
+ private static final ServiceException LIMITER_EXCEPTION = new ServiceException(CoreMsg.OTHER_EXCEPTION_LIMITER);
@Pointcut("@annotation(org.opsli.common.annotation.Limiter)")
public void requestMapping() {
}
/**
- * 限流
- * @param point point
+ * 限流处理 - 优化版本
*/
@Before("requestMapping()")
- public void limiterHandle(JoinPoint point){
+ public void limiterHandle(JoinPoint point) {
+ PROCESS_COUNT.increment();
+
try {
- RequestAttributes ra = RequestContextHolder.getRequestAttributes();
- ServletRequestAttributes sra = (ServletRequestAttributes) ra;
- MethodSignature signature = (MethodSignature) point.getSignature();
- Method method = signature.getMethod();
- if(sra != null) {
- HttpServletRequest request = sra.getRequest();
- HttpServletResponse response = sra.getResponse();
- Limiter limiter = method.getAnnotation(Limiter.class);
- if(limiter != null){
- AlertType alertType = limiter.alertType();
- double qps = limiter.qps();
-
- // 限流
- boolean enterFlag = RateLimiterUtil.enter(request, qps);
- if(!enterFlag){
- // alert 弹出
- if(AlertType.ALERT == alertType){
- OutputStreamUtil.exceptionResponse(
- CoreMsg.OTHER_EXCEPTION_LIMITER.getMessage(),
- response
- );
- }else {
- // 异常返回
- throw new ServiceException(CoreMsg.OTHER_EXCEPTION_LIMITER);
- }
- }
- }
+ // 快速获取请求上下文
+ ServletRequestAttributes sra = getServletRequestAttributes();
+ if (sra == null) {
+ return;
+ }
+
+ // 从缓存获取限流配置
+ LimiterConfig config = getLimiterConfig(point);
+ if (config == null) {
+ return;
}
- }catch (ServiceException e){
+
+ // 执行限流检查
+ if (!checkRateLimit(sra.getRequest(), config.qps)) {
+ BLOCKED_COUNT.increment();
+ handleLimitExceeded(sra.getResponse(), config.alertType);
+ }
+
+ } catch (ServiceException e) {
+ ERROR_COUNT.increment();
throw e;
- }catch (Exception e){
- log.error(e.getMessage(),e);
+ } catch (Exception e) {
+ ERROR_COUNT.increment();
+ if (log.isDebugEnabled()) {
+ log.debug("限流器处理异常: {}", e.getMessage(), e);
+ }
+ }
+ }
+
+ /**
+ * 快速获取 ServletRequestAttributes
+ */
+ private ServletRequestAttributes getServletRequestAttributes() {
+ RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+ return (ra instanceof ServletRequestAttributes) ? (ServletRequestAttributes) ra : null;
+ }
+
+ /**
+ * 获取限流配置 - 带缓存优化
+ */
+ private LimiterConfig getLimiterConfig(JoinPoint point) {
+ MethodSignature signature = (MethodSignature) point.getSignature();
+ Method method = signature.getMethod();
+
+ return LIMITER_CONFIG_CACHE.get(method, this::parseLimiterConfig);
+ }
+
+ /**
+ * 解析限流配置
+ */
+ private LimiterConfig parseLimiterConfig(Method method) {
+ Limiter limiter = method.getAnnotation(Limiter.class);
+ if (limiter == null) {
+ return null;
+ }
+
+ return new LimiterConfig(limiter.qps(), limiter.alertType());
+ }
+
+ /**
+ * 执行限流检查
+ */
+ private boolean checkRateLimit(HttpServletRequest request, double qps) {
+ return RateLimiterUtil.enter(request, qps);
+ }
+
+ /**
+ * 处理限流超出
+ */
+ private void handleLimitExceeded(HttpServletResponse response, AlertType alertType) {
+ if (AlertType.ALERT == alertType) {
+ // 直接输出响应,避免异常开销
+ OutputStreamUtil.exceptionResponse(
+ CoreMsg.OTHER_EXCEPTION_LIMITER.getMessage(),
+ response
+ );
+ } else {
+ // 抛出预定义异常,避免重复创建
+ throw LIMITER_EXCEPTION;
+ }
+ }
+
+ /**
+ * 限流配置缓存类 - 不可变对象
+ */
+ private static final class LimiterConfig {
+ final double qps;
+ final AlertType alertType;
+
+ LimiterConfig(double qps, AlertType alertType) {
+ this.qps = qps;
+ this.alertType = alertType;
+ }
+ }
+
+ /**
+ * 获取性能统计信息
+ */
+ public static LimiterStats getStats() {
+ return new LimiterStats(
+ PROCESS_COUNT.sum(),
+ BLOCKED_COUNT.sum(),
+ ERROR_COUNT.sum(),
+ LIMITER_CONFIG_CACHE.estimatedSize()
+ );
+ }
+
+ /**
+ * 性能统计数据类
+ */
+ public static final class LimiterStats {
+ public final long processCount;
+ public final long blockedCount;
+ public final long errorCount;
+ public final long cacheSize;
+ public final double blockRate;
+
+ LimiterStats(long processCount, long blockedCount, long errorCount, long cacheSize) {
+ this.processCount = processCount;
+ this.blockedCount = blockedCount;
+ this.errorCount = errorCount;
+ this.cacheSize = cacheSize;
+ this.blockRate = processCount > 0 ? (double) blockedCount / processCount : 0.0;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "LimiterStats{processCount=%d, blockedCount=%d, errorCount=%d, blockRate=%.2f%%, cacheSize=%d}",
+ processCount, blockedCount, errorCount, blockRate * 100, cacheSize
+ );
}
}
+ /**
+ * 清理缓存
+ */
+ public static void clearCache() {
+ LIMITER_CONFIG_CACHE.invalidateAll();
+ log.info("限流器缓存已清理");
+ }
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SQLDataAop.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SQLDataAop.java
index ce1b2423..70c77d74 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SQLDataAop.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SQLDataAop.java
@@ -29,7 +29,7 @@ import static org.opsli.common.constants.OrderConstants.SQL_ORDER;
/**
* SQL数据 拦截处理
*
- * @author parker
+ * @author Pace
* @date 2020-09-16
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SearchHisAop.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SearchHisAop.java
index 4e81690b..c1db27ae 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SearchHisAop.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/SearchHisAop.java
@@ -30,7 +30,7 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import static org.opsli.common.constants.OrderConstants.SEARCH_HIS_AOP_SORT;
@@ -38,7 +38,7 @@ import static org.opsli.common.constants.OrderConstants.SEARCH_HIS_AOP_SORT;
/**
* 搜索历史 AOP
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/UserCachingOperationNameGenerator.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/UserCachingOperationNameGenerator.java
index f47e3769..8345be2d 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/UserCachingOperationNameGenerator.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/UserCachingOperationNameGenerator.java
@@ -30,7 +30,7 @@ import static com.google.common.collect.Maps.newHashMap;
/**
* 替换组件相同名称方法 切面
*
- * @author Parker
+ * @author Pace
* @date 2021年5月18日13:57:46
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/ValidatorAop.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/ValidatorAop.java
index 49d37a04..ca50a012 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/ValidatorAop.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/aspect/ValidatorAop.java
@@ -29,14 +29,14 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import static org.opsli.common.constants.OrderConstants.VERIFY_ARGS_AOP_SORT;
/**
* 参数校验 拦截处理
*
- * @author parker
+ * @author Pace
* @date 2020-09-16
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisAutoFillInterceptor.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisAutoFillInterceptor.java
index 50e04256..b135cae7 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisAutoFillInterceptor.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisAutoFillInterceptor.java
@@ -20,7 +20,8 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.annotation.TableField;
-import com.google.common.collect.Lists;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.binding.MapperMethod;
@@ -36,8 +37,11 @@ import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
-import java.util.*;
-import java.util.function.Consumer;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
/**
* MyBatis 拦截器 注入属性用
@@ -52,215 +56,363 @@ import java.util.function.Consumer;
*
* 参考地址:https://www.cnblogs.com/qingshan-tang/p/13299701.html
*
- * @author Parker
+ * 2025年06月01日13:15:17 提供性能优化
+ *
+ * @author Pace
* @date 2020-03-01
*/
@Component
@Slf4j
@Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}))
public class MybatisAutoFillInterceptor implements Interceptor {
+ /** 使用 Caffeine 缓存提供更好的性能 */
+ private static final Cache, FieldProcessor> PROCESSOR_CACHE = Caffeine.newBuilder()
+ .maximumSize(1000)
+ .expireAfterAccess(Duration.ofHours(1))
+ .build();
- private static final String ET = "et";
-
- /** 实体类字段 */
- static private final Map, Field[]> ENTITY_FIELD_MAP = new HashMap<>();
+ /** 线程本地缓存,避免重复计算 */
+ private static final ThreadLocal CONTEXT_CACHE =
+ ThreadLocal.withInitial(ProcessorContext::new);
@Override
- public Object intercept(Invocation invocation) throws IllegalAccessException, InvocationTargetException {
- fillField(invocation);
- return invocation.proceed();
+ public Object intercept(Invocation invocation) throws InvocationTargetException, IllegalAccessException {
+ ProcessorContext context = CONTEXT_CACHE.get();
+ try {
+ context.reset();
+ processInvocation(invocation, context);
+ return invocation.proceed();
+ } finally {
+ context.reset();
+ }
}
/**
- * 注入字段
- * @param invocation 源
+ * 处理调用
*/
- private void fillField(Invocation invocation) {
+ private void processInvocation(Invocation invocation, ProcessorContext context) {
Object[] args = invocation.getArgs();
- SqlCommandType sqlCommandType = null;
- for (Object arg : args) {
- //第一个参数处理。根据它判断是否给“操作属性”赋值。
- //如果是第一个参数 MappedStatement
- if (arg instanceof MappedStatement) {
- MappedStatement ms = (MappedStatement) arg;
- sqlCommandType = ms.getSqlCommandType();
- //如果是“增加”或“更新”操作,则继续进行默认操作信息赋值。否则,则退出
- if (sqlCommandType == SqlCommandType.INSERT || sqlCommandType == SqlCommandType.UPDATE) {
- continue;
- } else {
- break;
- }
- }
- if (sqlCommandType == SqlCommandType.INSERT) {
- // 新增
- this.insertFill(arg);
+ MappedStatement ms = (MappedStatement) args[0];
+ Object parameter = args[1];
- } else if (sqlCommandType == SqlCommandType.UPDATE) {
- // 修改
- this.updateFill(arg);
- }
+ if (parameter == null) {
+ return;
+ }
+
+ SqlCommandType commandType = ms.getSqlCommandType();
+ if (commandType != SqlCommandType.INSERT && commandType != SqlCommandType.UPDATE) {
+ return;
+ }
+
+ // 提取真实参数
+ Object realParam = extractRealParameter(parameter);
+ if (realParam == null) {
+ return;
}
+
+ // 获取或创建字段处理器
+ FieldProcessor processor = getFieldProcessor(realParam.getClass());
+
+ // 执行字段处理
+ context.setOperationType(commandType);
+ processor.process(realParam, context);
}
/**
- * 新增数据
- * @param arg 参数
+ * 提取真实参数
*/
- public void insertFill(Object arg) {
- if(arg == null ){
- return;
+ private Object extractRealParameter(Object parameter) {
+ if (parameter instanceof MapperMethod.ParamMap) {
+ MapperMethod.ParamMap> paramMap = (MapperMethod.ParamMap>) parameter;
+ return paramMap.containsKey("et") ? paramMap.get("et") : paramMap.get("param1");
+ }
+ return parameter;
+ }
+
+ /**
+ * 获取字段处理器
+ */
+ private FieldProcessor getFieldProcessor(Class> clazz) {
+ return PROCESSOR_CACHE.get(clazz, this::createFieldProcessor);
+ }
+
+ /**
+ * 创建字段处理器
+ */
+ private FieldProcessor createFieldProcessor(Class> clazz) {
+ return new ReflectionFieldProcessor(clazz);
+ }
+
+ /**
+ * 处理器上下文
+ */
+ private static class ProcessorContext {
+ private SqlCommandType operationType;
+ private Date currentDate;
+ private String userId;
+ private String tenantId;
+ private UserOrgRefModel userOrgRef;
+ private boolean userInfoLoaded = false;
+
+ void reset() {
+ operationType = null;
+ currentDate = null;
+ userId = null;
+ tenantId = null;
+ userOrgRef = null;
+ userInfoLoaded = false;
+ }
+
+ void setOperationType(SqlCommandType type) {
+ this.operationType = type;
+ this.currentDate = DateUtil.date();
+ }
+
+ boolean isInsert() {
+ return operationType == SqlCommandType.INSERT;
}
- // 当前时间
- Date currDate = DateUtil.date();
- final Object argObj = arg;
-
- // 处理字段
- loopHandlerField(argObj, (fieldName)->{
- switch (fieldName) {
- // 创建人、更新人
- case MyBatisConstants.FIELD_CREATE_BY:
- case MyBatisConstants.FIELD_UPDATE_BY:
- // 如果创建人 为空则进行默认赋值
- Object createOrUpdateValue = ReflectUtil.getFieldValue(argObj, fieldName);
- if(StringUtils.isBlank(Convert.toStr(createOrUpdateValue))){
- BeanUtil.setProperty(argObj, fieldName, UserUtil.getUser().getId());
- }
- break;
- // 创建日期、更新日期
- case MyBatisConstants.FIELD_CREATE_TIME:
- case MyBatisConstants.FIELD_UPDATE_TIME:
- BeanUtil.setProperty(argObj, fieldName, currDate);
- break;
- // 乐观锁
- case MyBatisConstants.FIELD_OPTIMISTIC_LOCK:
- BeanUtil.setProperty(argObj, fieldName, DictType.NO_YES_NO.getValue());
- break;
- // 逻辑删除
- case MyBatisConstants.FIELD_DELETE_LOGIC:
- BeanUtil.setProperty(argObj, fieldName, MyBatisConstants.LOGIC_NOT_DELETE_VALUE);
- break;
- // 多租户设置
- case MyBatisConstants.FIELD_TENANT:
- // 2020-12-05 修复当前租户可能为空字符串报错问题
- // 如果租户ID 为空则进行默认赋值
- Object tenantValue = ReflectUtil.getFieldValue(argObj, fieldName);
- if(StringUtils.isBlank(Convert.toStr(tenantValue))){
- BeanUtil.setProperty(argObj, fieldName, UserUtil.getTenantId());
- }
- break;
- // 组织机构设置
- case MyBatisConstants.FIELD_ORG_GROUP:
- // 如果组织IDs 为空则进行默认赋值
- Object orgValue = ReflectUtil.getFieldValue(argObj, fieldName);
- if(StringUtils.isBlank(Convert.toStr(orgValue))){
- UserOrgRefModel userOrgRefModel =
- UserUtil.getUserDefOrgByUserId(UserUtil.getUser().getId());
- if(null != userOrgRefModel){
- String orgIds = userOrgRefModel.getOrgIds();
- BeanUtil.setProperty(argObj, fieldName, orgIds);
- }
- }
- break;
- default:
- break;
+ boolean isUpdate() {
+ return operationType == SqlCommandType.UPDATE;
+ }
+
+ Date getCurrentDate() {
+ return currentDate;
+ }
+
+ synchronized void loadUserInfo() {
+ if (!userInfoLoaded) {
+ try {
+ var user = UserUtil.getUser();
+ userId = user.getId();
+ tenantId = UserUtil.getTenantId();
+ userOrgRef = UserUtil.getUserDefOrgByUserId(userId);
+ } catch (Exception e) {
+ userId = "";
+ tenantId = "";
+ userOrgRef = null;
+ }
+ userInfoLoaded = true;
}
- });
+ }
+
+ String getUserId() {
+ loadUserInfo();
+ return userId;
+ }
+
+ String getTenantId() {
+ loadUserInfo();
+ return tenantId;
+ }
+
+ UserOrgRefModel getUserOrgRef() {
+ loadUserInfo();
+ return userOrgRef;
+ }
}
/**
- * 修改数据
- * @param arg 参数
+ * 字段处理器接口
*/
- public void updateFill(Object arg) {
- if(arg == null ){
- return;
+ private interface FieldProcessor {
+ void process(Object target, ProcessorContext context);
+ }
+
+ /**
+ * 基于反射的字段处理器
+ */
+ private static class ReflectionFieldProcessor implements FieldProcessor {
+ private final FieldHandler[] handlers;
+
+ public ReflectionFieldProcessor(Class> clazz) {
+ this.handlers = buildHandlers(clazz);
}
- // 2020-09-19
- // 修改这儿 有可能会拿到一个 MapperMethod,需要特殊处理
- if (arg instanceof MapperMethod.ParamMap) {
- MapperMethod.ParamMap> paramMap = (MapperMethod.ParamMap>) arg;
- arg = paramMap.containsKey(ET)
- ? paramMap.get(ET)
- : paramMap.get("param1");
- if (arg == null) {
- return;
+ @Override
+ public void process(Object target, ProcessorContext context) {
+ for (FieldHandler handler : handlers) {
+ handler.handle(target, context);
}
}
- // 当前时间
- Date currDate = DateUtil.date();
- final Object argObj = arg;
-
- // 处理字段
- loopHandlerField(argObj, (fieldName)->{
- switch (fieldName) {
- // 更新人
- case MyBatisConstants.FIELD_UPDATE_BY:
- // 如果更新人 为空则进行默认赋值
- Object updateValue = ReflectUtil.getFieldValue(argObj, fieldName);
- if(StringUtils.isBlank(Convert.toStr(updateValue))){
- BeanUtil.setProperty(argObj, fieldName, UserUtil.getUser().getId());
- }
- break;
- // 更新日期
- case MyBatisConstants.FIELD_UPDATE_TIME:
- BeanUtil.setProperty(argObj, fieldName, currDate);
- break;
- default:
- break;
+ private FieldHandler[] buildHandlers(Class> clazz) {
+ Field[] fields = ReflectUtil.getFields(clazz);
+ List handlerList = new ArrayList<>();
+
+ for (Field field : fields) {
+ // 跳过排除字段
+ TableField tableField = field.getAnnotation(TableField.class);
+ if (tableField != null && !tableField.exist()) {
+ continue;
+ }
+
+ FieldHandler handler = createFieldHandler(field);
+ if (handler != null) {
+ handlerList.add(handler);
+ }
}
- });
+
+ return handlerList.toArray(new FieldHandler[0]);
+ }
+
+ private FieldHandler createFieldHandler(Field field) {
+ String fieldName = field.getName();
+ return switch (fieldName) {
+ case MyBatisConstants.FIELD_CREATE_BY -> new CreateByFieldHandler(field);
+ case MyBatisConstants.FIELD_UPDATE_BY -> new UpdateByFieldHandler(field);
+ case MyBatisConstants.FIELD_CREATE_TIME -> new CreateTimeFieldHandler(field);
+ case MyBatisConstants.FIELD_UPDATE_TIME -> new UpdateTimeFieldHandler(field);
+ case MyBatisConstants.FIELD_OPTIMISTIC_LOCK -> new OptimisticLockFieldHandler(field);
+ case MyBatisConstants.FIELD_DELETE_LOGIC -> new DeleteLogicFieldHandler(field);
+ case MyBatisConstants.FIELD_TENANT -> new TenantFieldHandler(field);
+ case MyBatisConstants.FIELD_ORG_GROUP -> new OrgGroupFieldHandler(field);
+ default -> null;
+ };
+ }
}
/**
- * 循环处理字段
- *
- * @param arg 参数
- * @param callback 回调函数
+ * 字段处理器基类
*/
- private void loopHandlerField(Object arg, Consumer callback){
- // 排除字段
- List existField = Lists.newArrayList();
-
- // 字段缓存 减少每次更新 反射
- Field[] fields = ENTITY_FIELD_MAP.get(arg.getClass());
- if(fields == null){
- fields = ReflectUtil.getFields(arg.getClass());
- ENTITY_FIELD_MAP.put(arg.getClass(), fields);
+ private abstract static class FieldHandler {
+ protected final Field field;
+
+ protected FieldHandler(Field field) {
+ this.field = field;
}
- for (Field f : fields) {
- // 判断是否是排除字段
- if (existField.contains(f.getName())) {
- continue;
+ abstract void handle(Object target, ProcessorContext context);
+
+ protected void setFieldValue(Object target, Object value) {
+ try {
+ BeanUtil.setProperty(target, field.getName(), value);
+ } catch (Exception e) {
+ if (log.isDebugEnabled()) {
+ log.debug("设置字段 {} 值失败: {}", field.getName(), e.getMessage());
+ }
}
+ }
- // 如果设置为忽略字段 则直接跳过不处理
- TableField tableField = f.getAnnotation(TableField.class);
- if (tableField != null) {
- if (!tableField.exist()) {
- existField.add(f.getName());
- continue;
+ protected Object getFieldValue(Object target) {
+ return ReflectUtil.getFieldValue(target, field.getName());
+ }
+
+ protected boolean isBlank(Object value) {
+ return StringUtils.isBlank(Convert.toStr(value));
+ }
+ }
+
+ // 具体的字段处理器实现
+ private static class CreateByFieldHandler extends FieldHandler {
+ CreateByFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert() && isBlank(getFieldValue(target))) {
+ String userId = context.getUserId();
+ if (StringUtils.isNotBlank(userId)) {
+ setFieldValue(target, userId);
+ }
+ }
+ }
+ }
+
+ private static class UpdateByFieldHandler extends FieldHandler {
+ UpdateByFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (isBlank(getFieldValue(target))) {
+ String userId = context.getUserId();
+ if (StringUtils.isNotBlank(userId)) {
+ setFieldValue(target, userId);
}
}
+ }
+ }
+
+ private static class CreateTimeFieldHandler extends FieldHandler {
+ CreateTimeFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert()) {
+ setFieldValue(target, context.getCurrentDate());
+ }
+ }
+ }
+
+ private static class UpdateTimeFieldHandler extends FieldHandler {
+ UpdateTimeFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ setFieldValue(target, context.getCurrentDate());
+ }
+ }
+
+ private static class OptimisticLockFieldHandler extends FieldHandler {
+ OptimisticLockFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert()) {
+ setFieldValue(target, DictType.NO_YES_NO.getValue());
+ }
+ }
+ }
+
+ private static class DeleteLogicFieldHandler extends FieldHandler {
+ DeleteLogicFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert()) {
+ setFieldValue(target, MyBatisConstants.LOGIC_NOT_DELETE_VALUE);
+ }
+ }
+ }
- // 回调函数
- callback.accept(f.getName());
+ private static class TenantFieldHandler extends FieldHandler {
+ TenantFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert() && isBlank(getFieldValue(target))) {
+ String tenantId = context.getTenantId();
+ if (StringUtils.isNotBlank(tenantId)) {
+ setFieldValue(target, tenantId);
+ }
+ }
}
}
- // =======================================
+ private static class OrgGroupFieldHandler extends FieldHandler {
+ OrgGroupFieldHandler(Field field) { super(field); }
+
+ @Override
+ void handle(Object target, ProcessorContext context) {
+ if (context.isInsert() && isBlank(getFieldValue(target))) {
+ UserOrgRefModel userOrgRef = context.getUserOrgRef();
+ if (userOrgRef != null && StringUtils.isNotBlank(userOrgRef.getOrgIds())) {
+ setFieldValue(target, userOrgRef.getOrgIds());
+ }
+ }
+ }
+ }
@Override
- public Object plugin(Object o) {
- return Plugin.wrap(o, this);
+ public Object plugin(Object target) {
+ return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
+ // 配置参数
}
-
}
+
+
+
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java
index f9cb9b1c..605c28ec 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java
@@ -1,6 +1,6 @@
package org.opsli.core.filters.interceptor;
-
+import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -15,9 +15,11 @@ import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.opsli.core.autoconfigure.properties.EncryptProperties;
+import org.opsli.core.filters.interceptor.crypto.ObjectProcessor;
import org.springframework.stereotype.Component;
-import java.lang.reflect.*;
-import java.time.chrono.ChronoLocalDate;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.*;
/**
@@ -28,7 +30,7 @@ import java.util.*;
* Signature.method:在定义拦截类的基础之上,在定义拦截的方法
* Signature.args:在定义拦截方法的基础之上在定义拦截的方法对应的参数,JAVA里面方法可能重载,故注意参数的类型和顺序
*
- * @author Parker
+ * @author Pace
* @date 2022-08-07
*/
@Slf4j
@@ -52,17 +54,18 @@ public class MybatisCryptoInterceptor implements Interceptor {
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
- Method method = invocation.getMethod();
-
- switch (method.getName()) {
- case "update":
- return updateHandle(invocation);
- case "query":
- return selectHandle(invocation);
- default:
- return invocation.proceed();
+ try {
+ Method method = invocation.getMethod();
+ return switch (method.getName()) {
+ case "update" -> updateHandle(invocation);
+ case "query" -> selectHandle(invocation);
+ default -> invocation.proceed();
+ };
+ } catch (Exception e) {
+ log.error("MybatisCryptoInterceptor intercept error", e);
+ // 出现异常时继续执行原方法,避免中断业务流程
+ return invocation.proceed();
}
-
}
/**
@@ -124,147 +127,37 @@ public class MybatisCryptoInterceptor implements Interceptor {
*
* @param object
* @param cryptoType
- * @throws IllegalAccessException
*/
- private void handleParameterOrResult(Object object, CryptoType cryptoType) throws IllegalAccessException {
+ private void handleParameterOrResult(Object object, CryptoType cryptoType) {
HashMap fieldObjectHashMap = new HashMap<>();
- //多个参数
- if (object instanceof Map) {
- Map paramMap = (Map) object;
- Set keySet = paramMap.keySet();
- for (Object key : keySet) {
- Object o = paramMap.get(key);
- if (o != null) {
- handleObject(o, o.getClass(), fieldObjectHashMap);
- }
-
- }
- } else {
- if (object != null) {
- handleObject(object, object.getClass(), fieldObjectHashMap);
- }
- }
-
- //统一修改加密解密值
- fieldObjectHashMap.keySet().forEach(key -> {
- try {
- handleString(key, fieldObjectHashMap.get(key), cryptoType);
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- }
-
- /**
- * 是否是基本类型
- *
- * @param type
- * @return
- */
- private boolean isBase(Type type) {
- return boolean.class.equals(type) ||
- char.class.equals(type) ||
- long.class.equals(type) ||
- int.class.equals(type) ||
- byte.class.equals(type) ||
- short.class.equals(type) ||
- double.class.equals(type) ||
- float.class.equals(type);
- }
-
- /**
- * 是否是
- *
- * @param object
- * @return
- */
- private boolean isFilter(Object object) {
-
- return object == null || object instanceof CharSequence || object instanceof Number || object instanceof Collection || object instanceof Date || object instanceof ChronoLocalDate;
- }
-
- /**
- * 聚合父类属性
- *
- * @param oClass
- * @param fields
- * @return
- */
- private List mergeField(Class> oClass, List fields) {
- if (fields == null) {
- fields = new ArrayList<>();
- }
- Class> superclass = oClass.getSuperclass();
- if (superclass != null && !superclass.equals(Object.class) && superclass.getDeclaredFields().length > 0) {
- mergeField(superclass, fields);
- }
- for (Field declaredField : oClass.getDeclaredFields()) {
- int modifiers = declaredField.getModifiers();
-
- if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers) || Modifier.isVolatile(modifiers) || Modifier.isSynchronized(modifiers)) {
- continue;
- }
- fields.add(declaredField);
- }
-
- return fields;
-
- }
-
- /**
- * 处理Object
- *
- * @param obj
- * @param oClass
- * @throws IllegalAccessException
- */
- private void handleObject(Object obj, Class> oClass, HashMap fieldObjectHashMap) throws IllegalAccessException {
- //过滤
- if (isFilter(obj)) {
- return;
- }
-
- List fields = mergeField(oClass, null);
-
- for (Field declaredField : fields) {
-
- //静态属性直接跳过
- if (Modifier.isStatic(declaredField.getModifiers())) {
- continue;
- }
-
- boolean accessible = declaredField.isAccessible();
- declaredField.setAccessible(true);
- Object value = declaredField.get(obj);
- declaredField.setAccessible(accessible);
-
- if (value == null) {
- // TODO
- continue;
- } else if (value instanceof Number) {
- // TODO
- continue;
- } else if (value instanceof String) {
- CryptoMapperField annotation = declaredField.getAnnotation(CryptoMapperField.class);
- if (annotation != null) {
- fieldObjectHashMap.put(declaredField, obj);
- }
-
- } else if (value instanceof Collection) {
- Collection coll = (Collection) value;
- for (Object o : coll) {
- if (isFilter(o)) {
- //默认集合内类型一致
- break;
+ try {
+ //多个参数
+ if (object instanceof Map paramMap) {
+ Set keySet = paramMap.keySet();
+ for (Object key : keySet) {
+ Object o = paramMap.get(key);
+ if (o != null) {
+ new ObjectProcessor().handleObject(o, o.getClass(), fieldObjectHashMap);
}
- handleObject(o, o.getClass(), fieldObjectHashMap);
}
} else {
- handleObject(value, value.getClass(), fieldObjectHashMap);
+ if (object != null) {
+ new ObjectProcessor().handleObject(object, object.getClass(), fieldObjectHashMap);
+ }
}
- }
+ //统一修改加密解密值
+ fieldObjectHashMap.keySet().forEach(key -> {
+ try {
+ handleString(key, fieldObjectHashMap.get(key), cryptoType);
+ } catch (Exception e) {
+ log.error("Mybatis 拦截器-加解密插件-处理参数结果异常 ERROR=> {}", e.getMessage(), e);
+ }
+ });
+ } catch (Exception e) {
+ log.warn("处理参数或结果时发生异常,跳过处理: {}", e.getMessage());
+ }
}
/**
@@ -273,49 +166,51 @@ public class MybatisCryptoInterceptor implements Interceptor {
* @param field
* @param object
* @param cryptoType
- * @throws IllegalAccessException
- * @throws InstantiationException
- * @throws NoSuchMethodException
- * @throws InvocationTargetException
+ * @throws Exception
*/
private void handleString(Field field, Object object, CryptoType cryptoType) throws Exception {
+ // 判断是否为bean
+ boolean isBean = BeanUtil.isBean(object.getClass());
+ if(!isBean){
+ return;
+ }
- boolean accessible = field.isAccessible();
- field.setAccessible(true);
- Object value = field.get(object);
-
- CryptoMapperField annotation = field.getAnnotation(CryptoMapperField.class);
- if (annotation != null) {
-
- String key;
- //全局配置的key
- String propertiesKey = encryptProperties.getKey();
- log.debug("全局key是:" + propertiesKey);
- //属性上的key
- String annotationKey = annotation.key();
- log.debug("注解key是:" + annotationKey);
+ try {
+ Object value = BeanUtil.getProperty(object, field.getName());
+ CryptoMapperField annotation = field.getAnnotation(CryptoMapperField.class);
+ if (annotation != null) {
+ String key;
+ //全局配置的key
+ String propertiesKey = encryptProperties.getKey();
+ log.debug("全局key是:{}", propertiesKey);
+ //属性上的key
+ String annotationKey = annotation.key();
+ log.debug("注解key是:{}", annotationKey);
+
+ if (StrUtil.isNotBlank(annotationKey)) {
+ key = annotationKey;
+ } else {
+ key = propertiesKey;
+ }
- if (StrUtil.isNotBlank(annotationKey)) {
- key = annotationKey;
- } else {
- key = propertiesKey;
- }
+ Class extends ICrypto> iCryptoImpl = annotation.iCrypto();
+ ICrypto iCrypto = iCryptoImpl.getDeclaredConstructor().newInstance();
- Class extends ICrypto> iCryptoImpl = annotation.iCrypto();
- ICrypto iCrypto = iCryptoImpl.newInstance();
+ //解密后的值
+ String valueResult;
+ if (cryptoType.equals(CryptoType.DECRYPT)) {
+ valueResult = iCrypto.decrypt(String.valueOf(value), key);
+ } else {
+ valueResult = iCrypto.encrypt(String.valueOf(value), key);
+ }
- //解密后的值
- String valueResult;
- if (cryptoType.equals(CryptoType.DECRYPT)) {
- valueResult = iCrypto.decrypt(String.valueOf(value), key);
- } else {
- valueResult = iCrypto.encrypt(String.valueOf(value), key);
+ log.debug("原值:{}", value);
+ log.debug("现在:{}", valueResult);
+ BeanUtil.setProperty(object, field.getName(), String.valueOf(valueResult));
}
-
- log.debug("原值:" + value);
- log.debug("现在:" + valueResult);
- field.set(object, String.valueOf(valueResult));
- field.setAccessible(accessible);
+ } catch (Exception e) {
+ log.error("处理字段 {}.{} 的加密解密时发生异常: {}",
+ field.getDeclaringClass().getName(), field.getName(), e.getMessage());
}
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/UserAuthInterceptor.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/UserAuthInterceptor.java
index 75ff1070..4c53c6ff 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/UserAuthInterceptor.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/UserAuthInterceptor.java
@@ -15,19 +15,20 @@
*/
package org.opsli.core.filters.interceptor;
+import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.opsli.core.holder.UserContextHolder;
import org.opsli.core.utils.UserTokenUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 用户权限拦截器,支持自解析 jwt token
*
- * @author Parker
+ * @author Pace
* @date 2021年12月22日16:35:20
*/
@Slf4j
@@ -35,7 +36,7 @@ public class UserAuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
- HttpServletRequest request, HttpServletResponse response, Object handler){
+ @NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler){
if (handler instanceof ResourceHttpRequestHandler) {
return true;
@@ -53,7 +54,7 @@ public class UserAuthInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(
- HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
+ @NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, Exception ex){
// 上下文属性值清除,防止内存泄漏
UserContextHolder.clear();
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/crypto/ObjectProcessor.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/crypto/ObjectProcessor.java
new file mode 100644
index 00000000..97c6e285
--- /dev/null
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/crypto/ObjectProcessor.java
@@ -0,0 +1,333 @@
+package org.opsli.core.filters.interceptor.crypto;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import opsli.plugins.crypto.spring.annotation.CryptoMapperField;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.time.chrono.ChronoLocalDate;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Mybatis 拦截器 Object 处理器
+ *
+ * @author Pace
+ * @date 2025-06-01
+ */
+@Slf4j
+public class ObjectProcessor {
+
+ private static final int MAX_RECURSION_DEPTH = 50;
+ private static final int MAX_COLLECTION_SIZE = -1;
+
+ // 类字段缓存 - 避免重复反射
+ private static final ConcurrentHashMap, List> FIELD_CACHE = new ConcurrentHashMap<>();
+
+ // 注解缓存 - 避免重复获取注解
+ private static final ConcurrentHashMap ANNOTATION_CACHE = new ConcurrentHashMap<>();
+
+ // Bean类型缓存 - 避免重复判断
+ private static final ConcurrentHashMap, Boolean> BEAN_TYPE_CACHE = new ConcurrentHashMap<>();
+
+ // 过滤类型缓存 - 避免重复类型判断
+ private static final Set> FILTER_TYPES = Set.of(
+ String.class, CharSequence.class, Number.class, Collection.class,
+ Date.class, ChronoLocalDate.class
+ );
+
+ // 基础类型快速判断集合
+ private static final Set> PRIMITIVE_WRAPPER_TYPES = Set.of(
+ Boolean.class, Byte.class, Character.class, Short.class,
+ Integer.class, Long.class, Float.class, Double.class
+ );
+
+ // 使用更高效的访问对象跟踪
+ private final IdentityHashMap visitedObjects = new IdentityHashMap<>();
+ private int currentDepth = 0;
+
+ /**
+ * 处理对象入口方法
+ */
+ public void handleObject(Object obj, Class> oClass, HashMap fieldObjectHashMap) {
+ try {
+ visitedObjects.clear();
+ currentDepth = 0;
+ processObject(obj, oClass, fieldObjectHashMap);
+ } finally {
+ visitedObjects.clear();
+ }
+ }
+
+ /**
+ * 处理对象的核心方法 - 内联优化
+ */
+ private void processObject(Object obj, Class> oClass, HashMap fieldObjectHashMap) {
+ // 快速过滤检查 - 内联优化
+ if (obj == null || isFilterType(oClass) || !isBeanType(oClass)) {
+ return;
+ }
+
+ // 循环引用检查 - 使用更快的 IdentityHashMap
+ if (visitedObjects.containsKey(obj)) {
+ return; // 移除日志以提升性能
+ }
+
+ // 递归深度检查
+ if (currentDepth >= MAX_RECURSION_DEPTH) {
+ return; // 移除日志以提升性能
+ }
+
+ visitedObjects.put(obj, null);
+ currentDepth++;
+
+ try {
+ processObjectFieldsOptimized(obj, oClass, fieldObjectHashMap);
+ } finally {
+ currentDepth--;
+ visitedObjects.remove(obj);
+ }
+ }
+
+ /**
+ * 优化的字段处理方法
+ */
+ private void processObjectFieldsOptimized(Object obj, Class> oClass, HashMap fieldObjectHashMap) {
+ List fields = getFieldsCached(oClass);
+
+ // 使用传统 for 循环避免迭代器开销
+ for (int i = 0, size = fields.size(); i < size; i++) {
+ Field field = fields.get(i);
+
+ try {
+ // 内联字段处理逻辑
+ Object value = BeanUtil.getProperty(obj, field.getName());
+
+ if (value == null) {
+ continue;
+ }
+
+ // 快速类型判断和处理
+ processValueOptimized(value, field, obj, fieldObjectHashMap);
+
+ } catch (Exception e) {
+ // 简化异常处理,避免字符串拼接
+ if (log.isDebugEnabled()) {
+ log.debug("处理字段异常: {}.{}", oClass.getSimpleName(), field.getName());
+ }
+ }
+ }
+ }
+
+ /**
+ * 优化的值处理方法
+ */
+ private void processValueOptimized(Object value, Field field, Object parentObj,
+ HashMap fieldObjectHashMap) {
+ Class> valueClass = value.getClass();
+
+ // 快速类型判断 - 避免枚举遍历
+ if (valueClass == String.class) {
+ // String 处理 - 内联优化
+ if (hasAnnotationCached(field)) {
+ fieldObjectHashMap.put(field, parentObj);
+ }
+ } else if (isNumberType(valueClass)) {
+ // Number 类型直接跳过
+ return;
+ } else if (value instanceof Collection) {
+ // Collection 处理
+ processCollectionOptimized((Collection>) value, fieldObjectHashMap);
+ } else if (value instanceof Map) {
+ // Map 处理
+ processMapOptimized((Map, ?>) value, fieldObjectHashMap);
+ } else {
+ // 自定义对象处理
+ processObject(value, valueClass, fieldObjectHashMap);
+ }
+ }
+
+ /**
+ * 优化的集合处理
+ */
+ private void processCollectionOptimized(Collection> collection, HashMap fieldObjectHashMap) {
+ if (collection.isEmpty()) {
+ return;
+ }
+
+ int processCount = 0;
+ Class> elementType = null;
+ boolean typeChecked = false;
+
+ // 使用增强 for 循环,但避免类型重复检查
+ for (Object item : collection) {
+ if (MAX_COLLECTION_SIZE > 0 && processCount >= MAX_COLLECTION_SIZE) {
+ break;
+ }
+
+ if (item == null) {
+ continue;
+ }
+
+ // 优化:只检查第一个元素的类型
+ if (!typeChecked) {
+ elementType = item.getClass();
+ typeChecked = true;
+ if (isFilterType(elementType)) {
+ break; // 整个集合都跳过
+ }
+ } else if (elementType != item.getClass()) {
+ // 类型不一致时才重新检查
+ if (isFilterType(item.getClass())) {
+ continue;
+ }
+ }
+
+ processObject(item, item.getClass(), fieldObjectHashMap);
+ processCount++;
+ }
+ }
+
+ /**
+ * 优化的 Map 处理
+ */
+ private void processMapOptimized(Map, ?> map, HashMap fieldObjectHashMap) {
+ if (map.isEmpty()) {
+ return;
+ }
+
+ int processCount = 0;
+
+ // 直接遍历 values,避免 Entry 对象创建
+ for (Object mapValue : map.values()) {
+ if (MAX_COLLECTION_SIZE > 0 && processCount >= MAX_COLLECTION_SIZE) {
+ break;
+ }
+
+ if (mapValue != null && !isFilterType(mapValue.getClass())) {
+ processObject(mapValue, mapValue.getClass(), fieldObjectHashMap);
+ }
+ processCount++;
+ }
+ }
+
+ /**
+ * 缓存字段获取 - 避免重复反射
+ */
+ private List getFieldsCached(Class> oClass) {
+ return FIELD_CACHE.computeIfAbsent(oClass, this::mergeFieldOptimized);
+ }
+
+ /**
+ * 优化的字段合并方法
+ */
+ private List mergeFieldOptimized(Class> oClass) {
+ List allFields = new ArrayList<>();
+
+ // 使用栈避免递归,提升性能
+ Deque> classStack = new ArrayDeque<>();
+ Class> currentClass = oClass;
+
+ // 收集所有父类
+ while (currentClass != null && currentClass != Object.class) {
+ classStack.push(currentClass);
+ currentClass = currentClass.getSuperclass();
+ }
+
+ // 从父类到子类处理字段
+ while (!classStack.isEmpty()) {
+ Class> clazz = classStack.pop();
+ try {
+ Field[] fields = clazz.getDeclaredFields();
+ for (Field field : fields) {
+ if (isValidField(field)) {
+ allFields.add(field);
+ }
+ }
+ } catch (SecurityException e) {
+ // 忽略安全异常
+ }
+ }
+
+ return allFields;
+ }
+
+ /**
+ * 快速字段验证
+ */
+ private boolean isValidField(Field field) {
+ int modifiers = field.getModifiers();
+ return !(Modifier.isStatic(modifiers) ||
+ Modifier.isFinal(modifiers) ||
+ Modifier.isVolatile(modifiers) ||
+ Modifier.isSynchronized(modifiers) ||
+ Modifier.isTransient(modifiers));
+ }
+
+ /**
+ * 缓存注解检查
+ */
+ private boolean hasAnnotationCached(Field field) {
+ return ANNOTATION_CACHE.computeIfAbsent(field,
+ f -> f.getAnnotation(CryptoMapperField.class) != null);
+ }
+
+ /**
+ * 缓存 Bean 类型检查
+ */
+ private boolean isBeanType(Class> clazz) {
+ return BEAN_TYPE_CACHE.computeIfAbsent(clazz, BeanUtil::isBean);
+ }
+
+ /**
+ * 快速过滤类型检查 - 避免 instanceof 链
+ */
+ private boolean isFilterType(Class> clazz) {
+ // 快速检查基础类型
+ if (clazz.isPrimitive() || PRIMITIVE_WRAPPER_TYPES.contains(clazz)) {
+ return true;
+ }
+
+ // 检查预定义的过滤类型
+ for (Class> filterType : FILTER_TYPES) {
+ if (filterType.isAssignableFrom(clazz)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * 快速数字类型检查
+ */
+ private boolean isNumberType(Class> clazz) {
+ return Number.class.isAssignableFrom(clazz) ||
+ clazz.isPrimitive() && (
+ clazz == int.class || clazz == long.class ||
+ clazz == double.class || clazz == float.class ||
+ clazz == short.class || clazz == byte.class
+ );
+ }
+
+ /**
+ * 清理缓存方法 - 防止内存泄漏
+ */
+ public static void clearCache() {
+ FIELD_CACHE.clear();
+ ANNOTATION_CACHE.clear();
+ BEAN_TYPE_CACHE.clear();
+ }
+
+ /**
+ * 获取缓存统计信息
+ */
+ public static Map getCacheStats() {
+ Map stats = new HashMap<>();
+ stats.put("fieldCache", FIELD_CACHE.size());
+ stats.put("annotationCache", ANNOTATION_CACHE.size());
+ stats.put("beanTypeCache", BEAN_TYPE_CACHE.size());
+ return stats;
+ }
+}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/general/StartPrint.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/general/StartPrint.java
index 5ffe0759..d2e2a332 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/general/StartPrint.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/general/StartPrint.java
@@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit;
/**
* 打印启动日志
*
- * @author parker
+ * @author Pace
* @date 2020-09-16
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/handler/GlobalExceptionHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/handler/GlobalExceptionHandler.java
index 637c748d..fd888d74 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/handler/GlobalExceptionHandler.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/handler/GlobalExceptionHandler.java
@@ -33,7 +33,7 @@ import static org.opsli.common.constants.OrderConstants.EXCEPTION_HANDLER_ORDER;
/**
* 遗产拦截器
*
- * @author parker
+ * @author Pace
* @date 2020-09-13
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/holder/UserContextHolder.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/holder/UserContextHolder.java
index d139e64a..dae59527 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/holder/UserContextHolder.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/holder/UserContextHolder.java
@@ -22,13 +22,13 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;
/**
* 用户认证信息上下文
*
- * @author Parker
+ * @author Pace
* @date 2021年12月22日16:22:59
*/
public final class UserContextHolder {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationFailedEventListener.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationFailedEventListener.java
index f6c971d8..f8649998 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationFailedEventListener.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationFailedEventListener.java
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
/**
* 系统启动失败
*
- * @author parker
+ * @author Pace
* @date 2020-03-31 13:56
*/
@Component
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationReadyEventListener.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationReadyEventListener.java
index 3f194187..39a5ebec 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationReadyEventListener.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/listener/ApplicationReadyEventListener.java
@@ -1,8 +1,8 @@
package org.opsli.core.listener;
+import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.opsli.core.general.StartPrint;
-import org.opsli.core.utils.OptionsUtil;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@@ -10,7 +10,7 @@ import org.springframework.stereotype.Component;
/**
* 系统启动成功
*
- * @author parker
+ * @author Pace
* @date 2020-03-31 13:56
*/
@Component
@@ -18,8 +18,7 @@ import org.springframework.stereotype.Component;
public class ApplicationReadyEventListener implements ApplicationListener {
@Override
- public void onApplicationEvent(ApplicationReadyEvent event) {
- event.getApplicationContext();
+ public void onApplicationEvent(@NotNull ApplicationReadyEvent event) {
// 输出启动日志
StartPrint.getInstance().successPrint();
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/annotation/OperateLogger.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/annotation/OperateLogger.java
index 57f818a8..bee76151 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/annotation/OperateLogger.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/annotation/OperateLogger.java
@@ -27,7 +27,7 @@ import java.lang.annotation.Target;
/**
* 日志注解
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
@Target({ElementType.METHOD}) //注解作用于方法级别
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/aspect/OperateLogAspect.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/aspect/OperateLogAspect.java
index 061688a5..50cc4a00 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/aspect/OperateLogAspect.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/aspect/OperateLogAspect.java
@@ -36,7 +36,7 @@ import org.opsli.core.utils.UserTokenUtil;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
@@ -44,7 +44,7 @@ import java.util.UUID;
/**
* 操作日志拦截器
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/bean/OperationLog.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/bean/OperationLog.java
index 9c23ea72..6dee17bd 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/bean/OperationLog.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/bean/OperationLog.java
@@ -18,18 +18,20 @@ package org.opsli.core.log.bean;
import lombok.Data;
import lombok.ToString;
+import java.io.Serial;
import java.io.Serializable;
/**
* 操作日志
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
@Data
@ToString
public class OperationLog implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** 日志ID */
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogLevelEnum.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogLevelEnum.java
index 359f71fe..1aabf26b 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogLevelEnum.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogLevelEnum.java
@@ -21,7 +21,7 @@ import lombok.Getter;
/**
* 日志级别枚举
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
@Getter
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogScopeEnum.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogScopeEnum.java
index 2989ffa8..14937236 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogScopeEnum.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogScopeEnum.java
@@ -18,7 +18,7 @@ package org.opsli.core.log.enums;
/**
* 日志记录范围
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
public enum LogScopeEnum {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogTypeEnum.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogTypeEnum.java
index 6085e627..efa66b58 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogTypeEnum.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/LogTypeEnum.java
@@ -18,7 +18,7 @@ package org.opsli.core.log.enums;
/**
* 日志类型
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
public enum LogTypeEnum {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/ModuleEnum.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/ModuleEnum.java
index 567e72b2..dcbe0c72 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/ModuleEnum.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/ModuleEnum.java
@@ -19,7 +19,7 @@ package org.opsli.core.log.enums;
/**
* 模块字典
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:19:27
*/
public enum ModuleEnum {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/OperationTypeEnum.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/OperationTypeEnum.java
index 2ffe541b..d87b4503 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/OperationTypeEnum.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/log/enums/OperationTypeEnum.java
@@ -18,7 +18,7 @@ package org.opsli.core.log.enums;
/**
* 操作类型
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:27:27
*/
public enum OperationTypeEnum {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/CoreMsg.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/CoreMsg.java
index 9813fa5c..ca92e52d 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/CoreMsg.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/CoreMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 核心类 - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public enum CoreMsg implements BaseMsg {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/JwtMsg.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/JwtMsg.java
index a4634399..8237534e 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/JwtMsg.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/JwtMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* JWT类 - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public enum JwtMsg implements BaseMsg {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/TokenMsg.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/TokenMsg.java
index 65f6ef3c..f6b8a71b 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/TokenMsg.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/msg/TokenMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* Token - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public enum TokenMsg implements BaseMsg {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/CryptoConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/CryptoConfigFactory.java
index 20df380d..50953667 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/CryptoConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/CryptoConfigFactory.java
@@ -27,7 +27,7 @@ import org.opsli.core.utils.ValidatorUtil;
/**
* 加密参数
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
public enum CryptoConfigFactory {
@@ -71,7 +71,7 @@ public enum CryptoConfigFactory {
/**
* 对称加密
*
- * @author Parker
+ * @author Pace
* @date 2021年5月17日15:59:52
*/
@Data
@@ -90,7 +90,7 @@ public enum CryptoConfigFactory {
/**
* 非对称加密
*
- * @author Parker
+ * @author Pace
* @date 2021年5月17日15:59:52
*/
@Data
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/EmailConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/EmailConfigFactory.java
index 57e575bd..fa417e36 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/EmailConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/EmailConfigFactory.java
@@ -15,7 +15,7 @@
*/
package org.opsli.core.options;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.opsli.common.annotation.OptionDict;
import org.opsli.common.annotation.validator.Validator;
@@ -25,12 +25,13 @@ import org.opsli.core.utils.OptionsUtil;
import org.opsli.core.utils.ValidatorUtil;
import org.opsli.plugins.email.conf.EmailConfig;
+import java.io.Serial;
import java.io.Serializable;
/**
* 邮件配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
public enum EmailConfigFactory {
@@ -59,45 +60,46 @@ public enum EmailConfigFactory {
/**
* 邮件配置
*
- * @author Parker
+ * @author Pace
*/
@Data
public static class EmailConfigOption implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** SMTP地址 */
- @ApiModelProperty(value = "SMTP地址")
+ @Schema(description = "SMTP地址")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_smtp")
private String smtp;
/** SMTP端口 */
- @ApiModelProperty(value = "SMTP端口")
+ @Schema(description = "SMTP端口")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_port")
private Integer port;
/** 开启SSL认证 */
- @ApiModelProperty(value = "开启SSL认证")
+ @Schema(description = "开启SSL认证")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_ssl_enable")
private String sslEnable;
/** 邮箱账号 */
- @ApiModelProperty(value = "邮箱账号")
+ @Schema(description = "邮箱账号")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_account")
private String account;
/** 邮箱密码 */
- @ApiModelProperty(value = "邮箱密码")
+ @Schema(description = "邮箱密码")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_password")
private String password;
/** 发件人 */
- @ApiModelProperty(value = "发件人")
+ @Schema(description = "发件人")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("email_addresser")
private String addresser;
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java
index 1d2b528d..906818b3 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java
@@ -15,7 +15,7 @@
*/
package org.opsli.core.options;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.opsli.common.annotation.OptionDict;
import org.opsli.common.annotation.validator.Validator;
@@ -28,7 +28,7 @@ import java.io.Serializable;
/**
* 阿里云短信-验证码配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
public enum SmsAliYunCaptchaConfigFactory {
@@ -57,7 +57,7 @@ public enum SmsAliYunCaptchaConfigFactory {
/**
* 阿里云短信验证码配置
*
- * @author Parker
+ * @author Pace
*/
@Data
public static class SmsAliYunCaptchaConfigOption implements Serializable {
@@ -65,13 +65,13 @@ public enum SmsAliYunCaptchaConfigFactory {
private static final long serialVersionUID = 1L;
/** 模版编码 */
- @ApiModelProperty(value = "模版编码")
+ @Schema(description = "模版编码")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("sms_aliyun_captcha_template_code")
private String templateCode;
/** 签名 */
- @ApiModelProperty(value = "签名")
+ @Schema(description = "签名")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("sms_aliyun_captcha_sign")
private String sign;
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java
index 6df9f1a3..75d2956d 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java
@@ -15,7 +15,7 @@
*/
package org.opsli.core.options;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.opsli.common.annotation.OptionDict;
import org.opsli.common.annotation.validator.Validator;
@@ -23,12 +23,13 @@ import org.opsli.common.enums.ValidatorType;
import org.opsli.core.utils.OptionsUtil;
import org.opsli.core.utils.ValidatorUtil;
+import java.io.Serial;
import java.io.Serializable;
/**
* 阿里云短信配置
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
public enum SmsAliYunConfigFactory {
@@ -57,21 +58,22 @@ public enum SmsAliYunConfigFactory {
/**
* 阿里云短信配置
*
- * @author Parker
+ * @author Pace
*/
@Data
public static class SmsAliYunConfigOption implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** access_key */
- @ApiModelProperty(value = "阿里云AccessKey")
+ @Schema(description = "阿里云AccessKey")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("sms_aliyun_access_key")
private String accessKey;
/** access_key_secret */
- @ApiModelProperty(value = "阿里云AccessKeySecret")
+ @Schema(description = "阿里云AccessKeySecret")
@Validator({ValidatorType.IS_NOT_NULL})
@OptionDict("sms_aliyun_access_key_secret")
private String accessKeySecret;
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/Page.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/Page.java
index 7a8c32a2..b411373c 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/Page.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/Page.java
@@ -20,6 +20,8 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.PageSerializable;
import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.opsli.api.base.warpper.ApiWrapper;
import org.opsli.core.base.entity.BaseEntity;
@@ -31,9 +33,11 @@ import java.util.List;
*
* @param
* @param
- * @author Parker
+ * @author Pace
* @date 2020-09-21 23:57
*/
+@Getter
+@Setter
@Slf4j
public class Page extends PageSerializable{
@@ -116,30 +120,6 @@ public class Page extends PageSeriali
// =======================================================
- public int getPageNo() {
- return pageNo;
- }
-
- public void setPageNo(int pageNo) {
- this.pageNo = pageNo;
- }
-
- public int getPageSize() {
- return pageSize;
- }
-
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
-
- public QueryWrapper getQueryWrapper() {
- return queryWrapper;
- }
-
- public void setQueryWrapper(QueryWrapper queryWrapper) {
- this.queryWrapper = queryWrapper;
- }
-
//////////////////////////////////////////////////////////
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/GenQueryBuilder.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/GenQueryBuilder.java
index 3551f829..d38aa704 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/GenQueryBuilder.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/GenQueryBuilder.java
@@ -21,7 +21,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* Web 条件构造器
*
- * @author Parker
+ * @author Pace
* @date 2020-09-21 23:57
*/
public class GenQueryBuilder implements QueryBuilder {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/QueryBuilder.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/QueryBuilder.java
index 1a2b45a5..b9e349b4 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/QueryBuilder.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/QueryBuilder.java
@@ -22,7 +22,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 查询构造器
*
- * @author Parker
+ * @author Pace
* @date 2020-09-21 23:57
*/
public interface QueryBuilder {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/WebQueryBuilder.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/WebQueryBuilder.java
index f6462e18..8323ba03 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/WebQueryBuilder.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/WebQueryBuilder.java
@@ -28,7 +28,7 @@ import java.util.Map;
/**
* Web 条件构造器
*
- * @author Parker
+ * @author Pace
* @date 2020-09-21 23:57
*/
public class WebQueryBuilder implements QueryBuilder{
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryBuilderChain.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryBuilderChain.java
index 08543332..1d7fbf30 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryBuilderChain.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryBuilderChain.java
@@ -22,7 +22,7 @@ import org.opsli.core.persistence.querybuilder.conf.WebQueryConf;
/**
* 查询构建器责任链
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public interface QueryBuilderChain {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryDataPermsHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryDataPermsHandler.java
index 47429ff7..98dce2aa 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryDataPermsHandler.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryDataPermsHandler.java
@@ -35,7 +35,7 @@ import java.util.List;
/**
* 数据权限赋值处理
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public class QueryDataPermsHandler implements QueryBuilderChain{
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryTenantHandler.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryTenantHandler.java
index ddfd37b0..bc9e8e7b 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryTenantHandler.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/chain/QueryTenantHandler.java
@@ -28,7 +28,7 @@ import org.opsli.core.utils.UserUtil;
/**
* 多租户赋值处理
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public class QueryTenantHandler implements QueryBuilderChain{
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/conf/WebQueryConf.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/conf/WebQueryConf.java
index 9b18b991..6d74f926 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/conf/WebQueryConf.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/persistence/querybuilder/conf/WebQueryConf.java
@@ -25,7 +25,7 @@ import java.util.Map;
/**
* Web 请求配置类
*
- * @author Parker
+ * @author Pace
* @date 2021年3月3日17:12:08
*/
public class WebQueryConf {
@@ -73,4 +73,4 @@ public class WebQueryConf {
return queryMap.containsKey(field);
}
-}
\ No newline at end of file
+}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/filter/JwtAuthenticationTokenFilter.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/filter/JwtAuthenticationTokenFilter.java
index 7b94fe4b..76482cc6 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/filter/JwtAuthenticationTokenFilter.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/filter/JwtAuthenticationTokenFilter.java
@@ -16,6 +16,7 @@
package org.opsli.core.security.filter;
import cn.hutool.json.JSONUtil;
+import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import org.opsli.core.base.dto.LoginUserDto;
import org.opsli.core.security.service.UidUserDetailDetailServiceImpl;
@@ -30,16 +31,16 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* JWT 认证 拦截器
* 注: 不要将 自定义filter 交给 Spring管理
- * @author Parker
+ * @author Pace
* @date 2022年07月22日16:16:42
*/
@AllArgsConstructor
@@ -49,7 +50,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
- HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ @NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain)
throws ServletException, IOException {
// 获取token
String token = UserTokenUtil.getRequestToken(request);
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/EmailUserDetailDetailServiceImpl.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/EmailUserDetailDetailServiceImpl.java
index e2830a3c..2b80f81c 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/EmailUserDetailDetailServiceImpl.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/EmailUserDetailDetailServiceImpl.java
@@ -32,7 +32,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;
@@ -40,7 +40,7 @@ import java.util.stream.Collectors;
* 邮箱+验证码 获取用户信息Service
* 实际只需要用到 邮箱唯一主键即可
*
- * @author Parker
+ * @author Pace
* @date 2022-07-14 4:44 PM
**/
@AllArgsConstructor
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/MobileUserDetailDetailServiceImpl.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/MobileUserDetailDetailServiceImpl.java
index 7fd9463b..28258995 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/MobileUserDetailDetailServiceImpl.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/MobileUserDetailDetailServiceImpl.java
@@ -42,7 +42,7 @@ import java.util.stream.Collectors;
* 手机号+验证码 获取用户信息Service
* 实际只需要用到 手机号唯一主键即可
*
- * @author Parker
+ * @author Pace
* @date 2022-07-14 4:44 PM
**/
@AllArgsConstructor
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UidUserDetailDetailServiceImpl.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UidUserDetailDetailServiceImpl.java
index 1a88f553..44affae0 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UidUserDetailDetailServiceImpl.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UidUserDetailDetailServiceImpl.java
@@ -37,7 +37,7 @@ import java.util.stream.Collectors;
/**
* 用户ID 获取用户信息Service
*
- * @author Parker
+ * @author Pace
* @date 2022-07-14 4:44 PM
**/
@AllArgsConstructor
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UsernameUserDetailDetailServiceImpl.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UsernameUserDetailDetailServiceImpl.java
index 89bdf153..ed507d86 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UsernameUserDetailDetailServiceImpl.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/security/service/UsernameUserDetailDetailServiceImpl.java
@@ -38,7 +38,7 @@ import java.util.stream.Collectors;
* 用户名+密码 获取用户信息Service
* 实际只需要用到 用户名唯一主键即可
*
- * @author Parker
+ * @author Pace
* @date 2022-07-14 4:44 PM
**/
@AllArgsConstructor
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java
index c06a581e..2fe2fb20 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CaptchaUtil.java
@@ -41,7 +41,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 验证码
*
- * @author parker
+ * @author Pace
* @date 2021年5月19日12:47:20
*/
@Component
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CryptoUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CryptoUtil.java
index bbe95501..ad6497c5 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CryptoUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/CryptoUtil.java
@@ -33,7 +33,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 登陆加解密 工具类
*
- * @author Parker
+ * @author Pace
* @date 2022-07-25 6:06 PM
**/
@Component
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java
index 099599dc..511051d1 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DictUtil.java
@@ -43,7 +43,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 字典工具类
*
- * @author parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DistributedLockUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DistributedLockUtil.java
index 4ad19619..cfc69548 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DistributedLockUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/DistributedLockUtil.java
@@ -29,7 +29,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 分布式锁工具类
*
- * @author parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnjoyUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnjoyUtil.java
index ee57580b..6f9446c7 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnjoyUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnjoyUtil.java
@@ -30,7 +30,7 @@ import java.util.Map;
/***
* Enjoy 模板引擎
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 13:21
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnvPrefixTool.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnvPrefixTool.java
index c75bde94..1e3e1fc8 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnvPrefixTool.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/EnvPrefixTool.java
@@ -10,7 +10,7 @@ import lombok.extern.slf4j.Slf4j;
/**
* 环境前缀 工具
*
- * @author Parker
+ * @author Pace
* @date 2022-11-16 6:52 PM
**/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ExcelUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ExcelUtil.java
index 5a8ea2e3..a95bd56d 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ExcelUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ExcelUtil.java
@@ -16,14 +16,15 @@
package org.opsli.core.utils;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.support.ExcelTypeEnum;
-import com.google.common.collect.Maps;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -37,16 +38,18 @@ import org.opsli.plugins.excel.exception.ExcelPluginException;
import org.opsli.plugins.excel.listener.BatchExcelListener;
import org.springframework.web.multipart.MultipartFile;
-import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
/**
- * Excel 工具类
+ * Excel 工具类 - 性能优化版本
*
- * @author parker
- * @date 2020-09-22 11:17
+ * @author Pace
+ * @date 2025-06-01 11:17
*/
@Slf4j
public final class ExcelUtil {
@@ -54,8 +57,21 @@ public final class ExcelUtil {
/** 字典KEY */
public static final String DICT_NAME_KEY = "dictName";
public static final String DICT_VALUE_KEY = "dictValue";
- /** 字段字典Map */
- private static final Map, JSONObject> FIELD_DICT_MAP = Maps.newHashMap();
+
+ /** 字段字典缓存 - 使用 Guava Cache 提供过期和大小限制 */
+ private static final Cache, JSONObject> FIELD_DICT_CACHE = CacheBuilder.newBuilder()
+ .maximumSize(1000)
+ .expireAfterWrite(30, TimeUnit.MINUTES)
+ .build();
+
+ /** 字典数据缓存 - 避免重复查询字典 */
+ private static final Cache> DICT_DATA_CACHE = CacheBuilder.newBuilder()
+ .maximumSize(5000)
+ .expireAfterWrite(10, TimeUnit.MINUTES)
+ .build();
+
+ /** ModelHelper 缓存 */
+ private static final Map, AbstractModelHelper> MODEL_HELPER_CACHE = new ConcurrentHashMap<>();
private ExcelUtil(){}
@@ -77,19 +93,16 @@ public final class ExcelUtil {
public List readExcel(MultipartFile excel, Class rowModel) throws ExcelPluginException {
List ts = ExcelUtilSingletonHolder.EXCEL_PLUGIN.readExcel(excel, rowModel);
- // 处理数据
return this.handleDatas(ts, rowModel, ExcelOperate.READ);
}
- public List radExcel(MultipartFile excel, Class rowModel, String sheetName) throws ExcelPluginException {
+ public List readExcel(MultipartFile excel, Class rowModel, String sheetName) throws ExcelPluginException {
List ts = ExcelUtilSingletonHolder.EXCEL_PLUGIN.readExcel(excel, rowModel, sheetName);
- // 处理数据
return this.handleDatas(ts, rowModel, ExcelOperate.READ);
}
public List readExcel(MultipartFile excel, Class rowModel, String sheetName, int headLineNum) throws ExcelPluginException {
List ts = ExcelUtilSingletonHolder.EXCEL_PLUGIN.readExcel(excel, rowModel, sheetName, headLineNum);
- // 处理数据
return this.handleDatas(ts, rowModel, ExcelOperate.READ);
}
@@ -112,14 +125,14 @@ public final class ExcelUtil {
///////////////////////
- public void writeExcel(HttpServletResponse response, List list, String fileName, String sheetName, Class classType, ExcelTypeEnum excelTypeEnum) throws ExcelPluginException {
- // 处理数据
+ public void writeExcel(HttpServletResponse response, List list, String fileName, String sheetName,
+ Class classType, ExcelTypeEnum excelTypeEnum) throws ExcelPluginException {
List ts = this.handleDatas(list, classType, ExcelOperate.WRITE);
ExcelUtilSingletonHolder.EXCEL_PLUGIN.writeExcel(response, ts, fileName, sheetName, classType, excelTypeEnum);
}
/**
- * 处理字典
+ * 处理字典 - 性能优化版本
* @param datas 数据
* @param typeClazz 数据CLazz
* @param operate 操作方式
@@ -127,126 +140,266 @@ public final class ExcelUtil {
* @return List
*/
public List handleDatas(List datas, Class typeClazz, ExcelOperate operate){
- // 计时器
- TimeInterval timer = DateUtil.timer();
- // 空处理
- if(datas == null || datas.size() == 0){
+ if (CollUtil.isEmpty(datas)) {
return datas;
}
+ TimeInterval timer = DateUtil.timer();
+
try {
- JSONObject fieldsJson = this.getFields(typeClazz);
- JSONObject fieldsDictJson = this.getFieldsDict(fieldsJson);
-
- // 获得 helper类
- AbstractModelHelper modelHelper = ModelFactoryHelper.getModelHelper(typeClazz);
- // 字典赋值
- for (T data : datas) {
- switch (operate) {
- case READ:
- modelHelper.transformByImport(fieldsDictJson, cast(data));
- break;
- case WRITE:
- modelHelper.transformByExport(fieldsDictJson, cast(data));
- break;
- default:
- break;
- }
+ // 获取字段字典配置(使用缓存)
+ JSONObject fieldsJson = this.getFieldsFromCache(typeClazz);
+ if (JSONUtil.isNull(fieldsJson) || fieldsJson.isEmpty()) {
+ return datas;
}
- }catch (Exception e){
- log.error(e.getMessage(), e);
+ // 获取字典数据(使用缓存)
+ JSONObject fieldsDictJson = this.getFieldsDictFromCache(fieldsJson);
+ if (JSONUtil.isNull(fieldsDictJson)) {
+ return datas;
+ }
+
+ // 获得 helper类(使用缓存)
+ AbstractModelHelper modelHelper = getModelHelperFromCache(typeClazz);
+
+ // 批量处理数据
+ this.batchProcessData(datas, modelHelper, fieldsDictJson, operate);
+
+ } catch (Exception e) {
+ log.error("Excel数据处理失败: {}", e.getMessage(), e);
return datas;
- }finally {
- // 花费毫秒数
+ } finally {
long timerCount = timer.interval();
- log.info("Excel 处理数据耗时:"+ DateUtil.formatBetween(timerCount));
+ log.info("Excel 处理数据耗时:{} ms, 数据量:{}", timerCount, datas.size());
}
return datas;
}
/**
- * 获得字段字典Code
- *
- * @param clazz 类clazz
- * @return JSONObject
+ * 批量处理数据
*/
- public JSONObject getFields(Class> clazz){
- // 加入内部缓存 防止每次导出都重复反射对象
- JSONObject fieldNameAndTypeCodeDict = FIELD_DICT_MAP.get(clazz);
- if(!JSONUtil.isNull(fieldNameAndTypeCodeDict)){
- return fieldNameAndTypeCodeDict;
+ private void batchProcessData(List datas, AbstractModelHelper modelHelper,
+ JSONObject fieldsDictJson, ExcelOperate operate) {
+ // 使用并行流处理大量数据,小量数据使用串行流
+ if (datas.size() > 1000) {
+ datas.parallelStream().forEach(data -> processData(data, modelHelper, fieldsDictJson, operate));
+ } else {
+ datas.forEach(data -> processData(data, modelHelper, fieldsDictJson, operate));
}
+ }
+
+ /**
+ * 处理单个数据
+ */
+ private void processData(T data, AbstractModelHelper modelHelper,
+ JSONObject fieldsDictJson, ExcelOperate operate) {
+ try {
+ switch (operate) {
+ case READ:
+ modelHelper.transformByImport(fieldsDictJson, cast(data));
+ break;
+ case WRITE:
+ modelHelper.transformByExport(fieldsDictJson, cast(data));
+ break;
+ default:
+ break;
+ }
+ } catch (Exception e) {
+ log.warn("处理数据失败: {}", e.getMessage());
+ }
+ }
- fieldNameAndTypeCodeDict = JSONUtil.createObj();
+ /**
+ * 从缓存获取字段配置
+ */
+ private JSONObject getFieldsFromCache(Class> clazz) {
+ try {
+ return FIELD_DICT_CACHE.get(clazz, () -> this.buildFieldsConfig(clazz));
+ } catch (ExecutionException e) {
+ log.error("获取字段配置失败: {}", e.getMessage(), e);
+ return this.buildFieldsConfig(clazz);
+ }
+ }
+
+ /**
+ * 构建字段配置
+ */
+ private JSONObject buildFieldsConfig(Class> clazz) {
+ JSONObject fieldNameAndTypeCodeDict = JSONUtil.createObj();
+
+ // 使用缓存的反射结果
Field[] fields = ReflectUtil.getFields(clazz);
+
for (Field field : fields) {
ExcelInfo excelInfo = field.getAnnotation(ExcelInfo.class);
- if (excelInfo != null) {
- // 字典
- String dictType = excelInfo.dictType();
- if (StringUtils.isNotEmpty(dictType)) {
- fieldNameAndTypeCodeDict.putOpt(field.getName(), dictType);
- }
+ if (excelInfo != null && StringUtils.isNotEmpty(excelInfo.dictType())) {
+ fieldNameAndTypeCodeDict.putOpt(field.getName(), excelInfo.dictType());
}
}
- FIELD_DICT_MAP.put(clazz, fieldNameAndTypeCodeDict);
+
return fieldNameAndTypeCodeDict;
}
-
/**
- * 获得字段字典
- *
- * @param fieldNameAndTypeCodeDict 字段
- * @return JSONObject
+ * 从缓存获取字典数据
*/
- public JSONObject getFieldsDict(final JSONObject fieldNameAndTypeCodeDict){
- // 非空判断
- if(JSONUtil.isNull(fieldNameAndTypeCodeDict)){
+ private JSONObject getFieldsDictFromCache(JSONObject fieldNameAndTypeCodeDict) {
+ if (JSONUtil.isNull(fieldNameAndTypeCodeDict) || fieldNameAndTypeCodeDict.isEmpty()) {
return null;
}
JSONObject dictJson = JSONUtil.createObj();
try {
- // 取字典 值
- for (String s : fieldNameAndTypeCodeDict.keySet()) {
- String key = Convert.toStr(s);
- String typeCode = fieldNameAndTypeCodeDict.getStr(key);
- List dictWrapperList = DictUtil.getDictList(typeCode);
- // 如果字典 List 为空 则走下一个
- if (CollUtil.isEmpty(dictWrapperList)) {
- continue;
+ // 批量获取所有需要的字典类型
+ Set dictTypes = fieldNameAndTypeCodeDict.values()
+ .stream()
+ .map(Object::toString)
+ .collect(Collectors.toSet());
+
+ // 批量加载字典数据
+ Map dictDataMap = this.batchLoadDictData(dictTypes);
+
+ // 构建最终的字典JSON
+ for (Map.Entry entry : fieldNameAndTypeCodeDict.entrySet()) {
+ String typeCode = entry.getValue().toString();
+ JSONObject dictObject = dictDataMap.get(typeCode);
+ if (dictObject != null) {
+ dictJson.putOpt(typeCode, dictObject);
}
+ }
+ } catch (Exception e) {
+ log.error("获取字典数据失败: {}", e.getMessage(), e);
+ }
+
+ return dictJson;
+ }
- JSONObject dictObject = JSONUtil.createObj();
- JSONObject nameJsonObject = JSONUtil.createObj();
- JSONObject valueJsonObject = JSONUtil.createObj();
- for (DictWrapper wrapper : dictWrapperList) {
- JSONObject dictWrapper = JSONUtil.parseObj(wrapper);
- if (!JSONUtil.isNull(dictWrapper)) {
- nameJsonObject.putOpt(wrapper.getDictName(), wrapper.getDictValue());
- valueJsonObject.putOpt(wrapper.getDictValue(), wrapper.getDictName());
- }
+ /**
+ * 批量加载字典数据
+ */
+ private Map batchLoadDictData(Set dictTypes) {
+ Map result = new HashMap<>();
+
+ for (String dictType : dictTypes) {
+ try {
+ // 先从缓存获取name->value映射
+ Map nameToValue = DICT_DATA_CACHE.get(dictType + "_name",
+ () -> this.loadDictNameToValue(dictType));
+
+ // 再从缓存获取value->name映射
+ Map valueToName = DICT_DATA_CACHE.get(dictType + "_value",
+ () -> this.loadDictValueToName(dictType));
+
+ if (!nameToValue.isEmpty() || !valueToName.isEmpty()) {
+ JSONObject dictObject = JSONUtil.createObj();
+ dictObject.putOpt(DICT_NAME_KEY, JSONUtil.parseObj(nameToValue));
+ dictObject.putOpt(DICT_VALUE_KEY, JSONUtil.parseObj(valueToName));
+ result.put(dictType, dictObject);
}
+ } catch (ExecutionException e) {
+ log.warn("加载字典数据失败 [{}]: {}", dictType, e.getMessage());
+ }
+ }
+
+ return result;
+ }
- dictObject.putOpt(DICT_NAME_KEY, nameJsonObject);
- dictObject.putOpt(DICT_VALUE_KEY, valueJsonObject);
+ /**
+ * 加载字典name->value映射
+ */
+ private Map loadDictNameToValue(String dictType) {
+ List dictWrapperList = DictUtil.getDictList(dictType);
+ if (CollUtil.isEmpty(dictWrapperList)) {
+ return Collections.emptyMap();
+ }
- dictJson.putOpt(typeCode, dictObject);
+ return dictWrapperList.stream()
+ .filter(Objects::nonNull)
+ .filter(wrapper -> StringUtils.isNotEmpty(wrapper.getDictName())
+ && StringUtils.isNotEmpty(wrapper.getDictValue()))
+ .collect(Collectors.toMap(
+ DictWrapper::getDictName,
+ DictWrapper::getDictValue,
+ (existing, replacement) -> existing // 处理重复key
+ ));
+ }
+
+ /**
+ * 加载字典value->name映射
+ */
+ private Map loadDictValueToName(String dictType) {
+ List dictWrapperList = DictUtil.getDictList(dictType);
+ if (CollUtil.isEmpty(dictWrapperList)) {
+ return Collections.emptyMap();
+ }
+
+ return dictWrapperList.stream()
+ .filter(Objects::nonNull)
+ .filter(wrapper -> StringUtils.isNotEmpty(wrapper.getDictName())
+ && StringUtils.isNotEmpty(wrapper.getDictValue()))
+ .collect(Collectors.toMap(
+ DictWrapper::getDictValue,
+ DictWrapper::getDictName,
+ (existing, replacement) -> existing // 处理重复key
+ ));
+ }
+
+ /**
+ * 从缓存获取ModelHelper
+ */
+ private AbstractModelHelper getModelHelperFromCache(Class typeClazz) {
+ return MODEL_HELPER_CACHE.computeIfAbsent(typeClazz, clazz -> {
+ try {
+ return ModelFactoryHelper.getModelHelper(clazz);
+ } catch (Exception e) {
+ throw new RuntimeException("获取ModelHelper失败", e);
}
- }catch (Exception ignored){}
- return dictJson;
+ });
}
- private static T cast(Object msg){
- if(null == msg){
- return null;
- }
- return (T) msg;
+ /**
+ * 获得字段字典Code - 保持向后兼容
+ * @deprecated 使用 getFieldsFromCache 替代
+ */
+ @Deprecated
+ public JSONObject getFields(Class> clazz) {
+ return getFieldsFromCache(clazz);
+ }
+
+ /**
+ * 获得字段字典 - 保持向后兼容
+ * @deprecated 使用 getFieldsDictFromCache 替代
+ */
+ @Deprecated
+ public JSONObject getFieldsDict(final JSONObject fieldNameAndTypeCodeDict) {
+ return getFieldsDictFromCache(fieldNameAndTypeCodeDict);
}
+ /**
+ * 清理缓存
+ */
+ public static void clearCache() {
+ FIELD_DICT_CACHE.invalidateAll();
+ DICT_DATA_CACHE.invalidateAll();
+ MODEL_HELPER_CACHE.clear();
+ log.info("Excel工具类缓存已清理");
+ }
+
+ /**
+ * 获取缓存统计信息
+ */
+ public static String getCacheStats() {
+ return String.format("字段缓存: %s, 字典缓存: %s, Helper缓存: %d",
+ FIELD_DICT_CACHE.stats(),
+ DICT_DATA_CACHE.stats(),
+ MODEL_HELPER_CACHE.size());
+ }
+
+ @SuppressWarnings("unchecked")
+ private static T cast(Object msg) {
+ return msg == null ? null : (T) msg;
+ }
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/GlobalPropertiesUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/GlobalPropertiesUtil.java
index 9e523bac..9c9ad01f 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/GlobalPropertiesUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/GlobalPropertiesUtil.java
@@ -28,7 +28,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 系统配置参数 工具类
*
- * @author parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/JWTBizUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/JWTBizUtil.java
index e1d5ad0a..7b34f33a 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/JWTBizUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/JWTBizUtil.java
@@ -36,7 +36,7 @@ import java.util.Map;
/**
* JWT 的工具类:包含了创建和解码的工具
*
- * @author Parker
+ * @author Pace
* @date 2021年12月22日20:01:23
*/
public final class JWTBizUtil {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java
index 2644fc76..cdc3195f 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/MenuUtil.java
@@ -36,7 +36,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 菜单工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OptionsUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OptionsUtil.java
index 918078b9..ca3816bf 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OptionsUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OptionsUtil.java
@@ -48,7 +48,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
* 参数工具类
* Hash 永久缓存
*
- * @author Parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
@@ -149,7 +149,6 @@ public class OptionsUtil {
}
return resultVo.getData();
});
-
return Convert.convert(OptionsModel.class, cache);
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java
index 19a5f3fd..91840190 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/OrgUtil.java
@@ -30,7 +30,7 @@ import java.util.List;
/**
* 组织机构工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java
index d2c169d9..d6395a28 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/SearchHisUtil.java
@@ -28,7 +28,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -38,7 +38,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 搜索历史工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java
index cdef4472..f58662e0 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TenantUtil.java
@@ -35,7 +35,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 租户工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 23:21
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ThrowExceptionUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ThrowExceptionUtil.java
index 8bcd8494..0fe75b61 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ThrowExceptionUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ThrowExceptionUtil.java
@@ -6,7 +6,7 @@ import org.opsli.common.exception.ServiceException;
/**
* 抛出异常工具类
*
- * @author Parker
+ * @author Pace
* @date 2021年5月7日18:32:32
*/
public final class ThrowExceptionUtil {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TokenGenerator.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TokenGenerator.java
index 566e246e..41239266 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TokenGenerator.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TokenGenerator.java
@@ -25,7 +25,7 @@ import java.util.UUID;
/**
* 生成token
*
- * @author Parker
+ * @author Pace
* @date 2017-05-20 14:41
*/
public final class TokenGenerator {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java
index e2bfeb13..e3840ac5 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/TreeBuildUtil.java
@@ -33,7 +33,7 @@ import java.util.Map;
*
* 注:排序只支持 int 类型
*
- * @author Parker
+ * @author Pace
* @date 2017-05-20 14:41
*/
public enum TreeBuildUtil {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java
index 5c1b34f1..e2c183ae 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserTokenUtil.java
@@ -19,7 +19,7 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
@@ -48,7 +48,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@@ -58,7 +58,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* User Token Util
*
- * @author Parker
+ * @author Pace
* @date 2017-05-20 14:41
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java
index 1b716af4..4795c824 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/UserUtil.java
@@ -51,7 +51,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 用户工具类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
@Slf4j
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ValidatorUtil.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ValidatorUtil.java
index ffa355c4..227c13ca 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ValidatorUtil.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/ValidatorUtil.java
@@ -19,465 +19,671 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ReflectUtil;
-import io.swagger.annotations.ApiModelProperty;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.annotation.validator.ValidatorLenMin;
import org.opsli.common.enums.ValidatorType;
-import org.opsli.common.utils.DefPatternPool;
-import org.opsli.common.msg.ValidatorMsg;
-import org.opsli.api.wrapper.system.dict.DictModel;
import org.opsli.common.exception.ServiceException;
+import org.opsli.common.msg.ValidatorMsg;
+import org.opsli.common.utils.DefPatternPool;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
- * 验证器工具类
+ * 验证器工具类 - 性能和安全性优化版本
*
- * @author Parker
+ * 优化要点:
+ * 1. 缓存字段元数据,避免重复反射
+ * 2. 使用策略模式重构验证逻辑
+ * 3. 添加安全性检查和限制
+ * 4. 支持批量验证
+ * 5. 线程安全设计
+ *
+ * @author Pace
* @date 2020-09-19 20:03
*/
@Slf4j
public final class ValidatorUtil {
+ /** 字段元数据缓存 - 避免重复反射 */
+ private static final Cache, List> FIELD_METADATA_CACHE = Caffeine.newBuilder()
+ .maximumSize(2000)
+ .expireAfterWrite(Duration.ofHours(2))
+ .build();
+
+ /** 字段名缓存 - 避免重复获取Schema注解 */
+ private static final Cache FIELD_NAME_CACHE = Caffeine.newBuilder()
+ .maximumSize(5000)
+ .expireAfterWrite(Duration.ofHours(1))
+ .build();
+
+ /** 验证器实例缓存 */
+ private static final Map VALIDATOR_STRATEGIES =
+ new ConcurrentHashMap<>(32);
+
+ /** 安全限制 */
+ private static final int MAX_VALIDATION_DEPTH = 10; // 最大验证深度
+ private static final int MAX_FIELD_COUNT = 1000; // 最大字段数量
+ private static final int MAX_STRING_LENGTH = 10000; // 最大字符串长度
+
+ /** 线程本地上下文 - 防止循环引用 */
+ private static final ThreadLocal VALIDATION_CONTEXT =
+ ThreadLocal.withInitial(ValidationContext::new);
+
+ static {
+ // 初始化验证器策略
+ initializeValidatorStrategies();
+ }
+
/**
- * 验证对象
- * @param obj 验证对象
+ * 验证对象 - 主入口方法
*/
- public static void verify(Object obj){
- if(obj == null){
+ public static void verify(Object obj) {
+ if (obj == null) {
return;
}
- Field[] fields = ReflectUtil.getFields(obj.getClass());
- for (Field field : fields) {
- // 获得 统一验证 注解 (起码冲突了)
- org.opsli.common.annotation.validator.Validator validator =
- field.getAnnotation(org.opsli.common.annotation.validator.Validator.class);
- if (validator != null) {
- ValidatorType[] types = validator.value();
- Object fieldValue = ReflectUtil.getFieldValue(obj, field);
- ValidatorUtil.check(field, types, fieldValue);
- }
+ ValidationContext context = VALIDATION_CONTEXT.get();
+ try {
+ context.reset();
+ verifyInternal(obj, context);
+ } finally {
+ context.cleanup();
+ }
+ }
- // 获得 最大长度 注解
- ValidatorLenMax validationArgsMax = field.getAnnotation(ValidatorLenMax.class);
- if (validationArgsMax != null) {
- int maxLength = validationArgsMax.value();
- Object fieldValue = ReflectUtil.getFieldValue(obj, field);
- ValidatorUtil.checkMax(field, maxLength, fieldValue);
- }
+ /**
+ * 批量验证 - 高性能批量处理
+ */
+ public static void verifyBatch(Collection> objects) {
+ if (objects == null || objects.isEmpty()) {
+ return;
+ }
+
+ ValidationContext context = VALIDATION_CONTEXT.get();
+ try {
+ context.reset();
- // 获得 最小长度 注解
- ValidatorLenMin validationArgsMin = field.getAnnotation(ValidatorLenMin.class);
- if (validationArgsMin != null) {
- int minLength = validationArgsMin.value();
- Object fieldValue = ReflectUtil.getFieldValue(obj, field);
- ValidatorUtil.checkMin(field, minLength, fieldValue);
+ for (Object obj : objects) {
+ if (obj != null) {
+ verifyInternal(obj, context);
+ }
}
+ } finally {
+ context.cleanup();
}
}
/**
- * 通用校验
- * @param field 字段
- * @param types 类型数组
- * @param fieldValue 字段值
+ * 内部验证方法 - 核心逻辑
*/
- private static void check(Field field, ValidatorType[] types, Object fieldValue){
- // 获得字段名
- String fieldName = field.getName();
- ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
- if(annotation != null){
- fieldName = annotation.value();
+ private static void verifyInternal(Object obj, ValidationContext context) {
+ // 安全检查
+ if (!context.canValidate(obj)) {
+ return;
}
- String value = Convert.toStr(fieldValue);
+ Class> clazz = obj.getClass();
- // 循环验证
- for (ValidatorType type : types) {
+ // 从缓存获取字段元数据
+ List fieldMetadataList = getFieldMetadata(clazz);
+
+ // 执行验证
+ for (FieldMetadata metadata : fieldMetadataList) {
try {
- boolean verifyRet;
- switch (type) {
- // 不能为空
- case IS_NOT_NULL: {
- verifyRet = Validator.isNotEmpty(fieldValue);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_NOT_NULL;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 字母,数字和下划线
- case IS_GENERAL: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isGeneral(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 整数
- case IS_INTEGER: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = NumberUtil.isInteger(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_INTEGER;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 浮点数
- case IS_DECIMAL: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = NumberUtil.isDouble(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_DECIMAL;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 质数
- case IS_PRIMES: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- // 先验证 是否是 整数, 再验证是否是 质数
- verifyRet = NumberUtil.isInteger(value) &&
- NumberUtil.isPrimes(Convert.toInt(value));
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_PRIMES;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 纯字母
- case IS_LETTER: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isLetter(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LETTER;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 大写
- case IS_UPPER_CASE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isUpperCase(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_UPPER_CASE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 小写
- case IS_LOWER_CASE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isLowerCase(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LOWER_CASE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // IP
- case IS_IP: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isIpv4(value) || Validator.isIpv6(value) ;
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IP;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // IPV4
- case IS_IPV4: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isIpv4(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV4;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // IPV6
- case IS_IPV6: {
- if(StringUtils.isEmpty(value)){
- break;
- }
- verifyRet = Validator.isIpv6(value);
- if(!verifyRet){
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV6;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 金额
- case IS_MONEY: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isMoney(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MONEY;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 邮箱
- case IS_EMAIL: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isEmail(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_EMAIL;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 手机号
- case IS_MOBILE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isMobile(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MOBILE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 18位身份证
- case IS_CITIZENID: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isCitizenId(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CITIZENID;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 邮编
- case IS_ZIPCODE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isZipCode(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_ZIPCODE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // URL
- case IS_URL: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isUrl(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_URL;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 汉字
- case IS_CHINESE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isChinese(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CHINESE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 汉字,字母,数字和下划线
- case IS_GENERAL_WITH_CHINESE: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isGeneralWithChinese(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL_WITH_CHINESE;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // MAC地址
- case IS_MAC: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isMac(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAC;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 中国车牌
- case IS_PLATE_NUMBER: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isPlateNumber(value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_PLATE_NUMBER;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- // 安全密码
- case IS_SECURITY_PASSWORD: {
- if (StringUtils.isEmpty(value)) {
- break;
- }
- verifyRet = Validator.isMatchRegex(
- DefPatternPool.SECURITY_PASSWORD, value);
- if (!verifyRet) {
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_SECURITY_PASSWORD;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
- break;
- }
- default:
- break;
- }
- }catch (ServiceException e){
+ validateField(obj, metadata);
+ } catch (ServiceException e) {
throw e;
- }catch (Exception e){
- log.error(e.getMessage(),e);
+ } catch (Exception e) {
+ log.warn("字段验证异常: {}.{}", clazz.getSimpleName(), metadata.fieldName, e);
}
}
}
+ /**
+ * 获取字段元数据 - 带缓存优化
+ */
+ private static List getFieldMetadata(Class> clazz) {
+ return FIELD_METADATA_CACHE.get(clazz, ValidatorUtil::analyzeFields);
+ }
/**
- * 最大长度校验
- * @param field 字段
- * @param maxLength 最大长度
- * @param fieldValue 字段值
+ * 分析类字段 - 预处理字段元数据
*/
- private static void checkMax(Field field, int maxLength, Object fieldValue){
- // 获得字段名
- String fieldName = field.getName();
- ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
- if(annotation != null){
- fieldName = annotation.value();
+ private static List analyzeFields(Class> clazz) {
+ Field[] fields = ReflectUtil.getFields(clazz);
+
+ // 安全检查
+ if (fields.length > MAX_FIELD_COUNT) {
+ log.warn("类 {} 字段数量过多: {}, 最大允许: {}",
+ clazz.getSimpleName(), fields.length, MAX_FIELD_COUNT);
+ return Collections.emptyList();
}
- // 循环验证
+ List metadataList = new ArrayList<>(fields.length);
+
+ for (Field field : fields) {
+ FieldMetadata metadata = createFieldMetadata(field);
+ if (metadata != null && metadata.hasValidation()) {
+ metadataList.add(metadata);
+ }
+ }
+
+ return metadataList;
+ }
+
+ /**
+ * 创建字段元数据
+ */
+ private static FieldMetadata createFieldMetadata(Field field) {
try {
- String value = Convert.toStr(fieldValue);
- if(StringUtils.isNotEmpty(value)){
- // 转换为 数据库真实 长度
- int strLength = value.getBytes(StandardCharsets.UTF_8).length;
- if(strLength > maxLength){
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAX;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
- }
+ // 获取验证注解
+ org.opsli.common.annotation.validator.Validator validator =
+ field.getAnnotation(org.opsli.common.annotation.validator.Validator.class);
+ ValidatorLenMax maxAnnotation = field.getAnnotation(ValidatorLenMax.class);
+ ValidatorLenMin minAnnotation = field.getAnnotation(ValidatorLenMin.class);
+
+ // 如果没有任何验证注解,跳过
+ if (validator == null && maxAnnotation == null && minAnnotation == null) {
+ return null;
}
- }catch (ServiceException e){
- throw e;
- }catch (Exception e){
- log.error(e.getMessage(),e);
+
+ String fieldName = getFieldDisplayName(field);
+
+ return new FieldMetadata(
+ field,
+ fieldName,
+ validator != null ? validator.value() : new ValidatorType[0],
+ maxAnnotation != null ? maxAnnotation.value() : -1,
+ minAnnotation != null ? minAnnotation.value() : -1
+ );
+
+ } catch (Exception e) {
+ log.warn("创建字段元数据失败: {}", field.getName(), e);
+ return null;
}
}
/**
- * 最小长度校验
- * @param field 字段
- * @param minLength 最小长度
- * @param fieldValue 字段值
+ * 获取字段显示名称 - 带缓存
*/
- private static void checkMin(Field field, int minLength, Object fieldValue){
- // 获得字段名
- String fieldName = field.getName();
- ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
- if(annotation != null){
- fieldName = annotation.value();
+ private static String getFieldDisplayName(Field field) {
+ return FIELD_NAME_CACHE.get(field, f -> {
+ Schema annotation = f.getAnnotation(Schema.class);
+ return annotation != null ? annotation.description() : f.getName();
+ });
+ }
+
+ /**
+ * 验证单个字段
+ */
+ private static void validateField(Object obj, FieldMetadata metadata) {
+ Object fieldValue = ReflectUtil.getFieldValue(obj, metadata.field);
+
+ // 验证器类型验证
+ if (metadata.validatorTypes.length > 0) {
+ validateByTypes(metadata, fieldValue);
}
- // 循环验证
- try {
- String value = Convert.toStr(fieldValue);
- if(StringUtils.isNotEmpty(value)){
- // 转换为 数据库真实 长度
- int strLength = value.getBytes(StandardCharsets.UTF_8).length;
- if(strLength < minLength){
- ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MIN;
- msg.setFieldName(fieldName);
- throw new ServiceException(msg);
+ // 长度验证
+ if (metadata.maxLength > 0 || metadata.minLength > 0) {
+ validateLength(metadata, fieldValue);
+ }
+ }
+
+ /**
+ * 按类型验证 - 优化版本
+ */
+ private static void validateByTypes(FieldMetadata metadata, Object fieldValue) {
+ String value = Convert.toStr(fieldValue);
+
+ for (ValidatorType type : metadata.validatorTypes) {
+ ValidatorStrategy strategy = VALIDATOR_STRATEGIES.get(type);
+ if (strategy != null && !strategy.validate(value)) {
+ ValidatorMsg msg = strategy.getErrorMessage();
+ msg.setFieldName(metadata.fieldName);
+ throw new ServiceException(msg);
+ }
+ }
+ }
+
+ /**
+ * 长度验证 - 优化版本
+ */
+ private static void validateLength(FieldMetadata metadata, Object fieldValue) {
+ String value = Convert.toStr(fieldValue);
+ if (StringUtils.isEmpty(value)) {
+ return;
+ }
+
+ // 安全检查 - 防止超长字符串攻击
+ if (value.length() > MAX_STRING_LENGTH) {
+ log.warn("字符串长度超过安全限制: {} > {}", value.length(), MAX_STRING_LENGTH);
+ ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAX;
+ msg.setFieldName(metadata.fieldName);
+ throw new ServiceException(msg);
+ }
+
+ int byteLength = value.getBytes(StandardCharsets.UTF_8).length;
+
+ if (metadata.maxLength > 0 && byteLength > metadata.maxLength) {
+ ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAX;
+ msg.setFieldName(metadata.fieldName);
+ throw new ServiceException(msg);
+ }
+
+ if (metadata.minLength > 0 && byteLength < metadata.minLength) {
+ ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MIN;
+ msg.setFieldName(metadata.fieldName);
+ throw new ServiceException(msg);
+ }
+ }
+
+ /**
+ * 初始化验证器策略
+ */
+ private static void initializeValidatorStrategies() {
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_NOT_NULL, new NotNullValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_GENERAL, new GeneralValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_INTEGER, new IntegerValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_DECIMAL, new DecimalValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_PRIMES, new PrimesValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_LETTER, new LetterValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_UPPER_CASE, new UpperCaseValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_LOWER_CASE, new LowerCaseValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_IP, new IpValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_IPV4, new Ipv4ValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_IPV6, new Ipv6ValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_MONEY, new MoneyValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_EMAIL, new EmailValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_MOBILE, new MobileValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_CITIZENID, new CitizenIdValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_ZIPCODE, new ZipCodeValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_URL, new UrlValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_CHINESE, new ChineseValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_GENERAL_WITH_CHINESE, new GeneralWithChineseValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_MAC, new MacValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_PLATE_NUMBER, new PlateNumberValidatorStrategy());
+ VALIDATOR_STRATEGIES.put(ValidatorType.IS_SECURITY_PASSWORD, new SecurityPasswordValidatorStrategy());
+ }
+
+ // ======================= 内部类定义 =======================
+
+ /**
+ * 字段元数据
+ */
+ private static class FieldMetadata {
+ final Field field;
+ final String fieldName;
+ final ValidatorType[] validatorTypes;
+ final int maxLength;
+ final int minLength;
+
+ FieldMetadata(Field field, String fieldName, ValidatorType[] validatorTypes,
+ int maxLength, int minLength) {
+ this.field = field;
+ this.fieldName = fieldName;
+ this.validatorTypes = validatorTypes;
+ this.maxLength = maxLength;
+ this.minLength = minLength;
+ }
+
+ boolean hasValidation() {
+ return validatorTypes.length > 0 || maxLength > 0 || minLength > 0;
+ }
+ }
+
+ /**
+ * 验证上下文 - 防止循环引用和深度攻击
+ */
+ private static class ValidationContext {
+ private final Set validatedObjects = new HashSet<>();
+ private int depth = 0;
+
+ void reset() {
+ validatedObjects.clear();
+ depth = 0;
+ }
+
+ boolean canValidate(Object obj) {
+ // 检查深度限制
+ if (depth >= MAX_VALIDATION_DEPTH) {
+ log.warn("验证深度超过限制: {}", depth);
+ return false;
+ }
+
+ // 检查循环引用
+ if (validatedObjects.contains(obj)) {
+ return false;
+ }
+
+ validatedObjects.add(obj);
+ depth++;
+ return true;
+ }
+
+ void cleanup() {
+ validatedObjects.clear();
+ depth = 0;
+ }
+ }
+
+ /**
+ * 验证器策略接口
+ */
+ private interface ValidatorStrategy {
+ boolean validate(String value);
+ ValidatorMsg getErrorMessage();
+ }
+
+ /**
+ * 抽象验证器策略 - 提供通用功能
+ */
+ private abstract static class AbstractValidatorStrategy implements ValidatorStrategy {
+
+ @Override
+ public final boolean validate(String value) {
+ try {
+ if (shouldSkipValidation(value)) {
+ return true;
}
+ return doValidate(value);
+ } catch (Exception e) {
+ log.debug("验证异常: {}", e.getMessage());
+ return false;
}
- }catch (ServiceException e){
- throw e;
- }catch (Exception e){
- log.error(e.getMessage(),e);
+ }
+
+ protected boolean shouldSkipValidation(String value) {
+ return StringUtils.isEmpty(value);
+ }
+
+ protected abstract boolean doValidate(String value);
+ }
+
+ // ======================= 具体验证器策略实现 =======================
+
+ private static class NotNullValidatorStrategy implements ValidatorStrategy {
+ @Override
+ public boolean validate(String value) {
+ return StringUtils.isNotEmpty(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_NOT_NULL;
+ }
+ }
+
+ private static class GeneralValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isGeneral(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_GENERAL;
+ }
+ }
+
+ private static class IntegerValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return NumberUtil.isInteger(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_INTEGER;
+ }
+ }
+
+ private static class DecimalValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return NumberUtil.isDouble(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_DECIMAL;
+ }
+ }
+
+ private static class PrimesValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return NumberUtil.isInteger(value) && NumberUtil.isPrimes(Convert.toInt(value));
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_PRIMES;
}
}
- public static void main(String[] args) {
- DictModel dictModel = new DictModel();
- dictModel.setTypeCode("asdsa");
- dictModel.setTypeName("阿哈哈哈哈");
- dictModel.setRemark("测试11232131231231223123");
- dictModel.setIzLock("1");
+ private static class LetterValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isLetter(value);
+ }
- ValidatorUtil.verify(dictModel);
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_LETTER;
+ }
}
+ private static class UpperCaseValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isUpperCase(value);
+ }
- // ================
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_UPPER_CASE;
+ }
+ }
- private ValidatorUtil(){}
+ private static class LowerCaseValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isLowerCase(value);
+ }
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_LOWER_CASE;
+ }
+ }
+
+ private static class IpValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isIpv4(value) || Validator.isIpv6(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_IP;
+ }
+ }
+
+ private static class Ipv4ValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isIpv4(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_IPV4;
+ }
+ }
+
+ private static class Ipv6ValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isIpv6(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_IPV6;
+ }
+ }
+
+ private static class MoneyValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isMoney(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_MONEY;
+ }
+ }
+
+ private static class EmailValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isEmail(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_EMAIL;
+ }
+ }
+
+ private static class MobileValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isMobile(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_MOBILE;
+ }
+ }
+
+ private static class CitizenIdValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isCitizenId(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_CITIZENID;
+ }
+ }
+
+ private static class ZipCodeValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isZipCode(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_ZIPCODE;
+ }
+ }
+
+ private static class UrlValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isUrl(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_URL;
+ }
+ }
+
+ private static class ChineseValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isChinese(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_CHINESE;
+ }
+ }
+
+ private static class GeneralWithChineseValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isGeneralWithChinese(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_GENERAL_WITH_CHINESE;
+ }
+ }
+
+ private static class MacValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isMac(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_MAC;
+ }
+ }
+
+ private static class PlateNumberValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isPlateNumber(value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_PLATE_NUMBER;
+ }
+ }
+
+ private static class SecurityPasswordValidatorStrategy extends AbstractValidatorStrategy {
+ @Override
+ protected boolean doValidate(String value) {
+ return Validator.isMatchRegex(DefPatternPool.SECURITY_PASSWORD, value);
+ }
+
+ @Override
+ public ValidatorMsg getErrorMessage() {
+ return ValidatorMsg.EXCEPTION_IS_SECURITY_PASSWORD;
+ }
+ }
+
+ /**
+ * 清理缓存 - 用于测试或内存管理
+ */
+ public static void clearCache() {
+ FIELD_METADATA_CACHE.invalidateAll();
+ FIELD_NAME_CACHE.invalidateAll();
+ }
+
+ // 私有构造函数
+ private ValidatorUtil() {}
}
+
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/AbstractModelHelper.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/AbstractModelHelper.java
index 15ed5bb6..b01cc1a0 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/AbstractModelHelper.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/AbstractModelHelper.java
@@ -23,7 +23,7 @@ import org.opsli.api.base.warpper.ApiWrapper;
*
* 抽象 实体助手
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16
*/
public abstract class AbstractModelHelper {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/ModelFactoryHelper.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/ModelFactoryHelper.java
index 7e209681..4719ed71 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/ModelFactoryHelper.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/utils/excel/factory/ModelFactoryHelper.java
@@ -1,21 +1,5 @@
-/**
- * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com
- *
- * 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
- *
- * 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.opsli.core.utils.excel.factory;
-import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
@@ -23,228 +7,247 @@ import javassist.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.warpper.ApiWrapper;
-import org.opsli.api.wrapper.system.tenant.TenantModel;
import org.opsli.core.utils.ExcelUtil;
import org.opsli.plugins.excel.annotation.ExcelInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
- * 助手类工厂
+ * 助手类工厂 优化在jdk9+ JPMS 中使用
+ * 主要用于在excel导出时 大规模匹配字典类
*
- * @author Parker
- * @date 2020-09-16
+ * @author Pace
+ * @date 2025-06-01
*/
@Slf4j
public final class ModelFactoryHelper {
/**
- * Model helper 字典
+ * Model helper 字典 - 使用ConcurrentHashMap提高并发安全性
*/
- static private final Map,AbstractModelHelper> MODEL_HELPER_MAP = new HashMap<>();
+ static private final Map, AbstractModelHelper> MODEL_HELPER_MAP = new ConcurrentHashMap<>();
/**
* 私有化构造函数
*/
- private ModelFactoryHelper(){}
+ private ModelFactoryHelper() {}
/**
* 获得 Model 帮助类
* @param modelClazz 模型 class
* @return AbstractModelHelper
*/
- public static AbstractModelHelper getModelHelper(Class> modelClazz) throws Exception{
- // 这里需要全新设计,
- // 接下来就该请出 javassist 了!
-
- if(null == modelClazz){
+ public static AbstractModelHelper getModelHelper(Class> modelClazz) throws Exception {
+ if (null == modelClazz) {
return null;
}
- AbstractModelHelper helper = MODEL_HELPER_MAP.get(modelClazz);
+ // 检查缓存
+ return MODEL_HELPER_MAP.computeIfAbsent(modelClazz, clazz -> {
+ try {
+ return generateModelHelper(clazz);
+ } catch (Exception e) {
+ log.error("Failed to generate model helper for class: " + clazz.getName(), e);
+ throw new RuntimeException("Failed to generate model helper: " + e.getMessage(), e);
+ }
+ });
+ }
- // 如果字典map中 存在 则直接返回对象 不需要二次创建 避免性能过度损耗
- if(null != helper){
- return helper;
+ /**
+ * 生成模型助手类
+ * @param modelClazz 模型类
+ * @return 助手类实例
+ */
+ private static AbstractModelHelper generateModelHelper(Class> modelClazz) throws Exception {
+ ClassPool classPool = ClassPool.getDefault();
+
+ // 添加必要的类路径
+ classPool.appendClassPath(new ClassClassPath(modelClazz));
+ classPool.appendClassPath(new ClassClassPath(AbstractModelHelper.class));
+ classPool.appendSystemPath();
+
+ // 导入必要的包
+ String[] importPackages = {
+ StringUtils.class.getName(),
+ ReflectUtil.class.getName(),
+ Field.class.getName(),
+ JSONObject.class.getName(),
+ JSONUtil.class.getName(),
+ ExcelUtil.class.getName(),
+ ExcelInfo.class.getName(),
+ ApiWrapper.class.getName(),
+ modelClazz.getName()
+ };
+
+ for (String packageName : importPackages) {
+ classPool.importPackage(packageName);
}
- // 使用 Javassist 动态生成 Java 字节码
- ///////////////////////////////////////////////////////////////////////
- ClassPool clazzPool = ClassPool.getDefault();
- clazzPool.insertClassPath(new ClassClassPath(StringUtils.class));
- clazzPool.insertClassPath(new ClassClassPath(ReflectUtil.class));
- clazzPool.insertClassPath(new ClassClassPath(Field.class));
- clazzPool.insertClassPath(new ClassClassPath(Iterator.class));
- clazzPool.insertClassPath(new ClassClassPath(Convert.class));
- clazzPool.insertClassPath(new ClassClassPath(JSONObject.class));
- clazzPool.insertClassPath(new ClassClassPath(JSONUtil.class));
- clazzPool.insertClassPath(new ClassClassPath(ExcelUtil.class));
- clazzPool.insertClassPath(new ClassClassPath(ExcelInfo.class));
- clazzPool.insertClassPath(new ClassClassPath(ApiWrapper.class));
- clazzPool.insertClassPath(new ClassClassPath(modelClazz));
-
- // 添加class 系统路径
- clazzPool.appendSystemPath();
-
- // 导包
- // import cn.hutool.core.convert.Convert
- clazzPool.importPackage(StringUtils.class.getName());
- clazzPool.importPackage(ReflectUtil.class.getName());
- clazzPool.importPackage(Field.class.getName());
- clazzPool.importPackage(Iterator.class.getName());
- clazzPool.importPackage(Convert.class.getName());
- clazzPool.importPackage(JSONObject.class.getName());
- clazzPool.importPackage(JSONUtil.class.getName());
- clazzPool.importPackage(ExcelUtil.class.getName());
- clazzPool.importPackage(ExcelInfo.class.getName());
- clazzPool.importPackage(ApiWrapper.class.getName());
- clazzPool.importPackage(modelClazz.getName());
-
- // 抽象助手类
- CtClass abstractEntityHelper = clazzPool.getCtClass(AbstractModelHelper.class.getName());
// 助手类名称
- final String entityHelperName = modelClazz.getName()+"_Helper";
+ final String entityHelperName = modelClazz.getName() + "_Helper";
+
+ // 获取抽象助手类
+ CtClass abstractEntityHelper = classPool.getCtClass(AbstractModelHelper.class.getName());
+
+ // 检查是否已存在这个类,避免重复创建
+ try {
+ CtClass existingClass = classPool.getCtClass(entityHelperName);
+ if (existingClass != null) {
+ existingClass.detach(); // 分离已存在的类,允许重新定义
+ }
+ } catch (NotFoundException ignored) {
+ // 类不存在,可以继续创建
+ }
+
// 构建助手类
- CtClass helperClazz = clazzPool.makeClass(entityHelperName, abstractEntityHelper);
+ CtClass helperClazz = classPool.makeClass(entityHelperName, abstractEntityHelper);
+
// 添加字段属性
CtField f1 = CtField.make("private static final JSONObject fieldNameAndTypeCodeDict = JSONUtil.createObj();", helperClazz);
helperClazz.addField(f1);
-
- // 添加构造函数
- // 创建方法体 ---------------
-
- CtConstructor constructor = new CtConstructor(new CtClass[0],helperClazz);
- // 空的方法体
- final String constructorStr = "{" +
- " Field[] fields = ReflectUtil.getFields(" + modelClazz.getName() + ".class);" +
- " for (int i = 0; i < fields.length; i++) { " +
- " Field field = fields[i];" +
- " ExcelInfo excelInfo = field.getAnnotation(ExcelInfo.class);" +
- " if(excelInfo != null){" +
- " String dictType = excelInfo.dictType();" +
- " if(StringUtils.isNotEmpty(dictType)){" +
- " fieldNameAndTypeCodeDict.putOpt(field.getName(), dictType);" +
- " }" +
- " }" +
- " }" +
- "}";
+ // 添加构造函数 - 修复语法,使用传统for循环而不是foreach
+ CtConstructor constructor = new CtConstructor(new CtClass[0], helperClazz);
+ // 构造函数方法体
+ final String constructorStr = "{"
+ + " Field[] fields = ReflectUtil.getFields(" + modelClazz.getName() + ".class);"
+ + " for (int i = 0; i < fields.length; i++) { " // 修复这里,使用传统for循环
+ + " Field field = fields[i];"
+ + " ExcelInfo excelInfo = field.getAnnotation(ExcelInfo.class);"
+ + " if(excelInfo != null){"
+ + " String dictType = excelInfo.dictType();"
+ + " if(StringUtils.isNotEmpty(dictType)){"
+ + " fieldNameAndTypeCodeDict.putOpt(field.getName(), dictType);"
+ + " }"
+ + " }"
+ + " }"
+ + "}";
constructor.setBody(constructorStr);
helperClazz.addConstructor(constructor);
Field[] fields = ReflectUtil.getFields(modelClazz);
- // 创建 导入对象方法体 ---------------
-
- // 解析方法
+ // 创建 导入对象方法体
StringBuilder createByImportSb = new StringBuilder();
createByImportSb.append("public void transformByImport(JSONObject dictJson, ApiWrapper wrapper){").append("\n");
- createByImportSb.append(modelClazz.getName()).append(" model = (").append(modelClazz.getName()).append(") wrapper;").append("\n");
- createByImportSb.append("if(model == null){ return;}").append("\n");
- createByImportSb.append("if(dictJson == null){ return;}").append("\n");
+ createByImportSb.append(" ").append(modelClazz.getName()).append(" model = (").append(modelClazz.getName()).append(") wrapper;").append("\n");
+ createByImportSb.append(" if(model == null || dictJson == null){ return;}").append("\n");
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
ExcelInfo excelInfo = field.getAnnotation(ExcelInfo.class);
- if(excelInfo == null){
+ if (excelInfo == null) {
continue;
}
// 字典
String dictType = excelInfo.dictType();
- if(StringUtils.isEmpty(dictType)) {
+ if (StringUtils.isEmpty(dictType)) {
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), modelClazz);
- // 获得SET方法
Method writeMethod = pd.getWriteMethod();
- // 获得GET方法
Method readMethod = pd.getReadMethod();
- createByImportSb.append("String dictValue").append(i).append(" = \"\";").append("\n")
- .append("if(dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")").append(") != null &&")
- .append("dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
+ createByImportSb.append(" String dictValue").append(i).append(" = \"\";").append("\n")
+ .append(" if(dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")) != null &&")
+ .append(" dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
.append(").getJSONObject(ExcelUtil.DICT_NAME_KEY) != null ){").append("\n")
- .append("dictValue").append(i).append(" = dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
+ .append(" dictValue").append(i).append(" = dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
.append(").getJSONObject(ExcelUtil.DICT_NAME_KEY).getStr(")
.append("model.").append(readMethod.getName()).append("());").append("\n")
- .append("}").append("\n");
+ .append(" }").append("\n");
- createByImportSb.append("model.").append(writeMethod.getName()).append("(").append("dictValue").append(i).append(");").append("\n");
+ createByImportSb.append(" model.").append(writeMethod.getName()).append("(dictValue").append(i).append(");").append("\n");
}
createByImportSb.append("}");
+
CtMethod createByImportMethod = CtNewMethod.make(createByImportSb.toString(), helperClazz);
- // 添加方法到clazz中
helperClazz.addMethod(createByImportMethod);
- // 创建 导出对象方法体 ---------------
-
- // 解析方法
+ // 创建 导出对象方法体
StringBuilder createByExportSb = new StringBuilder();
createByExportSb.append("public void transformByExport(JSONObject dictJson, ApiWrapper wrapper){").append("\n");
- createByExportSb.append(modelClazz.getName()).append(" model = (").append(modelClazz.getName()).append(") wrapper;").append("\n");
- createByExportSb.append("if(model == null){ return;}").append("\n");
- createByExportSb.append("if(dictJson == null){ return;}").append("\n");
+ createByExportSb.append(" ").append(modelClazz.getName()).append(" model = (").append(modelClazz.getName()).append(") wrapper;").append("\n");
+ createByExportSb.append(" if(model == null || dictJson == null){ return;}").append("\n");
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
ExcelInfo excelInfo = field.getAnnotation(ExcelInfo.class);
- if(excelInfo == null){
+ if (excelInfo == null) {
continue;
}
// 字典
String dictType = excelInfo.dictType();
- if(StringUtils.isEmpty(dictType)) {
+ if (StringUtils.isEmpty(dictType)) {
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), modelClazz);
- // 获得SET方法
Method writeMethod = pd.getWriteMethod();
- // 获得GET方法
Method readMethod = pd.getReadMethod();
- createByExportSb.append("String dictValue").append(i).append(" = \"\";").append("\n")
- .append("if(dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")").append(") != null &&")
- .append("dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
+ createByExportSb.append(" String dictValue").append(i).append(" = \"\";").append("\n")
+ .append(" if(dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")) != null &&")
+ .append(" dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
.append(").getJSONObject(ExcelUtil.DICT_VALUE_KEY) != null ){").append("\n")
- .append("dictValue").append(i).append(" = dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
+ .append(" dictValue").append(i).append(" = dictJson.getJSONObject(fieldNameAndTypeCodeDict.getStr(\"").append(field.getName()).append("\")")
.append(").getJSONObject(ExcelUtil.DICT_VALUE_KEY).getStr(")
.append("model.").append(readMethod.getName()).append("());").append("\n")
- .append("}").append("\n");
+ .append(" }").append("\n");
- createByExportSb.append("model.").append(writeMethod.getName()).append("(").append("dictValue").append(i).append(");").append("\n");
+ createByExportSb.append(" model.").append(writeMethod.getName()).append("(dictValue").append(i).append(");").append("\n");
}
createByExportSb.append("}");
+
CtMethod createByExportMethod = CtNewMethod.make(createByExportSb.toString(), helperClazz);
- // 添加方法到clazz中
helperClazz.addMethod(createByExportMethod);
+ // 使用自定义类加载器而不是直接调用toClass()
+ byte[] byteCode = helperClazz.toBytecode();
+
+
// 生成文件 测试查看使用
- //helperClazz.writeFile("C:/Users/zhoupengcheng/Desktop/test");
+ //helperClazz.writeFile("/Users/system/Desktop/saas 部署/测试");
+
+ // 释放CtClass资源
+ helperClazz.detach();
- // 获取 JAVA 类
- Class> javaClazz = helperClazz.toClass();
+ // 使用自定义类加载器加载类
+ ModelHelperClassLoader modelHelperClassLoader = new ModelHelperClassLoader(modelClazz.getClassLoader());
+ Class> javaClazz = modelHelperClassLoader.defineClass(entityHelperName, byteCode);
// 创建帮助对象实例
- ///////////////////////////////////////////////////////////////////////
- helper = (AbstractModelHelper) javaClazz.newInstance();
+ return (AbstractModelHelper) javaClazz.getDeclaredConstructor().newInstance();
+ }
- // 将实例对象 添加至 map 字典中
- MODEL_HELPER_MAP.put(modelClazz, helper);
+ /**
+ * 自定义类加载器 - 用于绕过Java 9+模块系统的限制
+ */
+ private static class ModelHelperClassLoader extends ClassLoader {
+ public ModelHelperClassLoader(ClassLoader parent) {
+ super(parent);
+ }
- return helper;
+ public Class> defineClass(String name, byte[] b) {
+ return defineClass(name, b, 0, b.length);
+ }
}
-
- public static void main(String[] args) throws Exception {
- ModelFactoryHelper.getModelHelper(TenantModel.class);
+ public static void main(String[] args) {
+ try {
+ // 使用类全名
+ Class> tenantModelClass = Class.forName("org.opsli.api.wrapper.system.tenant.TenantModel");
+ AbstractModelHelper helper = ModelFactoryHelper.getModelHelper(tenantModelClass);
+ System.out.println("成功创建助手类: " + helper);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/OssStorageFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/OssStorageFactory.java
index d2b21093..71d46a46 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/OssStorageFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/OssStorageFactory.java
@@ -31,7 +31,7 @@ import java.util.Set;
/**
* OSS服务 工厂
*
- * @author Parker
+ * @author Pace
* @date 2021年3月16日10:16:29
*/
@Slf4j
@@ -104,7 +104,7 @@ public enum OssStorageFactory {
}
try {
- Object obj = aClass.newInstance();
+ Object obj = aClass.getDeclaredConstructor().newInstance();
OssStorageService handler = (OssStorageService) obj;
// 加入集合
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/ConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/ConfigFactory.java
index 1ff10dc1..0091acd3 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/ConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/ConfigFactory.java
@@ -4,7 +4,7 @@ package org.opsli.plugins.oss.conf;
/**
* 获得配置信息 接口
*
- * @author Parker
+ * @author Pace
* @date 2021年5月7日17:39:32
*/
public interface ConfigFactory {
diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/LocalConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/LocalConfigFactory.java
index 2a775abe..00aa471b 100644
--- a/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/LocalConfigFactory.java
+++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/plugins/oss/conf/LocalConfigFactory.java
@@ -15,7 +15,7 @@
*/
package org.opsli.plugins.oss.conf;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.opsli.common.annotation.OptionDict;
import org.opsli.common.annotation.validator.Validator;
@@ -23,12 +23,13 @@ import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.enums.ValidatorType;
import org.opsli.core.utils.OptionsUtil;
+import java.io.Serial;
import java.io.Serializable;
/**
* 本地存储配置工程
*
- * @author Parker
+ * @author Pace
* @date 2020-09-19 20:03
*/
public enum LocalConfigFactory implements ConfigFactory {
@@ -55,22 +56,23 @@ public enum LocalConfigFactory implements ConfigFactory {
@@ -55,43 +56,44 @@ public enum UpYunConfigFactory implements ConfigFactory {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/service/impl/GenTableColumnServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/service/impl/GenTableColumnServiceImpl.java
index c3775011..abbd7e74 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/service/impl/GenTableColumnServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/service/impl/GenTableColumnServiceImpl.java
@@ -38,7 +38,7 @@ import java.util.List;
/**
* 代码生成器 - 表结构 接口实现类
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/wrapper/GenTableColumnModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/wrapper/GenTableColumnModel.java
index e554d324..375c2ade 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/wrapper/GenTableColumnModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/column/wrapper/GenTableColumnModel.java
@@ -17,7 +17,7 @@ package org.opsli.modulars.generator.column.wrapper;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -30,7 +30,7 @@ import java.util.List;
/**
* 代码生成器 - 表 模型
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
@@ -38,100 +38,100 @@ import java.util.List;
public class GenTableColumnModel extends ApiWrapper {
/** 归属表ID */
- @ApiModelProperty(value = "归属表ID")
+ @Schema(description = "归属表ID")
@ExcelIgnore
private String tableId;
/** 字段名称 */
- @ApiModelProperty(value = "字段名称")
+ @Schema(description = "字段名称")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
@ValidatorLenMax(100)
private String fieldName;
/** 字段类型 */
- @ApiModelProperty(value = "字段类型")
+ @Schema(description = "字段类型")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
@ValidatorLenMax(100)
private String fieldType;
/** 字段长度 */
- @ApiModelProperty(value = "字段长度")
+ @Schema(description = "字段长度")
@ExcelIgnore
private Integer fieldLength;
/** 字段精度 */
- @ApiModelProperty(value = "字段精度")
+ @Schema(description = "字段精度")
@ExcelIgnore
private Integer fieldPrecision;
/** 字段描述 */
- @ApiModelProperty(value = "字段描述")
+ @Schema(description = "字段描述")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(200)
private String fieldComments;
/** 是否主键 */
- @ApiModelProperty(value = "是否主键")
+ @Schema(description = "是否主键")
@ExcelIgnore
@ValidatorLenMax(1)
private String izPk;
/** 是否可为空 */
- @ApiModelProperty(value = "是否可为空")
+ @Schema(description = "是否可为空")
@ExcelIgnore
@ValidatorLenMax(1)
private String izNotNull;
/** 是否列表显示 */
- @ApiModelProperty(value = "是否列表显示")
+ @Schema(description = "是否列表显示")
@ExcelIgnore
@ValidatorLenMax(1)
private String izShowList;
/** 是否表单显示 */
- @ApiModelProperty(value = "是否表单显示")
+ @Schema(description = "是否表单显示")
@ExcelIgnore
@ValidatorLenMax(1)
private String izShowForm;
/** Java字段类型 */
- @ApiModelProperty(value = "Java字段类型")
+ @Schema(description = "Java字段类型")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(50)
private String javaType;
/** 字段生成方案(文本框、文本域、字典选择) */
- @ApiModelProperty(value = "字段生成方案")
+ @Schema(description = "字段生成方案")
@ExcelIgnore
@ValidatorLenMax(1)
private String showType;
/** 字典类型编号 */
- @ApiModelProperty(value = "字典类型编号")
+ @Schema(description = "字典类型编号")
@ExcelIgnore
@Validator({ValidatorType.IS_GENERAL})
@ValidatorLenMax(100)
private String dictTypeCode;
/** 排序(升序) */
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(6)
private Integer sort;
/** 验证类别 */
- @ApiModelProperty(value = "验证类别")
+ @Schema(description = "验证类别")
@ExcelIgnore
@ValidatorLenMax(500)
private String validateType;
/** 检索类别 */
- @ApiModelProperty(value = "检索类别")
+ @Schema(description = "检索类别")
@ExcelIgnore
@Validator({ValidatorType.IS_GENERAL})
@ValidatorLenMax(100)
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/general/actuator/SQLActuator.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/general/actuator/SQLActuator.java
index 3440ca28..78356853 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/general/actuator/SQLActuator.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/general/actuator/SQLActuator.java
@@ -22,7 +22,7 @@ import org.apache.ibatis.annotations.Update;
/**
* 代码生成器 - SQL 执行器
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/ImportTableUtil.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/ImportTableUtil.java
index 944529ee..84c9e246 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/ImportTableUtil.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/ImportTableUtil.java
@@ -20,17 +20,16 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ClassUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.core.autoconfigure.properties.DbSourceProperties;
-import org.opsli.plugins.generator.database.mysql.MySqlSyncColumnType;
-import org.opsli.plugins.generator.enums.DataBaseType;
import org.opsli.core.utils.SpringContextHolder;
import org.opsli.modulars.generator.importable.entity.DatabaseColumn;
import org.opsli.modulars.generator.importable.entity.DatabaseTable;
import org.opsli.modulars.generator.importable.service.DatabaseTableService;
+import org.opsli.plugins.generator.enums.DataBaseType;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Modifier;
@@ -43,7 +42,7 @@ import java.util.concurrent.ConcurrentMap;
/**
* 数据库同步策略 工具类
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Slf4j
@@ -238,8 +237,9 @@ public class ImportTableUtil{
// ====================================
- @Bean
- public void initImportTable(){
+ @Autowired
+ public void init(DbSourceProperties dbSourceProperties) {
+ ImportTableUtil.dbSourceProperties = dbSourceProperties;
// 拿到state包下 实现了 SystemEventState 接口的,所有子类
Set> clazzSet = ClassUtil.scanPackageBySuper(
@@ -258,9 +258,4 @@ public class ImportTableUtil{
HANDLER_MAP.put(handler.getType(),handler);
}
}
-
- @Autowired
- public void init(DbSourceProperties dbSourceProperties) {
- ImportTableUtil.dbSourceProperties = dbSourceProperties;
- }
}
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseColumn.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseColumn.java
index ca99dd9d..fdb12e55 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseColumn.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseColumn.java
@@ -21,7 +21,7 @@ import lombok.EqualsAndHashCode;
/**
* 代码生成器 - 数据库表字段
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseTable.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseTable.java
index e46f54c2..a39818f9 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseTable.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/entity/DatabaseTable.java
@@ -21,7 +21,7 @@ import lombok.EqualsAndHashCode;
/**
* 代码生成器 - 数据库表
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/mapper/MySQLDatabaseTableMapper.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/mapper/MySQLDatabaseTableMapper.java
index ecb642d1..e630366d 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/mapper/MySQLDatabaseTableMapper.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/mapper/MySQLDatabaseTableMapper.java
@@ -25,7 +25,7 @@ import java.util.List;
/**
* 代码生成器 - 数据库表 Mapper
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/DatabaseTableService.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/DatabaseTableService.java
index 4c9b7703..edee63d7 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/DatabaseTableService.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/DatabaseTableService.java
@@ -26,7 +26,7 @@ import java.util.Map;
/**
* 代码生成器 - 数据库表
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
public interface DatabaseTableService {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/MySQLDatabaseTableServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/MySQLDatabaseTableServiceImpl.java
index 02e57454..5e0563a6 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/MySQLDatabaseTableServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/importable/service/MySQLDatabaseTableServiceImpl.java
@@ -34,7 +34,7 @@ import java.util.Map;
/**
* 代码生成器 - 表 接口实现类
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/api/GenLogsApi.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/api/GenLogsApi.java
index 3ce8ac9d..9a2131c9 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/api/GenLogsApi.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/api/GenLogsApi.java
@@ -20,8 +20,8 @@ import org.opsli.modulars.generator.logs.wrapper.GenLogsModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
@@ -32,7 +32,7 @@ import javax.servlet.http.HttpServletResponse;
*
* 这样写法虽然比较绕,但是当单体项目想要改造微服务架构时 时非常容易的
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
public interface GenLogsApi {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/entity/GenLogs.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/entity/GenLogs.java
index 542f6255..d825606e 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/entity/GenLogs.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/entity/GenLogs.java
@@ -22,7 +22,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 代码生成器 - 生成日志 (便于二次生成时查看)
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/mapper/GenLogsMapper.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/mapper/GenLogsMapper.java
index c333a538..c97866c8 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/mapper/GenLogsMapper.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/mapper/GenLogsMapper.java
@@ -23,7 +23,7 @@ import org.opsli.modulars.generator.logs.entity.GenLogs;
/**
* 代码生成器 - 生成日志 Mapper
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/IGenLogsService.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/IGenLogsService.java
index 5d85bdec..c3ae0a95 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/IGenLogsService.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/IGenLogsService.java
@@ -19,13 +19,13 @@ import org.opsli.core.base.service.interfaces.CrudServiceInterface;
import org.opsli.modulars.generator.logs.entity.GenLogs;
import org.opsli.modulars.generator.logs.wrapper.GenLogsModel;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 代码生成器 - 日志 接口
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
public interface IGenLogsService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/impl/GenLogsServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/impl/GenLogsServiceImpl.java
index c8a3b3b3..84f5d91d 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/impl/GenLogsServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/service/impl/GenLogsServiceImpl.java
@@ -44,14 +44,14 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 代码生成器 - 日志 接口实现类
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Lazy(false)
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/web/GenLogsRestController.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/web/GenLogsRestController.java
index 0da577fb..ad47d6d0 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/web/GenLogsRestController.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/logs/web/GenLogsRestController.java
@@ -15,40 +15,39 @@
*/
package org.opsli.modulars.generator.logs.web;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
-import org.opsli.core.log.annotation.OperateLogger;
-import org.opsli.core.log.enums.ModuleEnum;
-import org.opsli.core.log.enums.OperationTypeEnum;
-import org.springframework.security.access.prepost.PreAuthorize;
import org.opsli.api.base.result.ResultWrapper;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.core.base.controller.BaseRestController;
+import org.opsli.core.log.annotation.OperateLogger;
+import org.opsli.core.log.enums.ModuleEnum;
+import org.opsli.core.log.enums.OperationTypeEnum;
import org.opsli.modulars.generator.logs.api.GenLogsApi;
import org.opsli.modulars.generator.logs.entity.GenLogs;
import org.opsli.modulars.generator.logs.service.IGenLogsService;
import org.opsli.modulars.generator.logs.wrapper.GenLogsModel;
import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
/**
* 代码生成器日志
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
-@Api(tags = GenLogsApi.TITLE)
+@Tag(name = GenLogsApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/generator/logs")
public class GenLogsRestController extends BaseRestController
implements GenLogsApi {
- @ApiOperation(value = "获得当前表生成记录", notes = "获得当前表生成记录")
+ @Operation(summary = "获得当前表生成记录")
@PreAuthorize("hasAuthority('dev_generator_select')")
@Override
public ResultWrapper getByTableId(String tableId) {
@@ -62,7 +61,7 @@ public class GenLogsRestController extends BaseRestController {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/service/impl/GenTableServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/service/impl/GenTableServiceImpl.java
index 91a5a4ef..1eaa89fe 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/service/impl/GenTableServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/service/impl/GenTableServiceImpl.java
@@ -48,7 +48,7 @@ import java.util.List;
/**
* 代码生成器 - 表 接口实现类
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/web/GenTableRestController.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/web/GenTableRestController.java
index a6107c46..ca10731a 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/web/GenTableRestController.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/web/GenTableRestController.java
@@ -16,22 +16,18 @@
package org.opsli.modulars.generator.table.web;
import cn.hutool.core.convert.Convert;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
-import org.opsli.core.log.annotation.OperateLogger;
-import org.opsli.core.log.enums.ModuleEnum;
-import org.opsli.core.log.enums.OperationTypeEnum;
-import org.springframework.security.access.prepost.PreAuthorize;
import org.opsli.api.base.result.ResultWrapper;
import org.opsli.common.annotation.ApiRestController;
-
import org.opsli.common.exception.ServiceException;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.controller.BaseRestController;
-import org.opsli.plugins.generator.exception.GeneratorException;
-import org.opsli.plugins.generator.msg.GeneratorMsg;
-import org.opsli.plugins.generator.SqlSyncUtil;
+import org.opsli.core.log.annotation.OperateLogger;
+import org.opsli.core.log.enums.ModuleEnum;
+import org.opsli.core.log.enums.OperationTypeEnum;
import org.opsli.core.msg.CoreMsg;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
@@ -44,10 +40,13 @@ import org.opsli.modulars.generator.table.entity.GenTable;
import org.opsli.modulars.generator.table.service.IGenTableService;
import org.opsli.modulars.generator.table.wrapper.GenTableAndColumnModel;
import org.opsli.modulars.generator.table.wrapper.GenTableModel;
+import org.opsli.plugins.generator.SqlSyncUtil;
+import org.opsli.plugins.generator.exception.GeneratorException;
+import org.opsli.plugins.generator.msg.GeneratorMsg;
import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
-import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@@ -55,10 +54,10 @@ import java.util.Map;
/**
* 代码生成器 - 表
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
-@Api(tags = TableApi.TITLE)
+@Tag(name = TableApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/generator/table")
public class GenTableRestController extends BaseRestController
@@ -73,7 +72,7 @@ public class GenTableRestController extends BaseRestController get(GenTableModel model) {
@@ -106,7 +105,7 @@ public class GenTableRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
@@ -126,7 +125,7 @@ public class GenTableRestController extends BaseRestController getTables() {
@@ -271,7 +270,8 @@ public class GenTableRestController extends BaseRestController> getFieldTypes() {
// 判断代码生成器 是否启用
@@ -299,8 +299,7 @@ public class GenTableRestController extends BaseRestController> getJavaFieldTypes() {
// 判断代码生成器 是否启用
@@ -309,8 +308,7 @@ public class GenTableRestController extends BaseRestController>> getJavaFieldTypesBySafety() {
// 判断代码生成器 是否启用
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableAndColumnModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableAndColumnModel.java
index 1d990749..9abe8658 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableAndColumnModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableAndColumnModel.java
@@ -17,7 +17,7 @@ package org.opsli.modulars.generator.table.wrapper;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -31,7 +31,7 @@ import java.util.List;
/**
* 代码生成器 - 表和表结构
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
@@ -40,51 +40,51 @@ public class GenTableAndColumnModel extends ApiWrapper {
/** 表名称 */
- @ApiModelProperty(value = "表名称")
+ @Schema(description = "表名称")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
@ValidatorLenMax(100)
private String tableName;
/** 旧表名称 */
- @ApiModelProperty(value = "旧表名称")
+ @Schema(description = "旧表名称")
@ExcelIgnore
private String oldTableName;
/** 表类型 */
- @ApiModelProperty(value = "表类型")
+ @Schema(description = "表类型")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(1)
private String tableType;
/** 数据库类型 */
- @ApiModelProperty(value = "数据库类型")
+ @Schema(description = "数据库类型")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
@ValidatorLenMax(30)
private String jdbcType;
/** 描述 */
- @ApiModelProperty(value = "描述")
+ @Schema(description = "描述")
@ExcelIgnore
@ValidatorLenMax(200)
private String comments;
/** 同步 */
- @ApiModelProperty(value = "同步")
+ @Schema(description = "同步")
@ExcelIgnore
@ValidatorLenMax(1)
private String izSync;
/** 备注 */
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
@ExcelIgnore
@ValidatorLenMax(255)
private String remark;
/** 表结构 */
- @ApiModelProperty(value = "表结构")
+ @Schema(description = "表结构")
@ExcelIgnore
@Validator({ValidatorType.IS_NOT_NULL})
private List columnList;
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableModel.java
index c0d38b83..3cd6246b 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/table/wrapper/GenTableModel.java
@@ -17,7 +17,7 @@ package org.opsli.modulars.generator.table.wrapper;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -29,7 +29,7 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* 代码生成器 - 表
*
- * @author parker
+ * @author Pace
* @date 2020-09-16 17:34
*/
@Data
@@ -38,7 +38,7 @@ public class GenTableModel extends ApiWrapper {
/** 表名称 */
- @ApiModelProperty(value = "表名称")
+ @Schema(description = "表名称")
@ExcelProperty(value = "表名称", order = 1)
@ExcelInfo
@Validator({ValidatorType.IS_NOT_NULL, ValidatorType.IS_GENERAL})
@@ -46,12 +46,12 @@ public class GenTableModel extends ApiWrapper {
private String tableName;
/** 旧表名称 */
- @ApiModelProperty(value = "旧表名称")
+ @Schema(description = "旧表名称")
@ExcelIgnore
private String oldTableName;
/** 表类型 */
- @ApiModelProperty(value = "表类型")
+ @Schema(description = "表类型")
@ExcelProperty(value = "表类型", order = 2)
@ExcelInfo(dictType = "table_type")
@Validator({ValidatorType.IS_NOT_NULL})
@@ -59,7 +59,7 @@ public class GenTableModel extends ApiWrapper {
private String tableType;
/** 数据库类型 */
- @ApiModelProperty(value = "数据库类型")
+ @Schema(description = "数据库类型")
@ExcelProperty(value = "数据库类型", order = 3)
@ExcelInfo(dictType = "jdbc_type")
@Validator({ValidatorType.IS_NOT_NULL})
@@ -67,21 +67,21 @@ public class GenTableModel extends ApiWrapper {
private String jdbcType;
/** 描述 */
- @ApiModelProperty(value = "描述")
+ @Schema(description = "描述")
@ExcelProperty(value = "描述", order = 4)
@ExcelInfo
@ValidatorLenMax(200)
private String comments;
/** 同步 */
- @ApiModelProperty(value = "同步")
+ @Schema(description = "同步")
@ExcelProperty(value = "是否同步", order = 5)
@ExcelInfo(dictType = "no_yes")
@ValidatorLenMax(1)
private String izSync;
/** 备注 */
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
@ExcelProperty(value = "备注", order = 6)
@ExcelInfo
@ValidatorLenMax(255)
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateDetailRestApi.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateDetailRestApi.java
index ba4a5426..0e2eed82 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateDetailRestApi.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateDetailRestApi.java
@@ -21,8 +21,8 @@ import org.opsli.api.base.result.ResultWrapper;
import org.opsli.modulars.generator.template.wrapper.GenTemplateDetailModel;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartHttpServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@@ -34,7 +34,7 @@ import java.util.List;
*
* 这样写法虽然比较绕,但是当单体项目想要改造微服务架构时 时非常容易的
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
public interface GenTemplateDetailRestApi {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateRestApi.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateRestApi.java
index c49ec54b..efc2e3fe 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateRestApi.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/api/GenTemplateRestApi.java
@@ -23,8 +23,8 @@ import org.opsli.modulars.generator.template.wrapper.GenTemplateCopyModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartHttpServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
@@ -36,7 +36,7 @@ import javax.servlet.http.HttpServletResponse;
*
* 这样写法虽然比较绕,但是当单体项目想要改造微服务架构时 时非常容易的
*
- * @author Parker
+ * @author Pace
* @date 2021-05-27 14:33:49
*/
public interface GenTemplateRestApi {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplate.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplate.java
index 196dbf62..eecf2376 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplate.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplate.java
@@ -32,7 +32,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 代码模板 Entity
*
- * @author Parker
+ * @author Pace
* @date 2021-05-27 14:33:49
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplateDetail.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplateDetail.java
index f4d5b09a..c9747d06 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplateDetail.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/entity/GenTemplateDetail.java
@@ -32,7 +32,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 代码模板详情 Entity
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateDetailMapper.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateDetailMapper.java
index 9587a890..73065e8f 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateDetailMapper.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateDetailMapper.java
@@ -27,7 +27,7 @@ import org.opsli.modulars.generator.template.entity.GenTemplateDetail;
/**
* 代码模板详情 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateMapper.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateMapper.java
index 5c94467a..449303e5 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateMapper.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/mapper/GenTemplateMapper.java
@@ -27,7 +27,7 @@ import org.opsli.modulars.generator.template.entity.GenTemplate;
/**
* 代码模板 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2021-05-27 14:33:49
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateDetailService.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateDetailService.java
index 5c3ad28b..5f5f69e5 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateDetailService.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateDetailService.java
@@ -27,7 +27,7 @@ import java.util.List;
/**
* 代码模板详情 Service
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
public interface IGenTemplateDetailService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateService.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateService.java
index e0fb5145..b8d6f0c3 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateService.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/IGenTemplateService.java
@@ -30,7 +30,7 @@ import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
/**
* 代码模板 Service
*
- * @author Parker
+ * @author Pace
* @date 2021-05-27 14:33:49
*/
public interface IGenTemplateService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateDetailServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateDetailServiceImpl.java
index d4bb5a33..d5afa571 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateDetailServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateDetailServiceImpl.java
@@ -48,7 +48,7 @@ import java.util.Set;
/**
* 代码模板详情 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateServiceImpl.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateServiceImpl.java
index bab912f8..93a38b0d 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/service/impl/GenTemplateServiceImpl.java
@@ -51,7 +51,7 @@ import java.util.List;
/**
* 代码模板 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2021-05-27 14:33:49
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/web/GenTemplateDetailRestController.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/web/GenTemplateDetailRestController.java
index 7d5e8854..0d34af4d 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/web/GenTemplateDetailRestController.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/web/GenTemplateDetailRestController.java
@@ -18,8 +18,8 @@ package org.opsli.modulars.generator.template.web;
import cn.hutool.core.convert.Convert;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.opsli.api.base.result.ResultWrapper;
import org.opsli.api.web.system.user.UserApi;
@@ -40,8 +40,8 @@ import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.multipart.MultipartHttpServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Optional;
@@ -49,10 +49,10 @@ import java.util.Optional;
/**
* 代码模板详情 Controller
*
- * @author Parker
+ * @author Pace
* @date 2021-05-28 17:12:38
*/
-@Api(tags = GenTemplateDetailRestApi.TITLE)
+@Tag(name = GenTemplateDetailRestApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/generator/template/detail")
public class GenTemplateDetailRestController extends BaseRestController
@@ -64,7 +64,7 @@ public class GenTemplateDetailRestController extends BaseRestController get(GenTemplateDetailModel model) {
@@ -82,7 +82,7 @@ public class GenTemplateDetailRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
@@ -102,7 +102,7 @@ public class GenTemplateDetailRestController extends BaseRestController exportExcelAuth(String type, HttpServletRequest request) {
Optional certificateOptional =
super.excelExportAuth(type, UserApi.SUB_TITLE, request);
- if(!certificateOptional.isPresent()){
+ if(certificateOptional.isEmpty()){
return ResultWrapper.getErrorResultWrapper();
}
return ResultWrapper.getSuccessResultWrapper(certificateOptional.get());
@@ -197,7 +197,7 @@ public class GenTemplateDetailRestController extends BaseRestController
@@ -63,7 +63,7 @@ public class GenTemplateRestController extends BaseRestController get(GenTemplateModel model) {
@@ -81,7 +81,7 @@ public class GenTemplateRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
@@ -101,7 +101,7 @@ public class GenTemplateRestController extends BaseRestController exportExcelAuth(String type, HttpServletRequest request) {
Optional certificateOptional =
super.excelExportAuth(type, UserApi.SUB_TITLE, request);
- if(!certificateOptional.isPresent()){
+ if(certificateOptional.isEmpty()){
return ResultWrapper.getErrorResultWrapper();
}
return ResultWrapper.getSuccessResultWrapper(certificateOptional.get());
@@ -247,7 +247,7 @@ public class GenTemplateRestController extends BaseRestController detailList;
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateCopyModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateCopyModel.java
index 7ce61941..fac3232c 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateCopyModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateCopyModel.java
@@ -18,7 +18,7 @@ package org.opsli.modulars.generator.template.wrapper;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -30,16 +30,16 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* 代码模板 Model
*
-* @author Parker
+* @author Pace
* @date 2021-05-27 14:33:49
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GenTemplateCopyModel extends ApiWrapper {
-
+
/** 模板名称 */
- @ApiModelProperty(value = "模板名称")
+ @Schema(description = "模板名称")
@ExcelProperty(value = "模板名称", order = 1)
@ExcelInfo
@Validator({
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateDetailModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateDetailModel.java
index 8f993f37..e013a431 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateDetailModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateDetailModel.java
@@ -19,7 +19,7 @@ package org.opsli.modulars.generator.template.wrapper;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -31,16 +31,16 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* 代码模板详情 Model
*
-* @author Parker
+* @author Pace
* @date 2021-05-28 17:12:38
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GenTemplateDetailModel extends ApiWrapper {
-
+
/** 父级ID */
- @ApiModelProperty(value = "父级ID")
+ @Schema(description = "父级ID")
@ExcelProperty(value = "父级ID", order = 1)
@ExcelInfo
@Validator({
@@ -50,7 +50,7 @@ public class GenTemplateDetailModel extends ApiWrapper {
private String parentId;
/** 类型 0 后端 1 前端 */
- @ApiModelProperty(value = "类型")
+ @Schema(description = "类型")
@ExcelProperty(value = "类型", order = 2)
@ExcelInfo
@Validator({
@@ -60,7 +60,7 @@ public class GenTemplateDetailModel extends ApiWrapper {
private String type;
/** 路径 */
- @ApiModelProperty(value = "路径")
+ @Schema(description = "路径")
@ExcelProperty(value = "路径", order = 3)
@ExcelInfo
@Validator({
@@ -70,7 +70,7 @@ public class GenTemplateDetailModel extends ApiWrapper {
private String path;
/** 文件名 */
- @ApiModelProperty(value = "文件名")
+ @Schema(description = "文件名")
@ExcelProperty(value = "文件名", order = 4)
@ExcelInfo
@Validator({
@@ -80,7 +80,7 @@ public class GenTemplateDetailModel extends ApiWrapper {
private String fileName;
/** 文件内容 */
- @ApiModelProperty(value = "文件内容")
+ @Schema(description = "文件内容")
@ExcelProperty(value = "文件内容", order = 5)
@ExcelInfo
@Validator({
@@ -90,7 +90,7 @@ public class GenTemplateDetailModel extends ApiWrapper {
private String fileContent;
/** 是否忽略文件名 */
- @ApiModelProperty(value = "文件名")
+ @Schema(description = "文件名")
@ExcelProperty(value = "文件名", order = 6)
@ExcelInfo
@Validator({
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateModel.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateModel.java
index d2e76402..789535da 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateModel.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/modulars/generator/template/wrapper/GenTemplateModel.java
@@ -18,7 +18,7 @@ package org.opsli.modulars.generator.template.wrapper;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
@@ -30,16 +30,16 @@ import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* 代码模板 Model
*
-* @author Parker
+* @author Pace
* @date 2021-05-27 14:33:49
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GenTemplateModel extends ApiWrapper {
-
+
/** 模板名称 */
- @ApiModelProperty(value = "模板名称")
+ @Schema(description = "模板名称")
@ExcelProperty(value = "模板名称", order = 1)
@ExcelInfo
@Validator({
@@ -50,7 +50,7 @@ public class GenTemplateModel extends ApiWrapper {
private String tempName;
/** 表类型 */
- @ApiModelProperty(value = "表类型")
+ @Schema(description = "表类型")
@ExcelProperty(value = "表类型", order = 2)
@ExcelInfo( dictType = "table_type" )
@Validator({
@@ -59,9 +59,9 @@ public class GenTemplateModel extends ApiWrapper {
@ValidatorLenMax(30)
private String tableType;
-
+
/** 备注信息 */
- @ApiModelProperty(value = "备注信息")
+ @Schema(description = "备注信息")
@ExcelProperty(value = "备注信息", order = 3)
@ExcelInfo
@ValidatorLenMax(255)
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/FieldTypeAttribute.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/FieldTypeAttribute.java
index 03c6a46a..1798fda2 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/FieldTypeAttribute.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/FieldTypeAttribute.java
@@ -22,7 +22,7 @@ import lombok.Data;
/**
* MySQL 字段类型 属性
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 13:21
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SqlSyncUtil.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SqlSyncUtil.java
index 4e2f2af4..1107681b 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SqlSyncUtil.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SqlSyncUtil.java
@@ -16,12 +16,11 @@
package org.opsli.plugins.generator;
import cn.hutool.core.util.ClassUtil;
+import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
-import org.opsli.plugins.generator.enums.DataBaseType;
-import org.opsli.plugins.generator.SyncStrategy;
import org.opsli.core.utils.SpringContextHolder;
import org.opsli.modulars.generator.table.wrapper.GenTableAndColumnModel;
-import org.springframework.context.annotation.Bean;
+import org.opsli.plugins.generator.enums.DataBaseType;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Modifier;
@@ -32,7 +31,7 @@ import java.util.concurrent.ConcurrentMap;
/**
* 数据库同步策略 工具类
*
- * @author parker
+ * @author Pace
* @date 2020-09-15 14:50
*/
@Slf4j
@@ -44,7 +43,7 @@ public class SqlSyncUtil {
private static final ConcurrentMap HANDLER_MAP = new ConcurrentHashMap<>();
- @Bean
+ @PostConstruct
public void initSyncStrategy(){
// 拿到state包下 实现了 SystemEventState 接口的,所有子类
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SyncStrategy.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SyncStrategy.java
index e5c3a3ec..856c4952 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SyncStrategy.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/SyncStrategy.java
@@ -21,7 +21,7 @@ import org.opsli.modulars.generator.table.wrapper.GenTableAndColumnModel;
/**
* 同步策略
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 11:47
*/
public interface SyncStrategy {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/TypeFormatter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/TypeFormatter.java
index 124bfefa..82d3df71 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/TypeFormatter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/TypeFormatter.java
@@ -24,7 +24,7 @@ import java.util.List;
/**
* 将各数据库类型格式化成统一的类型
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:45:15
*/
public interface TypeFormatter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/ColumnTypeConverter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/ColumnTypeConverter.java
index 024b8d87..012b8544 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/ColumnTypeConverter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/ColumnTypeConverter.java
@@ -22,7 +22,7 @@ import java.util.List;
/**
* 将数据库类型转换成各语言对应的类型
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:22:31
*/
public interface ColumnTypeConverter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/JavaColumnTypeConverter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/JavaColumnTypeConverter.java
index 5bb00613..ecc0ab52 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/JavaColumnTypeConverter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/converter/JavaColumnTypeConverter.java
@@ -28,7 +28,7 @@ import java.util.Map;
/**
* Java 字段类型
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:25:47
*/
public class JavaColumnTypeConverter implements ColumnTypeConverter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncBuilder.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncBuilder.java
index 65ed5b36..7301be56 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncBuilder.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncBuilder.java
@@ -38,7 +38,7 @@ import java.util.List;
/**
* MySQL 同步构建器
*
- * @author parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncColumnType.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncColumnType.java
index 519e698a..20d6879f 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncColumnType.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlSyncColumnType.java
@@ -29,7 +29,7 @@ import java.util.Map;
/**
* MySQL 字段类型 判断
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 13:21
*/
public enum MySqlSyncColumnType {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlTypeFormatter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlTypeFormatter.java
index 8db60338..f2c2553c 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlTypeFormatter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/mysql/MySqlTypeFormatter.java
@@ -24,7 +24,7 @@ import java.util.Collections;
/**
* MySQL 字段格式化判断
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:51:50
*/
public class MySqlTypeFormatter implements TypeFormatter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/oracle/OracleTypeFormatter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/oracle/OracleTypeFormatter.java
index 568fde68..623a74de 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/oracle/OracleTypeFormatter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/oracle/OracleTypeFormatter.java
@@ -24,7 +24,7 @@ import java.util.Collections;
/**
* Oracle 字段格式化判断
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:51:50
*/
public class OracleTypeFormatter implements TypeFormatter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/postgresql/PostgreSqlTypeFormatter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/postgresql/PostgreSqlTypeFormatter.java
index 18733bcb..d0f52005 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/postgresql/PostgreSqlTypeFormatter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/postgresql/PostgreSqlTypeFormatter.java
@@ -24,7 +24,7 @@ import java.util.Collections;
/**
* PostgreSql 字段格式化判断
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:51:50
*/
public class PostgreSqlTypeFormatter implements TypeFormatter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/sqlserver/SqlServerTypeFormatter.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/sqlserver/SqlServerTypeFormatter.java
index b68901b5..87e41ba5 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/sqlserver/SqlServerTypeFormatter.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/database/sqlserver/SqlServerTypeFormatter.java
@@ -24,7 +24,7 @@ import java.util.Collections;
/**
* SqlServer 字段格式化判断
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日14:51:50
*/
public class SqlServerTypeFormatter implements TypeFormatter {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/enums/JavaType.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/enums/JavaType.java
index 4dd7679c..4e20dc2b 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/enums/JavaType.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/enums/JavaType.java
@@ -25,7 +25,7 @@ import java.util.List;
/**
* Java 类型
*
- * @author Parker
+ * @author Pace
* @date 2021年5月26日16:31:08
*/
public enum JavaType {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/exception/GeneratorException.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/exception/GeneratorException.java
index 84794ef7..47c3ef27 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/exception/GeneratorException.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/exception/GeneratorException.java
@@ -21,7 +21,7 @@ import org.opsli.common.exception.ServiceException;
/**
* 代码生成器 异常类
*
- * @author parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
public class GeneratorException extends ServiceException {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/factory/GeneratorFactory.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/factory/GeneratorFactory.java
index 0cbf172d..ce9e605c 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/factory/GeneratorFactory.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/factory/GeneratorFactory.java
@@ -4,7 +4,7 @@ package org.opsli.plugins.generator.factory;
/**
* 代码生成器工厂
*
- * @author Parker
+ * @author Pace
* @date 2021年6月1日19:10:36
*/
public final class GeneratorFactory {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/msg/GeneratorMsg.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/msg/GeneratorMsg.java
index 12d4a93a..a0fe560f 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/msg/GeneratorMsg.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/msg/GeneratorMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 代码生成器 - 消息
*
- * @author parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
public enum GeneratorMsg implements BaseMsg {
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/strategy/create/CodeBuilder.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/strategy/create/CodeBuilder.java
index 794e69bb..bf9baba7 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/strategy/create/CodeBuilder.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/strategy/create/CodeBuilder.java
@@ -39,7 +39,7 @@ import org.opsli.plugins.generator.utils.EnjoyUtil;
import org.opsli.plugins.generator.utils.GenTemplateUtil;
import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -49,7 +49,7 @@ import java.util.Map;
/**
* Java代码构建器
*
- * @author parker
+ * @author Pace
* @date 2020-09-13 19:36
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/EnjoyUtil.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/EnjoyUtil.java
index 9012895c..ee37f2c7 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/EnjoyUtil.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/EnjoyUtil.java
@@ -30,7 +30,7 @@ import java.util.Map;
/***
* Enjoy 模板引擎
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 13:21
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GenTemplateUtil.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GenTemplateUtil.java
index 7868f839..7ad8caee 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GenTemplateUtil.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GenTemplateUtil.java
@@ -42,7 +42,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* 代码模板
*
- * @author parker
+ * @author Pace
* @date 2020-09-22 11:17
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GeneratorHandleUtil.java b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GeneratorHandleUtil.java
index c35199cd..10d86e16 100644
--- a/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GeneratorHandleUtil.java
+++ b/opsli-modulars/opsli-modulars-generator/src/main/java/org/opsli/plugins/generator/utils/GeneratorHandleUtil.java
@@ -39,7 +39,7 @@ import java.util.Map;
/***
* 代码生成器 处理工具类
*
- * @author parker
+ * @author Pace
* @date 2020-11-18 13:21
*/
public final class GeneratorHandleUtil {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java
index 8241755e..6a1cd12f 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java
@@ -20,7 +20,7 @@ import org.opsli.common.base.msg.BaseMsg;
/**
* 系统 - 消息
*
- * @author Parker
+ * @author Pace
* @date 2020-09-13 17:40
*/
public enum SystemMsg implements BaseMsg {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/entity/SysArea.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/entity/SysArea.java
index 0d1ffb7d..869e6b82 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/entity/SysArea.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/entity/SysArea.java
@@ -26,7 +26,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 地域表
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/mapper/SysAreaMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/mapper/SysAreaMapper.java
index 171808d6..1e34435d 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/mapper/SysAreaMapper.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/mapper/SysAreaMapper.java
@@ -29,7 +29,7 @@ import java.util.List;
/**
* 地域表 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/ISysAreaService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/ISysAreaService.java
index 9da07cc0..a0636f06 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/ISysAreaService.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/ISysAreaService.java
@@ -26,7 +26,7 @@ import java.util.Set;
/**
* 地域表 Service
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
public interface ISysAreaService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/impl/SysAreaServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/impl/SysAreaServiceImpl.java
index 3a213773..57aed5c3 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/impl/SysAreaServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/service/impl/SysAreaServiceImpl.java
@@ -51,7 +51,7 @@ import java.util.Set;
/**
* 地域表 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/web/SysAreaRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/web/SysAreaRestController.java
index 8890b005..132861c8 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/web/SysAreaRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/area/web/SysAreaRestController.java
@@ -27,8 +27,8 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.result.ResultWrapper;
@@ -55,10 +55,10 @@ import java.util.Map;
/**
* 地域表 Controller
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
-@Api(tags = SysAreaRestApi.TITLE)
+@Tag(name = SysAreaRestApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/system/area")
public class SysAreaRestController extends BaseRestController
@@ -72,7 +72,7 @@ public class SysAreaRestController extends BaseRestController get(SysAreaModel model) {
@@ -84,7 +84,7 @@ public class SysAreaRestController extends BaseRestController findTree(String parentId) {
@@ -121,7 +121,7 @@ public class SysAreaRestController extends BaseRestController findTreeAll(Integer deep) {
@@ -153,7 +153,7 @@ public class SysAreaRestController extends BaseRestController {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/IDictService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/IDictService.java
index df3376da..91c1f830 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/IDictService.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/IDictService.java
@@ -23,7 +23,7 @@ import org.opsli.modulars.system.dict.entity.SysDict;
/**
* 数据字典 接口
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
public interface IDictService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java
index 60b4e8ce..8b0f510f 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictDetailServiceImpl.java
@@ -47,7 +47,7 @@ import java.util.*;
/**
* 数据字典 明细 接口实现类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictServiceImpl.java
index c6daf97e..4d57a03e 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/service/impl/DictServiceImpl.java
@@ -39,7 +39,7 @@ import java.util.List;
/**
* 数据字典 接口实现类
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictDetailRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictDetailRestController.java
index 9bbd6efd..d09588a0 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictDetailRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictDetailRestController.java
@@ -17,8 +17,8 @@ package org.opsli.modulars.system.dict.web;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.result.ResultWrapper;
@@ -42,16 +42,16 @@ import org.opsli.modulars.system.dict.entity.SysDictDetail;
import org.opsli.modulars.system.dict.service.IDictDetailService;
import org.springframework.security.access.prepost.PreAuthorize;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 数据字典明细 Controller
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
-@Api(tags = DictDetailApi.TITLE)
+@Tag(name = DictDetailApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/system/dict/detail")
public class DictDetailRestController extends BaseRestController
@@ -66,7 +66,7 @@ public class DictDetailRestController extends BaseRestController get(DictDetailModel model) {
model = IService.get(model);
@@ -80,7 +80,7 @@ public class DictDetailRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
@@ -97,7 +97,7 @@ public class DictDetailRestController extends BaseRestController> findListByTypeCode(String typeCode) {
return ResultWrapper.getSuccessResultWrapper(
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictRestController.java
index dd03d47c..25857e32 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/dict/web/DictRestController.java
@@ -17,8 +17,8 @@ package org.opsli.modulars.system.dict.web;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.base.result.ResultWrapper;
@@ -44,17 +44,17 @@ import org.opsli.modulars.system.dict.entity.SysDict;
import org.opsli.modulars.system.dict.service.IDictService;
import org.springframework.security.access.prepost.PreAuthorize;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 数据字典 Controller
*
- * @author Parker
+ * @author Pace
* @date 2020-09-16 17:33
*/
-@Api(tags = DictApi.TITLE)
+@Tag(name = DictApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/system/dict")
public class DictRestController extends BaseRestController
@@ -68,7 +68,7 @@ public class DictRestController extends BaseRestController get(DictModel model) {
model = IService.get(model);
@@ -82,7 +82,7 @@ public class DictRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
@@ -99,7 +99,7 @@ public class DictRestController extends BaseRestController getDictListByCode(String typeCode) {
List dictList = DictUtil.getDictList(typeCode);
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/EmailCodeModel.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/EmailCodeModel.java
index 1ebb9527..a7e54306 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/EmailCodeModel.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/EmailCodeModel.java
@@ -23,7 +23,7 @@ import org.opsli.common.enums.ValidatorType;
/**
* 邮箱
*
- * @author Parker
+ * @author Pace
* @date 2022-07-16 8:14 PM
**/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginCodeModel.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginCodeModel.java
index 364e053c..243ce796 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginCodeModel.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginCodeModel.java
@@ -21,7 +21,7 @@ import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.enums.ValidatorType;
/**
- * @author Parker
+ * @author Pace
* @date 2022-07-16 8:14 PM
**/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginModel.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginModel.java
index 4763c8fd..1af3c231 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginModel.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/LoginModel.java
@@ -15,7 +15,7 @@
*/
package org.opsli.modulars.system.login.dto;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.opsli.common.annotation.validator.Validator;
import org.opsli.common.annotation.validator.ValidatorLenMax;
@@ -23,7 +23,7 @@ import org.opsli.common.annotation.validator.ValidatorLenMin;
import org.opsli.common.enums.ValidatorType;
/**
- * @author Parker
+ * @author Pace
* @date 2022-07-16 8:14 PM
**/
@Data
@@ -44,7 +44,7 @@ public class LoginModel {
private String verificationCode;
/** UUID */
- @ApiModelProperty(value = "UUID")
+ @Schema(description = "UUID")
private String uuid;
/** 登录来源: 0:PC端;1:APP-安卓 2:APP-IOS 3:小程序 */
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/MobileCodeModel.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/MobileCodeModel.java
index 056b140a..a7773393 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/MobileCodeModel.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/dto/MobileCodeModel.java
@@ -23,7 +23,7 @@ import org.opsli.common.enums.ValidatorType;
/**
* 手机号
*
- * @author Parker
+ * @author Pace
* @date 2022-07-16 8:14 PM
**/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/event/BadCredentialsEvent.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/event/BadCredentialsEvent.java
index a57e400e..a67f1bd4 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/event/BadCredentialsEvent.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/event/BadCredentialsEvent.java
@@ -30,7 +30,7 @@ import org.springframework.stereotype.Component;
/**
* 登陆凭证错误事件
*
- * @author Parker
+ * @author Pace
* @date 2022-07-20 10:37:58
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginCodeModelVerifyCodeBeforeHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginCodeModelVerifyCodeBeforeHandler.java
index 342e6707..14911349 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginCodeModelVerifyCodeBeforeHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginCodeModelVerifyCodeBeforeHandler.java
@@ -25,7 +25,7 @@ import org.springframework.stereotype.Component;
/**
* 验证账号与验证码 (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyCaptchaBeforeHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyCaptchaBeforeHandler.java
index badab990..4dff5b54 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyCaptchaBeforeHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyCaptchaBeforeHandler.java
@@ -24,7 +24,7 @@ import org.springframework.stereotype.Component;
/**
* 验证账号与验证码 (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyTempLockedBeforeHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyTempLockedBeforeHandler.java
index c74ee0b0..9f08413a 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyTempLockedBeforeHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/before/LoginModelVerifyTempLockedBeforeHandler.java
@@ -36,7 +36,7 @@ import java.util.Date;
/**
* 验证账号临时锁定 (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/error/BizServiceErrorHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/error/BizServiceErrorHandler.java
index 78f6223f..2e5d164c 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/error/BizServiceErrorHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/error/BizServiceErrorHandler.java
@@ -24,12 +24,12 @@ import org.opsli.plugins.security.utils.WebUtils;
import org.opsli.plugins.security.vo.AuthResultWrapper;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 业务异常 处理器
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginClearErrorSuccessHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginClearErrorSuccessHandler.java
index 37a81bb6..e323be4b 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginClearErrorSuccessHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginClearErrorSuccessHandler.java
@@ -29,13 +29,13 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 登陆成功后 清除错误记录 (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginCodeModelCreateAccessTokenHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginCodeModelCreateAccessTokenHandler.java
index 5cf2a6b9..b65f92e4 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginCodeModelCreateAccessTokenHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginCodeModelCreateAccessTokenHandler.java
@@ -35,13 +35,13 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 生成认证 Token (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelClearCaptchaSuccessHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelClearCaptchaSuccessHandler.java
index 16309885..19fe0e05 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelClearCaptchaSuccessHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelClearCaptchaSuccessHandler.java
@@ -23,12 +23,12 @@ import org.opsli.plugins.security.handler.LoginAccessSuccessListener;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 登陆成功后 清除验证码信息 (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelCreateAccessTokenHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelCreateAccessTokenHandler.java
index 156d96fa..1519ba39 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelCreateAccessTokenHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginModelCreateAccessTokenHandler.java
@@ -35,13 +35,13 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 生成认证 Token (LoginModel)
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessAfterVerifyHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessAfterVerifyHandler.java
index 8d0e596c..96f5224a 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessAfterVerifyHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessAfterVerifyHandler.java
@@ -31,13 +31,13 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 登陆成功后 验证器
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessLogHandler.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessLogHandler.java
index 4ac8a037..be2d9736 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessLogHandler.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/handler/success/LoginSuccessLogHandler.java
@@ -27,12 +27,12 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* 登陆成功日志执行器
- * @author Parker
+ * @author Pace
* @date 2022-07-17 12:57 PM
**/
@AllArgsConstructor
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessAndRefreshTokenDto.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessAndRefreshTokenDto.java
index a65c7a7e..ae473101 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessAndRefreshTokenDto.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessAndRefreshTokenDto.java
@@ -19,12 +19,13 @@ import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
+import java.io.Serial;
import java.io.Serializable;
/**
* 登录 Token 传输实体
*
- * @author Parker
+ * @author Pace
* @since 2021-12-27
*/
@Getter
@@ -32,6 +33,7 @@ import java.io.Serializable;
@Builder
public class AuthAccessAndRefreshTokenDto implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** 刷新Token */
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessTokenDto.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessTokenDto.java
index c0ae3d66..c8b8ee0e 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessTokenDto.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/vo/AuthAccessTokenDto.java
@@ -19,12 +19,13 @@ import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
+import java.io.Serial;
import java.io.Serializable;
/**
* 登录 Token 传输实体
*
- * @author Parker
+ * @author Pace
* @since 2021-12-27
*/
@Getter
@@ -32,6 +33,7 @@ import java.io.Serializable;
@Builder
public class AuthAccessTokenDto implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/** 认证Token */
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByAccountRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByAccountRestController.java
index e4f76251..9945d17d 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByAccountRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByAccountRestController.java
@@ -15,22 +15,24 @@
*/
package org.opsli.modulars.system.login.web;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
+import org.opsli.api.base.encrypt.EncryptModel;
import org.opsli.common.annotation.Limiter;
import org.opsli.common.enums.AlertType;
import org.opsli.common.enums.LoginModelType;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.utils.CaptchaUtil;
+import org.opsli.core.utils.CryptoUtil;
import org.opsli.core.utils.ValidatorUtil;
-import org.opsli.api.base.encrypt.EncryptModel;
import org.opsli.modulars.system.login.dto.LoginModel;
import org.opsli.modulars.system.login.handler.before.LoginModelVerifyCaptchaBeforeHandler;
import org.opsli.modulars.system.login.handler.before.LoginModelVerifyTempLockedBeforeHandler;
import org.opsli.modulars.system.login.handler.error.BizServiceErrorHandler;
import org.opsli.modulars.system.login.handler.success.*;
-import org.opsli.core.utils.CryptoUtil;
import org.opsli.plugins.security.authentication.EmailPasswordAuthenticationToken;
import org.opsli.plugins.security.authentication.MobilePasswordAuthenticationToken;
import org.opsli.plugins.security.handler.*;
@@ -43,18 +45,16 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 账号 + 密码 登录
* 不需要继承 api 接口
*
- * @author parker
+ * @author Pace
* @date 2020-05-23 13:30
*/
-@Api(tags = "登录相关")
+@Tag(name = "登录相关")
@Slf4j
@RestController
public class LoginByAccountRestController {
@@ -67,7 +67,7 @@ public class LoginByAccountRestController {
* @param uuid 随机UUID
*/
@Limiter(alertType = AlertType.ALERT)
- @ApiOperation(value = "验证码", notes = "验证码")
+ @Operation(summary = "验证码")
@GetMapping("captcha")
public void captcha(String uuid, HttpServletResponse response) throws IOException {
ServletOutputStream out = response.getOutputStream();
@@ -79,7 +79,7 @@ public class LoginByAccountRestController {
}
@Limiter
- @ApiOperation(value = "账号+密码 登录", notes = "账号+密码 登录")
+ @Operation(summary = "账号+密码 登录")
@PostMapping("/system/login")
public void login(@RequestBody EncryptModel encryptModel){
// 验证加密登录对象
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByCodeRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByCodeRestController.java
index 62bc50db..62992f82 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByCodeRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginByCodeRestController.java
@@ -15,13 +15,14 @@
*/
package org.opsli.modulars.system.login.web;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.opsli.api.base.encrypt.EncryptModel;
import org.opsli.common.annotation.Limiter;
import org.opsli.common.enums.LoginModelType;
import org.opsli.common.utils.WrapperUtil;
+import org.opsli.core.utils.CryptoUtil;
import org.opsli.core.utils.ValidatorUtil;
import org.opsli.modulars.system.login.dto.LoginCodeModel;
import org.opsli.modulars.system.login.handler.before.LoginCodeModelVerifyCodeBeforeHandler;
@@ -30,7 +31,6 @@ import org.opsli.modulars.system.login.handler.success.LoginClearErrorSuccessHan
import org.opsli.modulars.system.login.handler.success.LoginCodeModelCreateAccessTokenHandler;
import org.opsli.modulars.system.login.handler.success.LoginSuccessAfterVerifyHandler;
import org.opsli.modulars.system.login.handler.success.LoginSuccessLogHandler;
-import org.opsli.core.utils.CryptoUtil;
import org.opsli.plugins.security.authentication.EmailCodeAuthenticationToken;
import org.opsli.plugins.security.authentication.MobileCodeAuthenticationToken;
import org.opsli.plugins.security.handler.*;
@@ -45,10 +45,10 @@ import org.springframework.web.bind.annotation.RestController;
* 手机号/邮箱+验证码 登录
* 不需要继承 api 接口
*
- * @author parker
+ * @author Pace
* @date 2020-05-23 13:30
*/
-@Api(tags = "登录相关")
+@Tag(name = "登录相关")
@Slf4j
@RestController
public class LoginByCodeRestController {
@@ -57,7 +57,7 @@ public class LoginByCodeRestController {
@Limiter
- @ApiOperation(value = "手机号/邮箱+验证码 登录", notes = "手机号/邮箱+验证码 登录")
+ @Operation(summary = "手机号/邮箱+验证码 登录")
@PostMapping("/system/login-by-code")
public void login(@RequestBody EncryptModel encryptModel){
// 验证加密登录对象
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginCommonRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginCommonRestController.java
index 53579b6a..f0cf3a5d 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginCommonRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/login/web/LoginCommonRestController.java
@@ -16,8 +16,9 @@
package org.opsli.modulars.system.login.web;
import com.google.common.collect.Maps;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.opsli.api.base.result.ResultWrapper;
@@ -36,17 +37,16 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
-import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 登陆 公共服务
* 不需要继承 api 接口
*
- * @author parker
+ * @author Pace
* @date 2020-05-23 13:30
*/
-@Api(tags = "登录相关")
+@Tag(name = "登录相关")
@Slf4j
@AllArgsConstructor
@RestController
@@ -58,7 +58,7 @@ public class LoginCommonRestController {
* 获得当前登录失败次数
*/
@Limiter
- @ApiOperation(value = "获得当前登录失败次数", notes = "获得当前登录失败次数")
+ @Operation(summary = "获得当前登录失败次数")
@GetMapping("/system/slipCount")
public ResultWrapper> slipCount(String username){
// 获得当前失败次数
@@ -74,7 +74,7 @@ public class LoginCommonRestController {
* 登出
*/
@Limiter
- @ApiOperation(value = "登出", notes = "登出")
+ @Operation(summary = "登出")
@PostMapping("/system/logout")
public ResultWrapper> logout(HttpServletRequest request) {
String token = UserContextHolder.getToken().orElseThrow(() -> new TokenException(
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/OperationLog.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/OperationLog.java
index 2f766d18..854d6b40 100755
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/OperationLog.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/OperationLog.java
@@ -22,7 +22,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 行为日志 Entity
*
- * @author Parker
+ * @author Pace
* @date 2022-07-26 19:21:57
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLoginLogs.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLoginLogs.java
index 1c41b4bf..4866a994 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLoginLogs.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLoginLogs.java
@@ -22,7 +22,7 @@ import org.opsli.core.base.entity.BaseEntity;
/**
* 登录日志信息
*
- * @author Parker
+ * @author Pace
* @date 2022年3月18日17:45:18
*/
@Data
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLogs.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLogs.java
index ede4ca3c..a61333ac 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLogs.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/entity/SysLogs.java
@@ -19,24 +19,26 @@ import com.alibaba.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.core.base.entity.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serial;
import java.util.Date;
/**
* 日志表
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SysLogs extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/LoginLogEvent.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/LoginLogEvent.java
index fea40abc..e00d30a5 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/LoginLogEvent.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/LoginLogEvent.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
/**
* 记录登陆日志信息
*
- * @author Parker
+ * @author Pace
* @date 2022-07-20 10:37:58
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/OperationLogEvent.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/OperationLogEvent.java
index 9da0737a..3eecfdba 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/OperationLogEvent.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/event/OperationLogEvent.java
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Component;
/**
* 操作日志 事件
*
- * @author Parker
+ * @author Pace
* @date 2021年7月15日20:28:24
*/
@Slf4j
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/factory/UserLoginLogFactory.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/factory/UserLoginLogFactory.java
index 3b531cdb..c930c54b 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/factory/UserLoginLogFactory.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/factory/UserLoginLogFactory.java
@@ -9,10 +9,10 @@ import org.opsli.common.utils.IPUtil;
import org.opsli.core.utils.UserUtil;
import org.springframework.util.ObjectUtils;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
/**
- * @author Parker
+ * @author Pace
* @date 2022/3/18 14:34
*/
public final class UserLoginLogFactory {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/LogsMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/LogsMapper.java
index ee96fbe7..dc8ad848 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/LogsMapper.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/LogsMapper.java
@@ -25,7 +25,7 @@ import java.util.Date;
/**
* 日志 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/OperationLogMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/OperationLogMapper.java
index 46e63786..4de23c9e 100755
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/OperationLogMapper.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/OperationLogMapper.java
@@ -23,10 +23,10 @@ import org.opsli.modulars.system.logs.entity.OperationLog;
/**
* 行为日志 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2022-07-26 19:21:57
*/
@Mapper
public interface OperationLogMapper extends BaseMapper {
-}
\ No newline at end of file
+}
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/SysLoginLogsMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/SysLoginLogsMapper.java
index 1b9f2ae8..09d89c8e 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/SysLoginLogsMapper.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/mapper/SysLoginLogsMapper.java
@@ -22,7 +22,7 @@ import org.opsli.modulars.system.logs.entity.SysLoginLogs;
/**
* 登录信息 Mapper
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Mapper
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILoginLogsService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILoginLogsService.java
index 6a3abe32..cda649ed 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILoginLogsService.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILoginLogsService.java
@@ -23,7 +23,7 @@ import org.opsli.modulars.system.logs.entity.SysLoginLogs;
/**
* 登录日志 Service
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
public interface ILoginLogsService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILogsService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILogsService.java
index 2c01356e..5b2c27f5 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILogsService.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/ILogsService.java
@@ -23,7 +23,7 @@ import org.opsli.modulars.system.logs.entity.SysLogs;
/**
* 日志 Service
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
public interface ILogsService extends CrudServiceInterface {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/IOperationLogService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/IOperationLogService.java
index 5b3830cd..76c63fae 100755
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/IOperationLogService.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/IOperationLogService.java
@@ -24,9 +24,9 @@ import org.opsli.api.wrapper.system.logs.OperationLogModel;
/**
* 行为日志 Service
*
- * @author Parker
+ * @author Pace
* @date 2022-07-26 19:21:57
*/
public interface IOperationLogService extends CrudServiceInterface {
-}
\ No newline at end of file
+}
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LoginLogsServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LoginLogsServiceImpl.java
index 25b6b9ca..4381c00e 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LoginLogsServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LoginLogsServiceImpl.java
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Service;
/**
* 登录日志 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LogsServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LogsServiceImpl.java
index e44050aa..8911d3be 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LogsServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/LogsServiceImpl.java
@@ -31,7 +31,7 @@ import java.util.Date;
/**
* 日志 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
@Service
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/OperationLogServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/OperationLogServiceImpl.java
index ca9a6378..54657091 100755
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/OperationLogServiceImpl.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/service/impl/OperationLogServiceImpl.java
@@ -30,7 +30,7 @@ import org.opsli.modulars.system.logs.mapper.OperationLogMapper;
/**
* 行为日志 Service Impl
*
- * @author Parker
+ * @author Pace
* @date 2022-07-26 19:21:57
*/
@Service
@@ -40,4 +40,4 @@ public class OperationLogServiceImpl extends CrudServiceImpl
@@ -57,7 +51,7 @@ public class LoginLogsRestController extends BaseRestController findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/web/LogsRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/web/LogsRestController.java
index 236d63de..6542433b 100644
--- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/web/LogsRestController.java
+++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/logs/web/LogsRestController.java
@@ -15,32 +15,30 @@
*/
package org.opsli.modulars.system.logs.web;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.access.prepost.PreAuthorize;
import org.opsli.api.base.result.ResultWrapper;
import org.opsli.api.web.system.logs.LogsApi;
import org.opsli.api.wrapper.system.logs.LogsModel;
import org.opsli.common.annotation.ApiRestController;
-
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.opsli.modulars.system.logs.entity.SysLogs;
import org.opsli.modulars.system.logs.service.ILogsService;
-
-import javax.servlet.http.HttpServletRequest;
+import org.springframework.security.access.prepost.PreAuthorize;
/**
* 日志 Controller
*
- * @author Parker
+ * @author Pace
* @date 2020-11-28 18:59:59
*/
-@Api(tags = LogsApi.TITLE)
+@Tag(name = LogsApi.TITLE)
@Slf4j
@ApiRestController("/{ver}/system/logs")
public class LogsRestController extends BaseRestController