diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index 6ebb78a6..ec042a83 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -65,7 +65,7 @@ `update_by` bigint DEFAULT NULL COMMENT '修改人ID', `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(1-删除,0-未删除)', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_code` (`dict_code`) USING BTREE + KEY `idx_dict_code` (`dict_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict diff --git a/src/main/java/com/youlai/boot/core/filter/RateLimiterFilter.java b/src/main/java/com/youlai/boot/core/filter/RateLimiterFilter.java index 62de5609..eba72de6 100644 --- a/src/main/java/com/youlai/boot/core/filter/RateLimiterFilter.java +++ b/src/main/java/com/youlai/boot/core/filter/RateLimiterFilter.java @@ -61,7 +61,7 @@ public class RateLimiterFilter extends OncePerRequestFilter { /** * IP限流过滤器 - * 默认情况下:限制同一个IP在一分钟内只能访问10次,可以通过修改系统配置进行调整 + * 默认情况下:限制同一个IP在一秒内只能访问10次,可以通过修改系统配置进行调整 * * @param request 请求体 * @param response 响应体 diff --git a/src/main/java/com/youlai/boot/shared/codegen/service/impl/GenConfigServiceImpl.java b/src/main/java/com/youlai/boot/shared/codegen/service/impl/GenConfigServiceImpl.java index deb5cc31..bb6601f4 100644 --- a/src/main/java/com/youlai/boot/shared/codegen/service/impl/GenConfigServiceImpl.java +++ b/src/main/java/com/youlai/boot/shared/codegen/service/impl/GenConfigServiceImpl.java @@ -80,7 +80,7 @@ public class GenConfigServiceImpl extends ServiceImpl toPageVo(Page bo); diff --git a/src/main/java/com/youlai/boot/system/enums/DictCodeEnum.java b/src/main/java/com/youlai/boot/system/enums/DictCodeEnum.java new file mode 100644 index 00000000..add33329 --- /dev/null +++ b/src/main/java/com/youlai/boot/system/enums/DictCodeEnum.java @@ -0,0 +1,28 @@ +package com.youlai.boot.system.enums; + +import com.youlai.boot.common.base.IBaseEnum; +import lombok.Getter; + +/** + * 字典编码枚举 + * + * @author Ray + * @since 2024/10/30 + */ +@Getter +public enum DictCodeEnum implements IBaseEnum { + + GENDER("gender", "性别"), + NOTICE_TYPE("notice_type", "通知类型"), + NOTICE_LEVEL("notice_level", "通知级别"); + + private final String value; + + private final String label; + + DictCodeEnum(String value, String label) { + this.value = value; + this.label = label; + } + +} diff --git a/src/main/java/com/youlai/boot/system/enums/GenderEnum.java b/src/main/java/com/youlai/boot/system/enums/GenderEnum.java deleted file mode 100644 index 114fd543..00000000 --- a/src/main/java/com/youlai/boot/system/enums/GenderEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.youlai.boot.system.enums; - -import com.youlai.boot.common.base.IBaseEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; - -/** - * 性别枚举 - * - * @author haoxr - * @since 2022/10/14 - */ -@Getter -@Schema(enumAsRef = true) -public enum GenderEnum implements IBaseEnum { - - MALE(1, "男"), - FEMALE (2, "女"); - - private final Integer value; - - private final String label; - - GenderEnum(Integer value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java b/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java index f7f5d007..cd5e718e 100644 --- a/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java +++ b/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java @@ -8,7 +8,7 @@ import lombok.Getter; * 通告发布状态枚举 * * @author haoxr - * @since 2022/10/14 + * @since 2024/10/14 */ @Getter @Schema(enumAsRef = true) diff --git a/src/main/java/com/youlai/boot/system/listener/UserImportListener.java b/src/main/java/com/youlai/boot/system/listener/UserImportListener.java index 65c470df..4d5cc56f 100644 --- a/src/main/java/com/youlai/boot/system/listener/UserImportListener.java +++ b/src/main/java/com/youlai/boot/system/listener/UserImportListener.java @@ -8,20 +8,14 @@ import cn.hutool.json.JSONUtil; import com.alibaba.excel.context.AnalysisContext; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.youlai.boot.common.base.BaseAnalysisEventListener; -import com.youlai.boot.system.enums.GenderEnum; -import com.youlai.boot.system.model.entity.Dept; -import com.youlai.boot.system.model.entity.Role; -import com.youlai.boot.system.model.entity.User; -import com.youlai.boot.system.model.entity.UserRole; +import com.youlai.boot.system.enums.DictCodeEnum; +import com.youlai.boot.system.model.entity.*; import com.youlai.boot.common.base.IBaseEnum; import com.youlai.boot.common.constant.SystemConstants; import com.youlai.boot.common.enums.StatusEnum; import com.youlai.boot.system.converter.UserConverter; import com.youlai.boot.system.model.dto.UserImportDTO; -import com.youlai.boot.system.service.DeptService; -import com.youlai.boot.system.service.RoleService; -import com.youlai.boot.system.service.UserRoleService; -import com.youlai.boot.system.service.UserService; +import com.youlai.boot.system.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; @@ -55,6 +49,7 @@ public class UserImportListener extends BaseAnalysisEventListener private final RoleService roleService; private final UserRoleService userRoleService; private final DeptService deptService; + private final DictDataService dictDataService; public UserImportListener() { this.userService = SpringUtil.getBean(UserService.class); @@ -62,6 +57,7 @@ public class UserImportListener extends BaseAnalysisEventListener this.roleService = SpringUtil.getBean(RoleService.class); this.userRoleService = SpringUtil.getBean(UserRoleService.class); this.deptService = SpringUtil.getBean(DeptService.class); + this.dictDataService = SpringUtil.getBean(DictDataService.class); this.userConverter = SpringUtil.getBean(UserConverter.class); } @@ -107,11 +103,18 @@ public class UserImportListener extends BaseAnalysisEventListener // 校验通过,持久化至数据库 User entity = userConverter.toEntity(userImportDTO); entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码 - // 性别逆向解析 + // 性别逆向翻译 根据字典标签得到字典值 String genderLabel = userImportDTO.getGenderLabel(); if (StrUtil.isNotBlank(genderLabel)) { - Integer genderValue = (Integer) IBaseEnum.getValueByLabel(genderLabel, GenderEnum.class); - entity.setGender(genderValue); + DictData dictData = dictDataService.getOne(new LambdaQueryWrapper() + .eq(DictData::getDictCode, DictCodeEnum.GENDER.getValue()) + .eq(DictData::getLabel, genderLabel) + .last("limit 1") + ); + if (dictData != null) { + Integer genderValue = Integer.parseInt(dictData.getValue()); + entity.setGender(genderValue); + } } // 角色解析 String roleCodes = userImportDTO.getRoleCodes(); diff --git a/src/main/java/com/youlai/boot/system/mapper/DictMapper.java b/src/main/java/com/youlai/boot/system/mapper/DictMapper.java index 901e9934..0a1050ba 100644 --- a/src/main/java/com/youlai/boot/system/mapper/DictMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/DictMapper.java @@ -35,6 +35,7 @@ public interface DictMapper extends BaseMapper { * @return 字典列表 */ List getAllDictWithData(); + } diff --git a/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java b/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java index 770a9424..abd2ddbe 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java @@ -29,7 +29,7 @@ public class UserPageVO { private String mobile; @Schema(description="性别") - private String genderLabel; + private Integer gender; @Schema(description="用户头像地址") private String avatar; diff --git a/src/main/java/com/youlai/boot/system/service/impl/DictServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/DictServiceImpl.java index f2a11eff..5e647be7 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/DictServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/DictServiceImpl.java @@ -68,8 +68,9 @@ public class DictServiceImpl extends ServiceImpl implements Di String dictCode = entity.getDictCode(); long count = this.count(new LambdaQueryWrapper() - .eq(Dict::getDictCode, dictCode) + .eq(Dict::getDictCode, dictCode) ); + Assert.isTrue(count == 0, "字典编码已存在"); return this.save(entity); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 27ddf31e..979258be 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,6 +3,8 @@ spring: name: youlai-boot profiles: active: dev +project: + version: @project.version@ # 代码生成器配置 codegen: diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index c8ffd395..c3c28124 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -7,7 +7,7 @@ ${AnsiColor.BRIGHT_BLUE} |_|\___/ \__,_| |______\__,_|_| ${AnsiColor.BRIGHT_GREEN} -YouLai Boot Version: 2.8.1 +YouLai Boot Version: ${project.version} Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version} 有来官网: https://www.youlai.tech/ 版权所属: 有来开源组织 diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml index 11937203..1ad91b7c 100644 --- a/src/main/resources/mapper/system/UserMapper.xml +++ b/src/main/resources/mapper/system/UserMapper.xml @@ -53,6 +53,12 @@ AND u.create_time <= #{endDate} + + AND sur.role_id IN + + #{roleId} + + GROUP BY u.id diff --git a/src/main/resources/templates/codegen/index.vue.vm b/src/main/resources/templates/codegen/index.vue.vm index 8a486510..faedf21c 100644 --- a/src/main/resources/templates/codegen/index.vue.vm +++ b/src/main/resources/templates/codegen/index.vue.vm @@ -1,6 +1,6 @@ + #elseif($fieldConfig.formType == "SELECT") #if($fieldConfig.dictType != "") - + #else @@ -256,7 +256,7 @@ inheritAttrs: false, }); - import ${entityName}API, { ${entityName}PageVO, ${entityName}Form, ${entityName}PageQuery } from "@/api/${kebabCaseEntityName}"; + import ${entityName}API, { ${entityName}PageVO, ${entityName}Form, ${entityName}PageQuery } from "@/api/${moduleName}/${kebabCaseEntityName}"; const queryFormRef = ref(ElForm); const dataFormRef = ref(ElForm);