woody vor 1 Jahr
Ursprung
Commit
d495e548a3
33 geänderte Dateien mit 483 neuen und 193 gelöschten Zeilen
  1. 4 3
      framework-base/src/main/java/com/chelvc/framework/base/converter/NumberRegionConverter.java
  2. 3 1
      framework-base/src/main/java/com/chelvc/framework/base/converter/StringRegionConverter.java
  3. 90 143
      framework-common/src/main/java/com/chelvc/framework/common/model/Region.java
  4. 0 6
      framework-common/src/main/java/com/chelvc/framework/common/model/Tree.java
  5. 1 1
      framework-common/src/main/java/com/chelvc/framework/common/util/JacksonUtils.java
  6. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/config/DatabaseConfigurer.java
  7. 24 5
      framework-database/src/main/java/com/chelvc/framework/database/context/DatabaseContextHolder.java
  8. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/entity/BasicEntity.java
  9. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/entity/DeleteEntity.java
  10. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/BooleansTypeHandler.java
  11. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/DeletedTypeHandler.java
  12. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/DoublesTypeHandler.java
  13. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/FileTypeHandler.java
  14. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/FilesTypeHandler.java
  15. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/FloatsTypeHandler.java
  16. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/IntegersTypeHandler.java
  17. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/LongsTypeHandler.java
  18. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/MappingTypeHandler.java
  19. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/MappingsTypeHandler.java
  20. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationTypeHandler.java
  21. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationsTypeHandler.java
  22. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodTypeHandler.java
  23. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodsTypeHandler.java
  24. 5 5
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionTypeHandler.java
  25. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionsTypeHandler.java
  26. 53 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/ShortsTypeHandler.java
  27. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/StringsTypeHandler.java
  28. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/DeletedExcludeInterceptor.java
  29. 2 1
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicDatasourceInterceptor.java
  30. 6 7
      framework-location/src/main/java/com/chelvc/framework/location/support/TencentLocationHandler.java
  31. 4 2
      framework-oauth/src/main/java/com/chelvc/framework/oauth/config/OAuthConfigurer.java
  32. 4 1
      framework-security/src/main/java/com/chelvc/framework/security/interceptor/ControllerCryptoInterceptor.java
  33. 6 2
      framework-security/src/main/java/com/chelvc/framework/security/interceptor/SecurityValidateInterceptor.java

+ 4 - 3
framework-base/src/main/java/com/chelvc/framework/base/converter/NumberRegionConverter.java

@@ -1,6 +1,7 @@
 package com.chelvc.framework.base.converter;
 
 import com.chelvc.framework.common.model.Region;
+import com.chelvc.framework.common.util.ObjectUtils;
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.stereotype.Component;
 
@@ -11,9 +12,9 @@ import org.springframework.stereotype.Component;
  * @date 2024/1/30
  */
 @Component
-public class NumberRegionConverter implements Converter<Number, Region> {
+public class NumberRegionConverter implements Converter<Integer, Region> {
     @Override
-    public Region convert(Number source) {
-        return Region.of(source);
+    public Region convert(Integer source) {
+        return ObjectUtils.ifNull(source, Region::of);
     }
 }

+ 3 - 1
framework-base/src/main/java/com/chelvc/framework/base/converter/StringRegionConverter.java

@@ -1,6 +1,8 @@
 package com.chelvc.framework.base.converter;
 
 import com.chelvc.framework.common.model.Region;
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.common.util.StringUtils;
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.stereotype.Component;
 
@@ -14,6 +16,6 @@ import org.springframework.stereotype.Component;
 public class StringRegionConverter implements Converter<String, Region> {
     @Override
     public Region convert(String source) {
-        return Region.parse(source);
+        return ObjectUtils.ifNull(StringUtils.ifEmpty(source, Integer::parseInt), Region::of);
     }
 }

+ 90 - 143
framework-common/src/main/java/com/chelvc/framework/common/model/Region.java

@@ -5,8 +5,6 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import com.chelvc.framework.common.util.AssertUtils;
-import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.StringUtils;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.AllArgsConstructor;
@@ -28,26 +26,6 @@ import lombok.NonNull;
 @NoArgsConstructor
 @AllArgsConstructor
 public final class Region implements Serializable {
-    /**
-     * 地区类型枚举
-     */
-    public enum Type {
-        /**
-         * 省
-         */
-        PROVINCE,
-
-        /**
-         * 市
-         */
-        CITY,
-
-        /**
-         * 区
-         */
-        DISTRICT
-    }
-
     /**
      * 地区编码最小值
      */
@@ -58,11 +36,6 @@ public final class Region implements Serializable {
      */
     private static final int MAX_VALUE = 999999;
 
-    /**
-     * 地区类型
-     */
-    private Type type;
-
     /**
      * 地区编码
      */
@@ -79,162 +52,121 @@ public final class Region implements Serializable {
      * @param code 地区编码
      * @return true/false
      */
-    public static boolean isRegion(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        return code != null && value >= MIN_VALUE && value <= MAX_VALUE;
+    public static boolean isRegion(int code) {
+        return code >= MIN_VALUE && code <= MAX_VALUE;
     }
 
     /**
-     * 获取可用的地区编码
+     * 判断是否是市级编码
      *
      * @param code 地区编码
-     * @return 地区编码
-     */
-    public static Integer getActiveCode(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        if (value == null || value < MIN_VALUE) {
-            return null;
-        }
-        return value <= MAX_VALUE ? value : (int) (value / Math.pow(10, (int) Math.log10(value) - 5));
-    }
-
-    /**
-     * 判断是否是同一地区
-     *
-     * @param code1 地区编码
-     * @param code2 地区编码
      * @return true/false
      */
-    public static boolean isSame(Number code1, Number code2) {
-        Integer value1 = ObjectUtils.ifNull(code1, Number::intValue);
-        Integer value2 = ObjectUtils.ifNull(code2, Number::intValue);
-        return isRegion(value1) && isRegion(value2)
-                && (Objects.equals(value1, value2) || Objects.equals(value1, value2 / 100 * 100)
-                || Objects.equals(value1, value2 / 10000 * 10000)
-                || Objects.equals(value1 / 100 * 100, value2) || Objects.equals(value1 / 10000 * 10000, value2));
+    public static boolean isCity(int code) {
+        return isRegion(code) && (code % 10000 > 0) && (code % 100 == 0);
     }
 
     /**
-     * 判断地区编码是否是市级编码
+     * 判断是否是省级编码
      *
      * @param code 地区编码
      * @return true/false
      */
-    public static boolean isCity(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        return isRegion(value) && (value % 10000 > 0) && (value % 100 == 0);
+    public static boolean isProvince(int code) {
+        return isRegion(code) && (code % 10000 == 0);
     }
 
     /**
-     * 判断地区编码是否是省级编码
+     * 判断是否是区级编码
      *
      * @param code 地区编码
      * @return true/false
      */
-    public static boolean isProvince(Number code) {
-        return isRegion(code) && (code.intValue() % 10000 == 0);
+    public static boolean isDistrict(int code) {
+        return isRegion(code) && (code % 100 > 0);
     }
 
     /**
-     * 判断地区编码是否是区级编码
+     * 判断地区是否是直辖市
      *
      * @param code 地区编码
      * @return true/false
      */
-    public static boolean isDistrict(Number code) {
-        return isRegion(code) && (code.intValue() % 100 > 0);
+    public static boolean isDirectly(int code) {
+        code = code / 10000;
+        return code == 11 || code == 12 || code == 31 || code == 50;
     }
 
     /**
-     * 构建地区编码
+     * 判断地区是否属于敏感地区
      *
-     * @param type     地区类型
-     * @param code     地区编码
-     * @param boundary 地区边界编码
-     * @return 地区实例
+     * @param code 地区编码
+     * @return true/false
      */
-    public static Region of(Type type, int code, int boundary) {
-        AssertUtils.check(code > 0, () -> "Region's code must be greater than 0");
-        AssertUtils.check(boundary >= 0, () -> "Region's boundary must be greater than or equal 0");
-        Region region = new Region();
-        region.type = type;
-        region.code = code;
-        region.boundary = boundary;
-        return region;
+    public static boolean isSensitive(int code) {
+        code = code / 10000;
+        return code == 11 || code == 65 || code == 54;
     }
 
     /**
-     * 构建地区编码
+     * 判断是否是同一地区
      *
-     * @param code 地区编码
-     * @return 地区实例
+     * @param code1 地区编码
+     * @param code2 地区编码
+     * @return true/false
      */
-    public static Region of(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        if (isProvince(value)) {
-            return of(Type.PROVINCE, value, value + 9999);
-        } else if (isCity(value)) {
-            return of(Type.CITY, value, value + 99);
-        } else if (isDistrict(value)) {
-            return of(Type.DISTRICT, value, 0);
-        }
-        return null;
+    public static boolean isSame(int code1, int code2) {
+        return isRegion(code1) && isRegion(code2) && (Objects.equals(code1, code2)
+                || Objects.equals(code1, code2 / 100 * 100) || Objects.equals(code1, code2 / 10000 * 10000)
+                || Objects.equals(code1 / 100 * 100, code2) || Objects.equals(code1 / 10000 * 10000, code2));
     }
 
     /**
-     * 将字符串转换成地区编码
+     * 判断是否是同一地区
      *
-     * @param text 地区编码字符串格式
-     * @return 地区实例
+     * @param region1 地区对象
+     * @param region2 地区对象
+     * @return true/false
      */
-    public static Region parse(String text) {
-        return text == null || (text = text.trim()).isEmpty() ? null : of(Integer.parseInt(text));
+    public static boolean isSame(Region region1, Region region2) {
+        return region1 != null && region2 != null && isSame(region1.getCode(), region2.getCode());
     }
 
     /**
      * 将地区编码转换成市级编码
      *
      * @param code 地区编码
-     * @return 地区实例
+     * @return 地区编码
      */
-    public static Region code2city(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        return !isRegion(value) || isProvince(value) ? null : of(Type.CITY, value = value / 100 * 100, value + 99);
+    public static int code2city(int code) {
+        return code / 100 * 100;
     }
 
     /**
      * 将地区编码转换成省级编码
      *
      * @param code 地区编码
-     * @return 地区实例
+     * @return 地区编码
      */
-    public static Region code2province(Number code) {
-        Integer value = ObjectUtils.ifNull(code, Number::intValue);
-        return !isRegion(value) ? null : of(Type.PROVINCE, value = value / 10000 * 10000, value + 9999);
+    public static int code2province(int code) {
+        return code / 10000 * 10000;
     }
 
     /**
-     * 获取市级地区
+     * 构建地区编码
      *
      * @param code 地区编码
      * @return 地区实例
      */
-    public static Region urbanize(Number code) {
-        return isRegion(code) ? of(code.intValue() / 100 * 100) : null;
-    }
-
-    /**
-     * 判断地区是否属于敏感地区
-     *
-     * @param code 地区编码
-     * @return true/false
-     */
-    public static boolean isSensitive(Number code) {
-        if (code == null) {
-            return false;
+    public static Region of(int code) {
+        if (isProvince(code)) {
+            return new Region(code, code + 9999);
+        } else if (isCity(code)) {
+            return new Region(code, code + 99);
+        } else if (isDistrict(code)) {
+            return new Region(code, 0);
         }
-        int province = (code.intValue() / 10000);
-        return province == 11 || province == 65 || province == 54;
+        throw new IllegalArgumentException("Invalid region: " + code);
     }
 
     /**
@@ -284,71 +216,86 @@ public final class Region implements Serializable {
      */
     @JsonIgnore
     public Region getParent() {
-        return this.type == Type.DISTRICT ? code2city(this.code) :
-                this.type == Type.CITY ? code2province(this.code) : null;
+        if (this.isCity()) {
+            int province = code2province(this.code);
+            return new Region(province, province + 9999);
+        } else if (this.isDistrict()) {
+            int city = code2city(this.code);
+            return new Region(city, city + 99);
+        }
+        return null;
     }
 
     /**
-     * 获取当前地区所在省
+     * 判断是否是市级地区
      *
-     * @return 省
+     * @return true/false
      */
     @JsonIgnore
-    public Region getProvince() {
-        return this.type == Type.PROVINCE ? this : code2province(this.code);
+    public boolean isCity() {
+        return isCity(this.code);
     }
 
     /**
-     * 获取当前地区所在市
+     * 判断是否是省级地区
      *
-     * @return 
+     * @return true/false
      */
     @JsonIgnore
-    public Region getCity() {
-        return this.type == Type.CITY ? this : this.type == Type.PROVINCE ? null : code2city(this.code);
+    public boolean isProvince() {
+        return isProvince(this.code);
     }
 
     /**
-     * 获取当前地区所在
+     * 判断是否是区级地
      *
-     * @return 
+     * @return true/false
      */
     @JsonIgnore
-    public Region getDistrict() {
-        return this.type == Type.DISTRICT ? this : null;
+    public boolean isDistrict() {
+        return isDistrict(this.code);
     }
 
     /**
-     * 判断是否是同一地区
+     * 判断是否是直辖市
      *
-     * @param code 地区编码
      * @return true/false
      */
     @JsonIgnore
-    public boolean isSame(Number code) {
-        return isSame(this.code, code);
+    public boolean isDirectly() {
+        return isDirectly(this.code);
+    }
+
+    /**
+     * 判断地区是否属于敏感地区
+     *
+     * @return true/false
+     */
+    @JsonIgnore
+    public boolean isSensitive() {
+        return isSensitive(this.code);
     }
 
     /**
      * 判断是否是同一地区
      *
-     * @param region 地区实例
+     * @param code 地区编码
      * @return true/false
      */
     @JsonIgnore
-    public boolean isSame(Region region) {
-        return region != null && isSame(this.code, region.getCode());
+    public boolean isSame(int code) {
+        return isSame(this.code, code);
     }
 
     /**
-     * 判断是否是直辖市
+     * 判断是否是同一地区
      *
+     * @param region 地区实例
      * @return true/false
      */
     @JsonIgnore
-    public boolean isDirectly() {
-        int code = this.code / 10000;
-        return code == 11 || code == 12 || code == 31 || code == 50;
+    public boolean isSame(Region region) {
+        return isSame(this, region);
     }
 
     @Override

+ 0 - 6
framework-common/src/main/java/com/chelvc/framework/common/model/Tree.java

@@ -2,7 +2,6 @@ package com.chelvc.framework.common.model;
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.Map;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -104,11 +103,6 @@ public interface Tree<T extends Serializable, M extends Tree<T, M>> extends Seri
          * 子节点列表
          */
         private List<M> children;
-
-        /**
-         * 节点属性/值映射表
-         */
-        private Map<String, Object> attributes;
     }
 
     /**

+ 1 - 1
framework-common/src/main/java/com/chelvc/framework/common/util/JacksonUtils.java

@@ -225,7 +225,7 @@ public final class JacksonUtils {
 
             @Override
             public Region deserialize(JsonParser parser, DeserializationContext context) throws IOException {
-                return Region.parse(parser.getValueAsString());
+                return Region.of(parser.getIntValue());
             }
         });
 

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/config/DatabaseConfigurer.java

@@ -16,7 +16,7 @@ import com.chelvc.framework.common.function.Provider;
 import com.chelvc.framework.common.util.IdentityUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.database.context.Transactor;
-import com.chelvc.framework.database.interceptor.DeletedExcludeHandler;
+import com.chelvc.framework.database.interceptor.DeletedExcludeInterceptor;
 import com.chelvc.framework.database.support.EnhanceSqlInjector;
 import com.chelvc.framework.redis.context.RedisContextHolder;
 import lombok.NonNull;
@@ -102,7 +102,7 @@ public class DatabaseConfigurer {
         // 设置删除数据过滤拦截器
         interceptor.addInnerInterceptor(new TenantLineInnerInterceptor() {
             {
-                this.setTenantLineHandler(new DeletedExcludeHandler());
+                this.setTenantLineHandler(new DeletedExcludeInterceptor());
             }
         });
 

+ 24 - 5
framework-database/src/main/java/com/chelvc/framework/database/context/DatabaseContextHolder.java

@@ -524,6 +524,16 @@ public final class DatabaseContextHolder {
         }
     }
 
+    /**
+     * 根据包名查找数据模型对象
+     *
+     * @return 数据模型对象列表
+     */
+    public static List<Class<?>> lookupEntityClasses() {
+        return ApplicationContextHolder.lookupApplicationClasses(clazz -> Entity.class.isAssignableFrom(clazz)
+                && !Modifier.isInterface(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()));
+    }
+
     /**
      * 根据包名查找数据模型对象
      *
@@ -531,11 +541,20 @@ public final class DatabaseContextHolder {
      * @return 数据模型对象列表
      */
     public static List<Class<?>> lookupEntityClasses(@NonNull String pack) {
-        return SpringUtils.lookupClasses(pack, clazz -> {
-            int modifiers = clazz.getModifiers();
-            return Entity.class.isAssignableFrom(clazz) && !Modifier.isInterface(modifiers)
-                    && !Modifier.isAbstract(modifiers);
-        });
+        return SpringUtils.lookupClasses(pack, clazz -> Entity.class.isAssignableFrom(clazz)
+                && !Modifier.isInterface(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()));
+    }
+
+    /**
+     * 根据包名查找数据模型对象
+     *
+     * @param applicationContext 应用上下文
+     * @return 数据模型对象列表
+     */
+    public static List<Class<?>> lookupEntityClasses(@NonNull ApplicationContext applicationContext) {
+        return ApplicationContextHolder.lookupApplicationClasses(applicationContext,
+                clazz -> Entity.class.isAssignableFrom(clazz) && !Modifier.isInterface(clazz.getModifiers())
+                        && !Modifier.isAbstract(clazz.getModifiers()));
     }
 
     /**

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/entity/BasicEntity.java

@@ -3,7 +3,7 @@ package com.chelvc.framework.database.entity;
 import java.io.Serializable;
 
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.chelvc.framework.database.interceptor.DeletedTypeHandler;
+import com.chelvc.framework.database.handler.DeletedTypeHandler;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/entity/DeleteEntity.java

@@ -3,7 +3,7 @@ package com.chelvc.framework.database.entity;
 import java.io.Serializable;
 
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.chelvc.framework.database.interceptor.DeletedTypeHandler;
+import com.chelvc.framework.database.handler.DeletedTypeHandler;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/BooleansTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 真假值列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class BooleansTypeHandler extends BaseTypeHandler<List<Boolean>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Boolean>> REFERENCE = new TypeReference<List<Boolean>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Boolean> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (CollectionUtils.isEmpty(parameter)) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Boolean> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Boolean> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Boolean> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/DeletedTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/DeletedTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/DoublesTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 双精度浮点数列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class DoublesTypeHandler extends BaseTypeHandler<List<Double>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Double>> REFERENCE = new TypeReference<List<Double>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Double> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (CollectionUtils.isEmpty(parameter)) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Double> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Double> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Double> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/FileTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/FileTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/FilesTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/FilesTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/FloatsTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 单精度浮点数列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class FloatsTypeHandler extends BaseTypeHandler<List<Float>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Float>> REFERENCE = new TypeReference<List<Float>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Float> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (CollectionUtils.isEmpty(parameter)) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Float> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Float> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Float> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/IntegersTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/IntegersTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/LongsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/LongsTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/MappingTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/MappingTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/MappingsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/MappingsTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/ModificationTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/ModificationsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationsTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/PeriodTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodsTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.chelvc.framework.common.model.Period;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+/**
+ * 时间周期列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class PeriodsTypeHandler extends BaseTypeHandler<List<Period>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Period>> REFERENCE = new TypeReference<List<Period>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Period> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (parameter == null) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Period> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Period> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Period> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 5 - 5
framework-database/src/main/java/com/chelvc/framework/database/interceptor/RegionTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/RegionTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
@@ -21,7 +21,7 @@ public class RegionTypeHandler extends BaseTypeHandler<Region> {
     public void setNonNullParameter(PreparedStatement ps, int i, Region parameter, JdbcType jdbcType)
             throws SQLException {
         if (parameter == null) {
-            ps.setNull(i, Types.BIGINT);
+            ps.setNull(i, Types.INTEGER);
         } else {
             ps.setLong(i, parameter.getCode());
         }
@@ -29,16 +29,16 @@ public class RegionTypeHandler extends BaseTypeHandler<Region> {
 
     @Override
     public Region getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        return Region.parse(String.valueOf(rs.getLong(columnName)));
+        return Region.of(rs.getInt(columnName));
     }
 
     @Override
     public Region getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        return Region.parse(String.valueOf(rs.getLong(columnIndex)));
+        return Region.of(rs.getInt(columnIndex));
     }
 
     @Override
     public Region getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        return Region.parse(String.valueOf(cs.getLong(columnIndex)));
+        return Region.of(cs.getInt(columnIndex));
     }
 }

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/RegionsTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.chelvc.framework.common.model.Region;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+/**
+ * 地区字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class RegionsTypeHandler extends BaseTypeHandler<List<Region>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Region>> REFERENCE = new TypeReference<List<Region>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Region> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (parameter == null) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Region> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Region> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Region> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 53 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/ShortsTypeHandler.java

@@ -0,0 +1,53 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import com.chelvc.framework.base.context.JacksonContextHolder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 短整数列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/1/30
+ */
+public class ShortsTypeHandler extends BaseTypeHandler<List<Short>> {
+    /**
+     * 类型引用实例
+     */
+    private static final TypeReference<List<Short>> REFERENCE = new TypeReference<List<Short>>() {
+    };
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<Short> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (CollectionUtils.isEmpty(parameter)) {
+            ps.setNull(i, Types.VARCHAR);
+        } else {
+            ps.setString(i, JacksonContextHolder.serialize(parameter));
+        }
+    }
+
+    @Override
+    public List<Short> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnName), REFERENCE);
+    }
+
+    @Override
+    public List<Short> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(rs.getString(columnIndex), REFERENCE);
+    }
+
+    @Override
+    public List<Short> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return JacksonContextHolder.deserialize(cs.getString(columnIndex), REFERENCE);
+    }
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/StringsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/StringsTypeHandler.java

@@ -1,4 +1,4 @@
-package com.chelvc.framework.database.interceptor;
+package com.chelvc.framework.database.handler;
 
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/DeletedExcludeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/interceptor/DeletedExcludeInterceptor.java

@@ -15,7 +15,7 @@ import net.sf.jsqlparser.expression.LongValue;
  * @author Woody
  * @date 2024/1/30
  */
-public class DeletedExcludeHandler implements TenantLineHandler {
+public class DeletedExcludeInterceptor implements TenantLineHandler {
     /**
      * 删除标记字段名称
      */

+ 2 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicDatasourceInterceptor.java

@@ -88,7 +88,8 @@ public class DynamicDatasourceInterceptor {
      * @return 方法调用结果
      * @throws Throwable 方法调用异常
      */
-    @Around("this(com.baomidou.mybatisplus.core.mapper.BaseMapper) " +
+    @Around("@within(org.apache.ibatis.annotations.Mapper) " +
+            "|| this(com.baomidou.mybatisplus.core.mapper.BaseMapper) " +
             "|| this(com.chelvc.framework.database.support.EnhanceMapper)"
     )
     public Object routing(ProceedingJoinPoint point) throws Throwable {

+ 6 - 7
framework-location/src/main/java/com/chelvc/framework/location/support/TencentLocationHandler.java

@@ -1,6 +1,5 @@
 package com.chelvc.framework.location.support;
 
-import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -69,7 +68,7 @@ public class TencentLocationHandler implements LocationHandler {
         }
 
         // 构建地址信息
-        Region region = Objects.requireNonNull(Region.of(position.getAdcode()));
+        Region region = Region.of(position.getAdcode());
         TencentLocationResponse.Location location = response.getResult().getLocation();
         Double longitude = ObjectUtils.ifNull(location, TencentLocationResponse.Location::getLongitude);
         Double latitude = ObjectUtils.ifNull(location, TencentLocationResponse.Location::getLatitude);
@@ -78,12 +77,12 @@ public class TencentLocationHandler implements LocationHandler {
         address.setName(Stream.of(position.getProvince(), position.getCity(), position.getDistrict())
                 .filter(StringUtils::notEmpty).collect(Collectors.joining("·")
                 ));
-        address.setProvince(Area.builder().id(region.getProvince().getCode()).name(position.getProvince()).build());
-        Region city = region.getCity();
-        if (city != null) {
-            address.setCity(Area.builder().id(city.getCode()).name(position.getCity()).build());
+        address.setProvince(Area.builder().id(Region.code2province(position.getAdcode()))
+                .name(position.getProvince()).build());
+        if (!region.isProvince()) {
+            address.setCity(Area.builder().id(Region.code2city(region.getCode())).name(position.getCity()).build());
         }
-        if (region.getType() == Region.Type.DISTRICT) {
+        if (region.isDistrict()) {
             address.setDistrict(Area.builder().id(region.getCode()).name(position.getDistrict()).build());
         }
         return address;

+ 4 - 2
framework-oauth/src/main/java/com/chelvc/framework/oauth/config/OAuthConfigurer.java

@@ -81,7 +81,9 @@ public class OAuthConfigurer extends WebSecurityConfigurerAdapter {
     public AccessDeniedHandler accessDeniedHandler() {
         return (request, response, e) -> {
             LoggingContextHolder.warn(log, request, e);
-            SessionContextHolder.response(response, HttpStatus.FORBIDDEN, e.getMessage());
+            SessionContextHolder.response(
+                    response, HttpStatus.FORBIDDEN, ApplicationContextHolder.getMessage("Forbidden")
+            );
         };
     }
 
@@ -96,7 +98,7 @@ public class OAuthConfigurer extends WebSecurityConfigurerAdapter {
                 OAuth2Error error = ((OAuth2AuthenticationException) e).getError();
                 SessionContextHolder.response(response, error.getErrorCode(), error.getDescription());
             } else {
-                SessionContextHolder.response(response, HttpStatus.FORBIDDEN, e.getMessage());
+                SessionContextHolder.response(response, HttpStatus.UNAUTHORIZED, e.getMessage());
             }
         };
     }

+ 4 - 1
framework-security/src/main/java/com/chelvc/framework/security/interceptor/ControllerCryptoInterceptor.java

@@ -6,6 +6,7 @@ import java.io.InputStream;
 import java.lang.reflect.Type;
 import java.util.Objects;
 
+import com.chelvc.framework.base.context.ApplicationContextHolder;
 import com.chelvc.framework.base.context.JacksonContextHolder;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.base.util.HttpUtils;
@@ -93,7 +94,9 @@ public class ControllerCryptoInterceptor extends RequestBodyAdviceAdapter implem
         try {
             body = AESUtils.decode(ciphertext, secret, iv);
         } catch (Exception e) {
-            throw new FrameworkException(HttpStatus.FORBIDDEN.name(), null, "Invalid ciphertext");
+            throw new FrameworkException(
+                    HttpStatus.BAD_REQUEST.name(), null, ApplicationContextHolder.getMessage("Ciphertext.Invalid")
+            );
         }
         return new HttpInputMessage() {
             @Override

+ 6 - 2
framework-security/src/main/java/com/chelvc/framework/security/interceptor/SecurityValidateInterceptor.java

@@ -68,7 +68,9 @@ public class SecurityValidateInterceptor implements HandlerInterceptor, WebMvcCo
             // 非空请求头校验
             if (session.getPlatform() == null || session.getTerminal() == null
                     || StringUtils.isEmpty(session.getVersion()) || session.getTimestamp() == null) {
-                throw new FrameworkException(HttpStatus.FORBIDDEN.name(), null, "Invalid header");
+                throw new FrameworkException(
+                        HttpStatus.BAD_REQUEST.name(), null, ApplicationContextHolder.getMessage("Header.Invalid")
+                );
             }
 
             // 请求时间戳校验
@@ -90,7 +92,9 @@ public class SecurityValidateInterceptor implements HandlerInterceptor, WebMvcCo
             String signature = request.getHeader(SessionContextHolder.HEADER_SIGNATURE);
             LoggingContextHolder.debug(log, plaintext, ciphertext, payload);
             if (!Objects.equals(ciphertext, signature)) {
-                throw new FrameworkException(HttpStatus.FORBIDDEN.name(), null, "Invalid signature");
+                throw new FrameworkException(
+                        HttpStatus.BAD_REQUEST.name(), null, ApplicationContextHolder.getMessage("Signature.Invalid")
+                );
             }
         }
         return true;