dictItems;
+
+ @Schema(description = "字典")
+ @Getter
+ @Setter
+ public static class DictItem {
+
+ @Schema(description = "字典项ID")
+ private Long id;
+
+ @Schema(description = "字典项名称")
+ private String name;
+
+ @Schema(description = "字典项值")
+ private String value;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态(1-启用,0-禁用)")
+ private Integer status;
+
+ }
+
}
diff --git a/src/main/java/com/youlai/system/model/vo/DictTypePageVO.java b/src/main/java/com/youlai/system/model/vo/DictTypePageVO.java
deleted file mode 100644
index a6419988..00000000
--- a/src/main/java/com/youlai/system/model/vo/DictTypePageVO.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.youlai.system.model.vo;
-
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description ="字典类型分页对象")
-@Data
-public class DictTypePageVO {
-
- @Schema(description="字典类型ID")
- private Long id;
-
- @Schema(description="类型名称")
- private String name;
-
- @Schema(description="类型编码")
- private String code;
-
- @Schema(description="状态:1:启用;0:禁用")
- private Integer status;
-
-}
diff --git a/src/main/java/com/youlai/system/model/vo/MenuVO.java b/src/main/java/com/youlai/system/model/vo/MenuVO.java
index 3490e2f7..ecbf3ce9 100644
--- a/src/main/java/com/youlai/system/model/vo/MenuVO.java
+++ b/src/main/java/com/youlai/system/model/vo/MenuVO.java
@@ -23,8 +23,11 @@ public class MenuVO {
@Schema(description="菜单类型")
private MenuTypeEnum type;
+ @Schema(description = "路由名称")
+ private String routeName;
+
@Schema(description = "路由路径")
- private String path;
+ private String routePath;
@Schema(description = "组件路径")
private String component;
diff --git a/src/main/java/com/youlai/system/plugin/easyexcel/UserImportListener.java b/src/main/java/com/youlai/system/plugin/easyexcel/UserImportListener.java
index c216c460..8faac6ac 100644
--- a/src/main/java/com/youlai/system/plugin/easyexcel/UserImportListener.java
+++ b/src/main/java/com/youlai/system/plugin/easyexcel/UserImportListener.java
@@ -12,10 +12,12 @@ import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.GenderEnum;
import com.youlai.system.common.enums.StatusEnum;
import com.youlai.system.converter.UserConverter;
+import com.youlai.system.model.dto.UserImportDTO;
+import com.youlai.system.model.entity.SysDept;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.entity.SysUserRole;
-import com.youlai.system.model.vo.UserImportVO;
+import com.youlai.system.service.SysDeptService;
import com.youlai.system.service.SysRoleService;
import com.youlai.system.service.SysUserRoleService;
import com.youlai.system.service.SysUserService;
@@ -28,13 +30,13 @@ import java.util.stream.Collectors;
/**
* 用户导入监听器
*
- * 最简单的读的监听器
+ * 最简单的读的监听器
*
- * @author haoxr
- * @since 2022/4/10 20:49
+ * @author Ray
+ * @since 2022/4/10
*/
@Slf4j
-public class UserImportListener extends MyAnalysisEventListener {
+public class UserImportListener extends MyAnalysisEventListener {
// 有效条数
@@ -46,25 +48,19 @@ public class UserImportListener extends MyAnalysisEventListener {
// 导入返回信息
StringBuilder msg = new StringBuilder();
- // 部门ID
- private final Long deptId;
-
private final SysUserService userService;
-
private final PasswordEncoder passwordEncoder;
-
private final UserConverter userConverter;
-
private final SysRoleService roleService;
-
private final SysUserRoleService userRoleService;
+ private final SysDeptService deptService;
- public UserImportListener(Long deptId) {
- this.deptId = deptId;
+ public UserImportListener() {
this.userService = SpringUtil.getBean(SysUserService.class);
this.passwordEncoder = SpringUtil.getBean(PasswordEncoder.class);
this.roleService = SpringUtil.getBean(SysRoleService.class);
this.userRoleService = SpringUtil.getBean(SysUserRoleService.class);
+ this.deptService = SpringUtil.getBean(SysDeptService.class);
this.userConverter = SpringUtil.getBean(UserConverter.class);
}
@@ -74,16 +70,15 @@ public class UserImportListener extends MyAnalysisEventListener {
* 1. 数据校验;全字段校验
* 2. 数据持久化;
*
- * @param userImportVO 一行数据,类似于 {@link AnalysisContext#readRowHolder()}
- * @param analysisContext
+ * @param userImportDTO 一行数据,类似于 {@link AnalysisContext#readRowHolder()}
*/
@Override
- public void invoke(UserImportVO userImportVO, AnalysisContext analysisContext) {
- log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportVO));
+ public void invoke(UserImportDTO userImportDTO, AnalysisContext analysisContext) {
+ log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportDTO));
// 校验数据
StringBuilder validationMsg = new StringBuilder();
- String username = userImportVO.getUsername();
+ String username = userImportDTO.getUsername();
if (StrUtil.isBlank(username)) {
validationMsg.append("用户名为空;");
} else {
@@ -93,12 +88,12 @@ public class UserImportListener extends MyAnalysisEventListener {
}
}
- String nickname = userImportVO.getNickname();
+ String nickname = userImportDTO.getNickname();
if (StrUtil.isBlank(nickname)) {
validationMsg.append("用户昵称为空;");
}
- String mobile = userImportVO.getMobile();
+ String mobile = userImportDTO.getMobile();
if (StrUtil.isBlank(mobile)) {
validationMsg.append("手机号码为空;");
} else {
@@ -109,29 +104,38 @@ public class UserImportListener extends MyAnalysisEventListener {
if (validationMsg.isEmpty()) {
// 校验通过,持久化至数据库
- SysUser entity = userConverter.importVo2Entity(userImportVO);
- entity.setDeptId(deptId); // 部门
+ SysUser entity = userConverter.convertToEntity(userImportDTO);
entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码
// 性别翻译
- String genderLabel = userImportVO.getGenderLabel();
+ String genderLabel = userImportDTO.getGenderLabel();
if (StrUtil.isNotBlank(genderLabel)) {
Integer genderValue = (Integer) IBaseEnum.getValueByLabel(genderLabel, GenderEnum.class);
entity.setGender(genderValue);
}
// 角色解析
- String roleCodes = userImportVO.getRoleCodes();
+ String roleCodes = userImportDTO.getRoleCodes();
List roleIds = null;
if (StrUtil.isNotBlank(roleCodes)) {
roleIds = roleService.list(
new LambdaQueryWrapper()
- .in(SysRole::getCode, roleCodes.split(","))
+ .in(SysRole::getCode, (Object) roleCodes.split(","))
.eq(SysRole::getStatus, StatusEnum.ENABLE.getValue())
.select(SysRole::getId)
).stream()
.map(SysRole::getId)
.collect(Collectors.toList());
}
+ // 部门解析
+ String deptCode = userImportDTO.getDeptCode();
+ if (StrUtil.isNotBlank(deptCode)) {
+ SysDept dept = deptService.getOne(new LambdaQueryWrapper().eq(SysDept::getCode, deptCode)
+ .select(SysDept::getId)
+ );
+ if (dept != null) {
+ entity.setDeptId(dept.getId());
+ }
+ }
boolean saveResult = userService.save(entity);
@@ -150,18 +154,17 @@ public class UserImportListener extends MyAnalysisEventListener {
}
} else {
invalidCount++;
- msg.append("第" + (validCount + invalidCount) + "行数据校验失败:").append(validationMsg + "
");
+ msg.append("第").append(validCount + invalidCount).append("行数据校验失败:").append(validationMsg + "
");
}
}
/**
* 所有数据解析完成会来调用
- *
- * @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+ log.info("所有数据解析完成!");
}
@@ -169,7 +172,6 @@ public class UserImportListener extends MyAnalysisEventListener {
@Override
public String getMsg() {
// 总结信息
- String summaryMsg = StrUtil.format("导入用户结束:成功{}条,失败{}条;
{}", validCount, invalidCount, msg);
- return summaryMsg;
+ return StrUtil.format("导入用户结束:成功{}条,失败{}条;
{}", validCount, invalidCount, msg);
}
}
diff --git a/src/main/java/com/youlai/system/plugin/dupsubmit/annotation/PreventDuplicateSubmit.java b/src/main/java/com/youlai/system/plugin/norepeat/annotation/PreventRepeatSubmit.java
similarity index 55%
rename from src/main/java/com/youlai/system/plugin/dupsubmit/annotation/PreventDuplicateSubmit.java
rename to src/main/java/com/youlai/system/plugin/norepeat/annotation/PreventRepeatSubmit.java
index d23ce1b4..a767e2ee 100644
--- a/src/main/java/com/youlai/system/plugin/dupsubmit/annotation/PreventDuplicateSubmit.java
+++ b/src/main/java/com/youlai/system/plugin/norepeat/annotation/PreventRepeatSubmit.java
@@ -1,10 +1,13 @@
-package com.youlai.system.plugin.dupsubmit.annotation;
+package com.youlai.system.plugin.norepeat.annotation;
import java.lang.annotation.*;
/**
* 防止重复提交注解
+ *
+ * 该注解用于方法上,防止在指定时间内的重复提交。
+ * 默认时间为5秒。
*
* @author haoxr
* @since 2.3.0
@@ -13,10 +16,10 @@ import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
-public @interface PreventDuplicateSubmit {
+public @interface PreventRepeatSubmit {
/**
- * 防重提交锁过期时间(秒)
+ * 锁过期时间(秒)
*
* 默认5秒内不允许重复提交
*/
diff --git a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java b/src/main/java/com/youlai/system/plugin/norepeat/aspect/DuplicateSubmitAspect.java
similarity index 82%
rename from src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java
rename to src/main/java/com/youlai/system/plugin/norepeat/aspect/DuplicateSubmitAspect.java
index c88766bc..8405bb7a 100644
--- a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java
+++ b/src/main/java/com/youlai/system/plugin/norepeat/aspect/DuplicateSubmitAspect.java
@@ -1,4 +1,4 @@
-package com.youlai.system.plugin.dupsubmit.aspect;
+package com.youlai.system.plugin.norepeat.aspect;
import cn.hutool.core.util.StrUtil;
import cn.hutool.jwt.JWTUtil;
@@ -6,7 +6,7 @@ import cn.hutool.jwt.RegisteredPayload;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.common.exception.BusinessException;
import com.youlai.system.common.result.ResultCode;
-import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit;
+import com.youlai.system.plugin.norepeat.annotation.PreventRepeatSubmit;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -41,17 +41,17 @@ public class DuplicateSubmitAspect {
/**
* 防重复提交切点
*/
- @Pointcut("@annotation(preventDuplicateSubmit)")
- public void preventDuplicateSubmitPointCut(PreventDuplicateSubmit preventDuplicateSubmit) {
+ @Pointcut("@annotation(preventRepeatSubmit)")
+ public void preventDuplicateSubmitPointCut(PreventRepeatSubmit preventRepeatSubmit) {
log.info("定义防重复提交切点");
}
- @Around("preventDuplicateSubmitPointCut(preventDuplicateSubmit)")
- public Object doAround(ProceedingJoinPoint pjp, PreventDuplicateSubmit preventDuplicateSubmit) throws Throwable {
+ @Around("preventDuplicateSubmitPointCut(preventRepeatSubmit)")
+ public Object doAround(ProceedingJoinPoint pjp, PreventRepeatSubmit preventRepeatSubmit) throws Throwable {
String resubmitLockKey = generateResubmitLockKey();
if (resubmitLockKey != null) {
- int expire = preventDuplicateSubmit.expire(); // 防重提交锁过期时间
+ int expire = preventRepeatSubmit.expire(); // 防重提交锁过期时间
RLock lock = redissonClient.getLock(resubmitLockKey);
boolean lockResult = lock.tryLock(0, expire, TimeUnit.SECONDS); // 获取锁失败,直接返回 false
if (!lockResult) {
diff --git a/src/main/java/com/youlai/system/service/SysDeptService.java b/src/main/java/com/youlai/system/service/SysDeptService.java
index 70de00f2..48725e69 100644
--- a/src/main/java/com/youlai/system/service/SysDeptService.java
+++ b/src/main/java/com/youlai/system/service/SysDeptService.java
@@ -21,7 +21,7 @@ public interface SysDeptService extends IService {
*
* @return
*/
- List listDepartments(DeptQuery queryParams);
+ List getDeptList(DeptQuery queryParams);
/**
* 部门树形下拉选项
diff --git a/src/main/java/com/youlai/system/service/SysDictItemService.java b/src/main/java/com/youlai/system/service/SysDictItemService.java
new file mode 100644
index 00000000..1a040425
--- /dev/null
+++ b/src/main/java/com/youlai/system/service/SysDictItemService.java
@@ -0,0 +1,20 @@
+package com.youlai.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.youlai.system.model.entity.SysDictItem;
+
+/**
+ * 字典项 接口
+ *
+ * @author Ray Hao
+ * @since 2023/3/4
+ */
+public interface SysDictItemService extends IService {
+
+ /**
+ * 根据字典ID删除字典项
+ *
+ * @param dictId 字典ID
+ */
+ void removeByDictId(Long dictId);
+}
diff --git a/src/main/java/com/youlai/system/service/SysDictService.java b/src/main/java/com/youlai/system/service/SysDictService.java
index 389f6a91..165ca1df 100644
--- a/src/main/java/com/youlai/system/service/SysDictService.java
+++ b/src/main/java/com/youlai/system/service/SysDictService.java
@@ -2,68 +2,74 @@ package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.youlai.system.common.model.Option;
import com.youlai.system.model.entity.SysDict;
import com.youlai.system.model.form.DictForm;
-import com.youlai.system.model.query.DictPageQuery;
+import com.youlai.system.model.query.DictTypePageQuery;
import com.youlai.system.model.vo.DictPageVO;
-import com.youlai.system.common.model.Option;
import java.util.List;
/**
- * 字典接口
+ * 数据字典业务接口
*
* @author haoxr
- * @since 2023/3/4
+ * @since 2022/10/12
*/
public interface SysDictService extends IService {
- /**
- * 字典数据项分页列表
- *
- * @param queryParams
- * @return
- */
- Page getDictPage(DictPageQuery queryParams);
/**
- * 字典数据项表单
+ * 字典分页列表
*
- * @param id 字典数据项ID
+ * @param queryParams 分页查询对象
+ * @return
+ */
+ Page getDictPage(DictTypePageQuery queryParams);
+
+
+ /**
+ * 获取字典表单详情
+ *
+ * @param id 字典ID
* @return
*/
DictForm getDictForm(Long id);
+
/**
- * 新增字典数据项
+ * 新增字典
*
- * @param dictForm 字典数据项表单
+ * @param dictForm 字典表单
* @return
*/
boolean saveDict(DictForm dictForm);
+
/**
- * 修改字典数据项
+ * 修改字典
*
- * @param id 字典数据项ID
- * @param dictForm 字典数据项表单
+ * @param id
+ * @param dictForm 字典表单
* @return
*/
boolean updateDict(Long id, DictForm dictForm);
/**
- * 删除字典数据项
+ * 删除字典
*
- * @param idsStr 字典数据项ID,多个以英文逗号(,)分割
+ * @param idsStr 字典ID,多个以英文逗号(,)分割
* @return
*/
- boolean deleteDict(String idsStr);
+ void deleteDictByIds(String idsStr);
+
/**
- * 获取字典下拉列表
+ * 获取字典的数据项
*
* @param typeCode
* @return
*/
- List