This commit is contained in:
ray
2024-11-09 00:31:21 +08:00
15 changed files with 67 additions and 57 deletions

View File

@@ -65,7 +65,7 @@
`update_by` bigint DEFAULT NULL COMMENT '修改人ID', `update_by` bigint DEFAULT NULL COMMENT '修改人ID',
`is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(1-删除0-未删除)', `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(1-删除0-未删除)',
PRIMARY KEY (`id`) USING BTREE, 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='字典表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典表';
-- ---------------------------- -- ----------------------------
-- Records of sys_dict -- Records of sys_dict

View File

@@ -61,7 +61,7 @@ public class RateLimiterFilter extends OncePerRequestFilter {
/** /**
* IP限流过滤器 * IP限流过滤器
* 默认情况下限制同一个IP在一分钟内只能访问10次可以通过修改系统配置进行调整 * 默认情况下限制同一个IP在一内只能访问10次可以通过修改系统配置进行调整
* *
* @param request 请求体 * @param request 请求体
* @param response 响应体 * @param response 响应体

View File

@@ -80,7 +80,7 @@ public class GenConfigServiceImpl extends ServiceImpl<GenConfigMapper, GenConfig
String tableComment = tableMetadata.getTableComment(); String tableComment = tableMetadata.getTableComment();
if (StrUtil.isNotBlank(tableComment)) { if (StrUtil.isNotBlank(tableComment)) {
genConfig.setBusinessName(tableComment.replace("", "")); genConfig.setBusinessName(tableComment.replace("", "").trim());
} }
// 实体类名 = 表名去掉前缀后转驼峰,前缀默认为下划线分割的第一个元素 // 实体类名 = 表名去掉前缀后转驼峰,前缀默认为下划线分割的第一个元素
String entityName = StrUtil.toCamelCase(StrUtil.removePrefix(tableName, tableName.split("_")[0])); String entityName = StrUtil.toCamelCase(StrUtil.removePrefix(tableName, tableName.split("_")[0]));

View File

@@ -23,9 +23,6 @@ import org.mapstruct.Mappings;
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface UserConverter { public interface UserConverter {
@Mappings({
@Mapping(target = "genderLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getGender(), com.youlai.boot.system.enums.GenderEnum.class))")
})
UserPageVO toPageVo(UserBO bo); UserPageVO toPageVo(UserBO bo);
Page<UserPageVO> toPageVo(Page<UserBO> bo); Page<UserPageVO> toPageVo(Page<UserBO> bo);

View File

@@ -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<String> {
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;
}
}

View File

@@ -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<Integer> {
MALE(1, ""),
FEMALE (2, "");
private final Integer value;
private final String label;
GenderEnum(Integer value, String label) {
this.value = value;
this.label = label;
}
}

View File

@@ -8,7 +8,7 @@ import lombok.Getter;
* 通告发布状态枚举 * 通告发布状态枚举
* *
* @author haoxr * @author haoxr
* @since 2022/10/14 * @since 2024/10/14
*/ */
@Getter @Getter
@Schema(enumAsRef = true) @Schema(enumAsRef = true)

View File

@@ -8,20 +8,14 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.youlai.boot.common.base.BaseAnalysisEventListener; import com.youlai.boot.common.base.BaseAnalysisEventListener;
import com.youlai.boot.system.enums.GenderEnum; import com.youlai.boot.system.enums.DictCodeEnum;
import com.youlai.boot.system.model.entity.Dept; import com.youlai.boot.system.model.entity.*;
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.common.base.IBaseEnum; import com.youlai.boot.common.base.IBaseEnum;
import com.youlai.boot.common.constant.SystemConstants; import com.youlai.boot.common.constant.SystemConstants;
import com.youlai.boot.common.enums.StatusEnum; import com.youlai.boot.common.enums.StatusEnum;
import com.youlai.boot.system.converter.UserConverter; import com.youlai.boot.system.converter.UserConverter;
import com.youlai.boot.system.model.dto.UserImportDTO; import com.youlai.boot.system.model.dto.UserImportDTO;
import com.youlai.boot.system.service.DeptService; import com.youlai.boot.system.service.*;
import com.youlai.boot.system.service.RoleService;
import com.youlai.boot.system.service.UserRoleService;
import com.youlai.boot.system.service.UserService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
@@ -55,6 +49,7 @@ public class UserImportListener extends BaseAnalysisEventListener<UserImportDTO>
private final RoleService roleService; private final RoleService roleService;
private final UserRoleService userRoleService; private final UserRoleService userRoleService;
private final DeptService deptService; private final DeptService deptService;
private final DictDataService dictDataService;
public UserImportListener() { public UserImportListener() {
this.userService = SpringUtil.getBean(UserService.class); this.userService = SpringUtil.getBean(UserService.class);
@@ -62,6 +57,7 @@ public class UserImportListener extends BaseAnalysisEventListener<UserImportDTO>
this.roleService = SpringUtil.getBean(RoleService.class); this.roleService = SpringUtil.getBean(RoleService.class);
this.userRoleService = SpringUtil.getBean(UserRoleService.class); this.userRoleService = SpringUtil.getBean(UserRoleService.class);
this.deptService = SpringUtil.getBean(DeptService.class); this.deptService = SpringUtil.getBean(DeptService.class);
this.dictDataService = SpringUtil.getBean(DictDataService.class);
this.userConverter = SpringUtil.getBean(UserConverter.class); this.userConverter = SpringUtil.getBean(UserConverter.class);
} }
@@ -107,12 +103,19 @@ public class UserImportListener extends BaseAnalysisEventListener<UserImportDTO>
// 校验通过,持久化至数据库 // 校验通过,持久化至数据库
User entity = userConverter.toEntity(userImportDTO); User entity = userConverter.toEntity(userImportDTO);
entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码 entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码
// 性别逆向解析 // 性别逆向翻译 根据字典标签得到字典值
String genderLabel = userImportDTO.getGenderLabel(); String genderLabel = userImportDTO.getGenderLabel();
if (StrUtil.isNotBlank(genderLabel)) { if (StrUtil.isNotBlank(genderLabel)) {
Integer genderValue = (Integer) IBaseEnum.getValueByLabel(genderLabel, GenderEnum.class); DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
.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); entity.setGender(genderValue);
} }
}
// 角色解析 // 角色解析
String roleCodes = userImportDTO.getRoleCodes(); String roleCodes = userImportDTO.getRoleCodes();
List<Long> roleIds = null; List<Long> roleIds = null;

View File

@@ -35,6 +35,7 @@ public interface DictMapper extends BaseMapper<Dict> {
* @return 字典列表 * @return 字典列表
*/ */
List<DictVO> getAllDictWithData(); List<DictVO> getAllDictWithData();
} }

View File

@@ -29,7 +29,7 @@ public class UserPageVO {
private String mobile; private String mobile;
@Schema(description="性别") @Schema(description="性别")
private String genderLabel; private Integer gender;
@Schema(description="用户头像地址") @Schema(description="用户头像地址")
private String avatar; private String avatar;

View File

@@ -70,6 +70,7 @@ public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements Di
long count = this.count(new LambdaQueryWrapper<Dict>() long count = this.count(new LambdaQueryWrapper<Dict>()
.eq(Dict::getDictCode, dictCode) .eq(Dict::getDictCode, dictCode)
); );
Assert.isTrue(count == 0, "字典编码已存在"); Assert.isTrue(count == 0, "字典编码已存在");
return this.save(entity); return this.save(entity);

View File

@@ -3,6 +3,8 @@ spring:
name: youlai-boot name: youlai-boot
profiles: profiles:
active: dev active: dev
project:
version: @project.version@
# 代码生成器配置 # 代码生成器配置
codegen: codegen:

View File

@@ -7,7 +7,7 @@ ${AnsiColor.BRIGHT_BLUE}
|_|\___/ \__,_| |______\__,_|_| |_|\___/ \__,_| |______\__,_|_|
${AnsiColor.BRIGHT_GREEN} ${AnsiColor.BRIGHT_GREEN}
YouLai Boot Version: 2.8.1 YouLai Boot Version: ${project.version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version} Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
有来官网: https://www.youlai.tech/ 有来官网: https://www.youlai.tech/
版权所属: 有来开源组织 版权所属: 有来开源组织

View File

@@ -53,6 +53,12 @@
AND u.create_time &lt;= #{endDate} AND u.create_time &lt;= #{endDate}
</if> </if>
</if> </if>
<if test="queryParams.roleIds != null and queryParams.roleIds.size() > 0">
AND sur.role_id IN
<foreach item="roleId" collection="queryParams.roleIds" open="(" separator="," close=")">
#{roleId}
</foreach>
</if>
</where> </where>
GROUP BY GROUP BY
u.id u.id

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="search-container"> <div class="search-bar">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
#foreach($fieldConfig in $fieldConfigs) #foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInQuery == 1) #if($fieldConfig.isShowInQuery == 1)
@@ -14,7 +14,7 @@
/> />
#elseif($fieldConfig.formType == "SELECT") #elseif($fieldConfig.formType == "SELECT")
#if($fieldConfig.dictType != "") #if($fieldConfig.dictType != "")
<dictionary v-model="queryParams.$fieldConfig.fieldName" code="$fieldConfig.dictType" /> <dict v-model="queryParams.$fieldConfig.fieldName" code="$fieldConfig.dictType" />
#else #else
<el-select v-model="queryParams.$fieldConfig.fieldName" placeholder="请选择$fieldConfig.fieldComment"> <el-select v-model="queryParams.$fieldConfig.fieldName" placeholder="请选择$fieldConfig.fieldComment">
<el-option :key="1" :value="1" label="选项一"/> <el-option :key="1" :value="1" label="选项一"/>
@@ -93,8 +93,8 @@
</el-form> </el-form>
</div> </div>
<el-card shadow="never" class="table-container"> <el-card shadow="never">
<template #header> <div class="mb-10px">
<el-button <el-button
v-hasPerm="['${moduleName}:${lowerFirstEntityName}:add']" v-hasPerm="['${moduleName}:${lowerFirstEntityName}:add']"
type="success" type="success"
@@ -112,7 +112,7 @@
<template #icon><Delete /></template> <template #icon><Delete /></template>
删除 删除
</el-button> </el-button>
</template> </div>
<el-table <el-table
ref="dataTableRef" ref="dataTableRef"
@@ -187,7 +187,7 @@
/> />
#elseif($fieldConfig.formType == "SELECT") #elseif($fieldConfig.formType == "SELECT")
#if($fieldConfig.dictType != "") #if($fieldConfig.dictType != "")
<dictionary v-model="formData.$fieldConfig.fieldName" code="$fieldConfig.dictType" /> <dict v-model="formData.$fieldConfig.fieldName" code="$fieldConfig.dictType" />
#else #else
<el-select v-model="formData.$fieldConfig.fieldName" placeholder="请选择$fieldConfig.fieldComment"> <el-select v-model="formData.$fieldConfig.fieldName" placeholder="请选择$fieldConfig.fieldComment">
<el-option :value="0" label="选项一"/> <el-option :value="0" label="选项一"/>
@@ -256,7 +256,7 @@
inheritAttrs: false, 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 queryFormRef = ref(ElForm);
const dataFormRef = ref(ElForm); const dataFormRef = ref(ElForm);