From 737838d92fafe41882db7552af11f56c5aed945e Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 20 May 2025 12:31:49 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=AD=97=E5=85=B8=E5=80=BC=E6=A0=A1=E9=AA=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DictService.java | 9 +++ .../common/core/validate/dict/DictValue.java | 35 +++++++++ .../validate/dict/DictValueValidator.java | 42 +++++++++++ .../validate/enumd/EnumPatternValidator.java | 74 +++++++++---------- .../service/impl/SysDictTypeServiceImpl.java | 20 +++++ 5 files changed, 143 insertions(+), 37 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java index d80395cc8..fc33f1e35 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -84,4 +84,13 @@ public interface DictService { */ List getDictData(String dictType); + /** + * 校验指定的字典类型下是否存在指定的字典值 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return true 表示该字典值在指定字典类型中有效;false 表示无效 + */ + Boolean isValidDictValue(String dictType, String dictValue); + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java new file mode 100644 index 000000000..be842723a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java @@ -0,0 +1,35 @@ +package org.dromara.common.core.validate.dict; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 字典项校验注解 + * + * @author AprilWind + */ +@Constraint(validatedBy = DictValueValidator.class) +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DictValue { + + /** + * 字典类型,如 "sys_user_sex" + */ + String dictType(); + + /** + * 默认校验失败提示信息 + */ + String message() default "字典值无效"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java new file mode 100644 index 000000000..8507e219e --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java @@ -0,0 +1,42 @@ +package org.dromara.common.core.validate.dict; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.SpringUtils; + +/** + * 自定义字典值校验器 + * + * @author AprilWind + */ +public class DictValueValidator implements ConstraintValidator { + + /** + * 字典类型 + */ + private String dictType; + + /** + * 初始化校验器,提取注解上的字典类型 + * + * @param annotation 注解实例 + */ + @Override + public void initialize(DictValue annotation) { + this.dictType = annotation.dictType(); + } + + /** + * 校验字段值是否为指定字典类型中的合法值 + * + * @param value 被校验的字段值 + * @param context 校验上下文(可用于构建错误信息) + * @return true 表示校验通过(合法字典值),false 表示不通过 + */ + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return SpringUtils.getBean(DictService.class).isValidDictValue(dictType, value); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java index 6cfa11a33..e63f44a00 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java @@ -1,37 +1,37 @@ -package org.dromara.common.core.validate.enumd; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.reflect.ReflectUtils; - -/** - * 自定义枚举校验注解实现 - * - * @author 秋辞未寒 - * @date 2024-12-09 - */ -public class EnumPatternValidator implements ConstraintValidator { - - private EnumPattern annotation;; - - @Override - public void initialize(EnumPattern annotation) { - ConstraintValidator.super.initialize(annotation); - this.annotation = annotation; - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - if (StringUtils.isNotBlank(value)) { - String fieldName = annotation.fieldName(); - for (Object e : annotation.type().getEnumConstants()) { - if (value.equals(ReflectUtils.invokeGetter(e, fieldName))) { - return true; - } - } - } - return false; - } - -} +package org.dromara.common.core.validate.enumd; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +/** + * 自定义枚举校验注解实现 + * + * @author 秋辞未寒 + * @date 2024-12-09 + */ +public class EnumPatternValidator implements ConstraintValidator { + + private EnumPattern annotation; + + @Override + public void initialize(EnumPattern annotation) { + ConstraintValidator.super.initialize(annotation); + this.annotation = annotation; + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + if (StringUtils.isNotBlank(value)) { + String fieldName = annotation.fieldName(); + for (Object e : annotation.type().getEnumConstants()) { + if (value.equals(ReflectUtils.invokeGetter(e, fieldName))) { + return true; + } + } + } + return false; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index c417b42ca..7eaea5563 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -294,4 +294,24 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService return BeanUtil.copyToList(list, DictDataDTO.class); } + /** + * 校验指定的字典类型下是否存在指定的字典值 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return true 表示该字典值在指定字典类型中有效;false 表示无效 + */ + @Override + public Boolean isValidDictValue(String dictType, String dictValue) { + if (StringUtils.isBlank(dictType) || StringUtils.isBlank(dictValue)) { + return false; + } + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(datas)) { + return false; + } + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + return map.containsKey(dictValue); + } + }