mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 10:57:13 +08:00 
			
		
		
		
	perf: 系统参数新增根据类别查询方法
This commit is contained in:
		| @@ -166,9 +166,9 @@ public enum PasswordPolicyEnum { | |||||||
|     private final String msg; |     private final String msg; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 策略前缀 |      * 策略类别 | ||||||
|      */ |      */ | ||||||
|     public static final String PREFIX = "PASSWORD_"; |     public static final String CATEGORY = "PASSWORD"; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 校验取值范围 |      * 校验取值范围 | ||||||
|   | |||||||
| @@ -16,9 +16,13 @@ | |||||||
|  |  | ||||||
| package top.continew.admin.system.mapper; | package top.continew.admin.system.mapper; | ||||||
|  |  | ||||||
|  | import org.apache.ibatis.annotations.Param; | ||||||
|  | import org.apache.ibatis.annotations.Select; | ||||||
| import top.continew.admin.system.model.entity.OptionDO; | import top.continew.admin.system.model.entity.OptionDO; | ||||||
| import top.continew.starter.data.mybatis.plus.base.BaseMapper; | import top.continew.starter.data.mybatis.plus.base.BaseMapper; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 参数 Mapper |  * 参数 Mapper | ||||||
|  * |  * | ||||||
| @@ -26,4 +30,13 @@ import top.continew.starter.data.mybatis.plus.base.BaseMapper; | |||||||
|  * @since 2023/8/26 19:38 |  * @since 2023/8/26 19:38 | ||||||
|  */ |  */ | ||||||
| public interface OptionMapper extends BaseMapper<OptionDO> { | public interface OptionMapper extends BaseMapper<OptionDO> { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 根据类别查询 | ||||||
|  |      * | ||||||
|  |      * @param category 类别 | ||||||
|  |      * @return 列表 | ||||||
|  |      */ | ||||||
|  |     @Select("SELECT code, value, default_value FROM sys_option WHERE category = #{category}") | ||||||
|  |     List<OptionDO> selectByCategory(@Param("category") String category); | ||||||
| } | } | ||||||
| @@ -22,6 +22,7 @@ import top.continew.admin.system.model.req.OptionResetValueReq; | |||||||
| import top.continew.admin.system.model.resp.OptionResp; | import top.continew.admin.system.model.resp.OptionResp; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
| import java.util.function.Function; | import java.util.function.Function; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -40,6 +41,14 @@ public interface OptionService { | |||||||
|      */ |      */ | ||||||
|     List<OptionResp> list(OptionQuery query); |     List<OptionResp> list(OptionQuery query); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 根据类别查询 | ||||||
|  |      * | ||||||
|  |      * @param category 类别 | ||||||
|  |      * @return 参数信息 | ||||||
|  |      */ | ||||||
|  |     Map<String, String> getByCategory(String category); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 修改参数 |      * 修改参数 | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -19,7 +19,9 @@ package top.continew.admin.system.service.impl; | |||||||
| import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.util.NumberUtil; | import cn.hutool.core.util.NumberUtil; | ||||||
|  | import cn.hutool.core.util.ObjectUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
|  | import com.alicp.jetcache.anno.Cached; | ||||||
| import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; | import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| @@ -56,14 +58,25 @@ public class OptionServiceImpl implements OptionService { | |||||||
|     private final OptionMapper baseMapper; |     private final OptionMapper baseMapper; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|  |     @Cached(key = "#query.category", name = CacheConstants.OPTION_KEY_PREFIX) | ||||||
|     public List<OptionResp> list(OptionQuery query) { |     public List<OptionResp> list(OptionQuery query) { | ||||||
|         return BeanUtil.copyToList(baseMapper.selectList(QueryWrapperHelper.build(query)), OptionResp.class); |         return BeanUtil.copyToList(baseMapper.selectList(QueryWrapperHelper.build(query)), OptionResp.class); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     @Cached(key = "#category", name = CacheConstants.OPTION_KEY_PREFIX + "MAP:") | ||||||
|  |     public Map<String, String> getByCategory(String category) { | ||||||
|  |         return baseMapper.selectByCategory(category) | ||||||
|  |             .stream() | ||||||
|  |             .collect(Collectors.toMap(OptionDO::getCode, o -> StrUtil.emptyIfNull(ObjectUtil.defaultIfNull(o | ||||||
|  |                 .getValue(), o.getDefaultValue())), (oldVal, newVal) -> oldVal)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void update(List<OptionReq> options) { |     public void update(List<OptionReq> options) { | ||||||
|         Map<String, String> passwordPolicyOptionMap = options.stream() |         Map<String, String> passwordPolicyOptionMap = options.stream() | ||||||
|             .filter(option -> StrUtil.startWith(option.getCode(), PasswordPolicyEnum.PREFIX)) |             .filter(option -> StrUtil.startWith(option | ||||||
|  |                 .getCode(), PasswordPolicyEnum.CATEGORY + StringConstants.UNDERLINE)) | ||||||
|             .collect(Collectors.toMap(OptionReq::getCode, OptionReq::getValue, (oldVal, newVal) -> oldVal)); |             .collect(Collectors.toMap(OptionReq::getCode, OptionReq::getValue, (oldVal, newVal) -> oldVal)); | ||||||
|         // 校验密码策略参数取值范围 |         // 校验密码策略参数取值范围 | ||||||
|         for (Map.Entry<String, String> passwordPolicyOptionEntry : passwordPolicyOptionMap.entrySet()) { |         for (Map.Entry<String, String> passwordPolicyOptionEntry : passwordPolicyOptionMap.entrySet()) { | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ import cn.hutool.core.bean.BeanUtil; | |||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.img.ImgUtil; | import cn.hutool.core.img.ImgUtil; | ||||||
| import cn.hutool.core.io.file.FileNameUtil; | import cn.hutool.core.io.file.FileNameUtil; | ||||||
|  | import cn.hutool.core.map.MapUtil; | ||||||
| import cn.hutool.core.util.ObjectUtil; | import cn.hutool.core.util.ObjectUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import com.alicp.jetcache.anno.CacheInvalidate; | import com.alicp.jetcache.anno.CacheInvalidate; | ||||||
| @@ -333,16 +334,17 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserRes | |||||||
|      * @param user     用户信息 |      * @param user     用户信息 | ||||||
|      */ |      */ | ||||||
|     private int checkPassword(String password, UserDO user) { |     private int checkPassword(String password, UserDO user) { | ||||||
|  |         Map<String, String> passwordPolicy = optionService.getByCategory(CATEGORY); | ||||||
|         // 密码最小长度 |         // 密码最小长度 | ||||||
|         PASSWORD_MIN_LENGTH.validate(password, optionService.getValueByCode2Int(PASSWORD_MIN_LENGTH.name()), user); |         PASSWORD_MIN_LENGTH.validate(password, MapUtil.getInt(passwordPolicy, PASSWORD_MIN_LENGTH.name()), user); | ||||||
|         // 密码是否必须包含特殊字符 |         // 密码是否必须包含特殊字符 | ||||||
|         PASSWORD_CONTAIN_SPECIAL_CHARACTERS.validate(password, optionService |         PASSWORD_CONTAIN_SPECIAL_CHARACTERS.validate(password, MapUtil | ||||||
|             .getValueByCode2Int(PASSWORD_CONTAIN_SPECIAL_CHARACTERS.name()), user); |             .getInt(passwordPolicy, PASSWORD_CONTAIN_SPECIAL_CHARACTERS.name()), user); | ||||||
|         // 密码是否允许包含正反序账号名 |         // 密码是否允许包含正反序账号名 | ||||||
|         PASSWORD_ALLOW_CONTAIN_USERNAME.validate(password, optionService |         PASSWORD_ALLOW_CONTAIN_USERNAME.validate(password, MapUtil | ||||||
|             .getValueByCode2Int(PASSWORD_ALLOW_CONTAIN_USERNAME.name()), user); |             .getInt(passwordPolicy, PASSWORD_ALLOW_CONTAIN_USERNAME.name()), user); | ||||||
|         // 密码重复使用规则 |         // 密码重复使用规则 | ||||||
|         int passwordReusePolicy = optionService.getValueByCode2Int(PASSWORD_REUSE_POLICY.name()); |         int passwordReusePolicy = MapUtil.getInt(passwordPolicy, PASSWORD_REUSE_POLICY.name()); | ||||||
|         PASSWORD_REUSE_POLICY.validate(password, passwordReusePolicy, user); |         PASSWORD_REUSE_POLICY.validate(password, passwordReusePolicy, user); | ||||||
|         return passwordReusePolicy; |         return passwordReusePolicy; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -20,7 +20,6 @@ import cn.dev33.satoken.annotation.SaIgnore; | |||||||
| import cn.hutool.core.lang.tree.Tree; | import cn.hutool.core.lang.tree.Tree; | ||||||
| import cn.hutool.core.util.ClassUtil; | import cn.hutool.core.util.ClassUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import com.alicp.jetcache.anno.Cached; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.Parameter; | import io.swagger.v3.oas.annotations.Parameter; | ||||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||||
| @@ -31,7 +30,6 @@ import org.dromara.x.file.storage.core.FileInfo; | |||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||||
| import top.continew.admin.common.constant.CacheConstants; |  | ||||||
| import top.continew.admin.common.model.resp.LabelValueResp; | import top.continew.admin.common.model.resp.LabelValueResp; | ||||||
| import top.continew.admin.system.model.query.DeptQuery; | import top.continew.admin.system.model.query.DeptQuery; | ||||||
| import top.continew.admin.system.model.query.MenuQuery; | import top.continew.admin.system.model.query.MenuQuery; | ||||||
| @@ -112,7 +110,6 @@ public class CommonController { | |||||||
|     @SaIgnore |     @SaIgnore | ||||||
|     @Operation(summary = "查询参数字典", description = "查询参数字典") |     @Operation(summary = "查询参数字典", description = "查询参数字典") | ||||||
|     @GetMapping("/dict/option") |     @GetMapping("/dict/option") | ||||||
|     @Cached(key = "#query.category", name = CacheConstants.OPTION_KEY_PREFIX) |  | ||||||
|     public R<List<LabelValueResp<String>>> listOptionDict(@Validated OptionQuery query) { |     public R<List<LabelValueResp<String>>> listOptionDict(@Validated OptionQuery query) { | ||||||
|         return R.ok(optionService.list(query) |         return R.ok(optionService.list(query) | ||||||
|             .stream() |             .stream() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user