Merge branch '1.0.x' into dev
# Conflicts: # README.md
This commit is contained in:
commit
6bb15d782e
@ -19,7 +19,7 @@
|
|||||||
<img src="https://gitee.com/Charles7c/continew-admin/badge/fork.svg?theme=white" alt="Gitee forks" />
|
<img src="https://gitee.com/Charles7c/continew-admin/badge/fork.svg?theme=white" alt="Gitee forks" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
📚 <a href="https://doc.charles7c.top" target="_blank">在线文档</a> | ✨ <a href="https://doc.charles7c.top/require" target="_blank">提交需求</a> | 🚀 <a href="https://cnadmin.charles7c.top" target="_blank">演示地址</a>(账号/密码:admin/admin123)
|
📚 [在线文档](https://doc.charles7c.top) | ✨ [提交需求](https://doc.charles7c.top/require) | 🚀 [演示地址](https://cnadmin.charles7c.top)(账号/密码:admin/admin123)
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
@ -54,8 +54,9 @@ ContiNew Admin 中后台管理框架/脚手架,Continue New Admin,持续以
|
|||||||
|
|
||||||
**v2.0.0:** :fire: 升级并适配 Spring Boot 3.x。
|
**v2.0.0:** :fire: 升级并适配 Spring Boot 3.x。
|
||||||
|
|
||||||
- [ ] 依赖升级:升级并适配 Spring Boot 3.x
|
- [x] 依赖升级:升级并适配 Spring Boot 3.x
|
||||||
- [ ] 依赖升级:其他依赖升级
|
- [x] 依赖升级:其他依赖升级
|
||||||
|
- [x] 适配 Java 8 => Java 17 新 API 及特性
|
||||||
- [ ] 计划对接 <a href="https://gitee.com/aizuda/flowlong" target="_blank">FlowLong</a> 纯国产工作流引擎
|
- [ ] 计划对接 <a href="https://gitee.com/aizuda/flowlong" target="_blank">FlowLong</a> 纯国产工作流引擎
|
||||||
- [ ] 其他需求汇集中...
|
- [ ] 其他需求汇集中...
|
||||||
|
|
||||||
|
@ -16,9 +16,8 @@
|
|||||||
|
|
||||||
package top.charles7c.cnadmin.common.config.properties;
|
package top.charles7c.cnadmin.common.config.properties;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.AccessLevel;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import cn.hutool.extra.spring.SpringUtil;
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
|
|
||||||
@ -29,8 +28,7 @@ import cn.hutool.extra.spring.SpringUtil;
|
|||||||
* @author Charles7c
|
* @author Charles7c
|
||||||
* @since 2022/12/21 20:21
|
* @since 2022/12/21 20:21
|
||||||
*/
|
*/
|
||||||
@Data
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
@Component
|
|
||||||
public class RsaProperties {
|
public class RsaProperties {
|
||||||
|
|
||||||
/** 私钥 */
|
/** 私钥 */
|
||||||
|
@ -20,11 +20,11 @@ import java.util.concurrent.ScheduledExecutorService;
|
|||||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
@ -40,10 +40,9 @@ import top.charles7c.cnadmin.common.util.ExceptionUtils;
|
|||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Configuration
|
@Configuration
|
||||||
@RequiredArgsConstructor
|
@EnableConfigurationProperties(ThreadPoolProperties.class)
|
||||||
public class ThreadPoolConfiguration {
|
public class ThreadPoolConfiguration {
|
||||||
|
|
||||||
private final ThreadPoolProperties threadPoolProperties;
|
|
||||||
/** 核心(最小)线程数 = CPU 核心数 + 1 */
|
/** 核心(最小)线程数 = CPU 核心数 + 1 */
|
||||||
private final int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;
|
private final int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;
|
||||||
|
|
||||||
@ -52,7 +51,7 @@ public class ThreadPoolConfiguration {
|
|||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
|
@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
|
||||||
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
|
public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) {
|
||||||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
// 核心(最小)线程数
|
// 核心(最小)线程数
|
||||||
executor.setCorePoolSize(corePoolSize);
|
executor.setCorePoolSize(corePoolSize);
|
||||||
|
@ -19,7 +19,6 @@ package top.charles7c.cnadmin.common.config.threadpool;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 线程池配置属性
|
* 线程池配置属性
|
||||||
@ -29,7 +28,6 @@ import org.springframework.stereotype.Component;
|
|||||||
* @since 2022/12/23 23:06
|
* @since 2022/12/23 23:06
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Component
|
|
||||||
@ConfigurationProperties(prefix = "thread-pool")
|
@ConfigurationProperties(prefix = "thread-pool")
|
||||||
public class ThreadPoolProperties {
|
public class ThreadPoolProperties {
|
||||||
|
|
||||||
|
@ -45,6 +45,11 @@ public class StringConsts implements StrPool {
|
|||||||
*/
|
*/
|
||||||
public static final String ASTERISK = "*";
|
public static final String ASTERISK = "*";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 问号
|
||||||
|
*/
|
||||||
|
public static final String QUESTION_MARK = "?";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 中文逗号
|
* 中文逗号
|
||||||
*/
|
*/
|
||||||
|
@ -25,6 +25,8 @@ import lombok.AccessLevel;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异常工具类
|
* 异常工具类
|
||||||
*
|
*
|
||||||
@ -99,7 +101,7 @@ public class ExceptionUtils {
|
|||||||
* @return /
|
* @return /
|
||||||
*/
|
*/
|
||||||
public static String exToBlank(ExSupplier<String> exSupplier) {
|
public static String exToBlank(ExSupplier<String> exSupplier) {
|
||||||
return exToDefault(exSupplier, "");
|
return exToDefault(exSupplier, StringConsts.EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
import top.charles7c.cnadmin.common.exception.ServiceException;
|
import top.charles7c.cnadmin.common.exception.ServiceException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,8 +53,8 @@ public class CheckUtils extends Validator {
|
|||||||
* 字段值
|
* 字段值
|
||||||
*/
|
*/
|
||||||
public static void throwIfNotExists(Object obj, String entityName, String fieldName, Object fieldValue) {
|
public static void throwIfNotExists(Object obj, String entityName, String fieldName, Object fieldValue) {
|
||||||
String message =
|
String message = String.format("%s 为 [%s] 的 %s 记录已不存在", fieldName, fieldValue,
|
||||||
String.format("%s 为 [%s] 的 %s 记录已不存在", fieldName, fieldValue, StrUtil.replace(entityName, "DO", ""));
|
StrUtil.replace(entityName, "DO", StringConsts.EMPTY));
|
||||||
throwIfNull(obj, message, EXCEPTION_TYPE);
|
throwIfNull(obj, message, EXCEPTION_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import cn.hutool.http.HttpStatus;
|
|||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
|
||||||
import top.charles7c.cnadmin.auth.model.request.LoginRequest;
|
import top.charles7c.cnadmin.auth.model.request.LoginRequest;
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
import top.charles7c.cnadmin.common.constant.SysConsts;
|
import top.charles7c.cnadmin.common.constant.SysConsts;
|
||||||
import top.charles7c.cnadmin.common.model.dto.LogContext;
|
import top.charles7c.cnadmin.common.model.dto.LogContext;
|
||||||
import top.charles7c.cnadmin.common.util.ExceptionUtils;
|
import top.charles7c.cnadmin.common.util.ExceptionUtils;
|
||||||
@ -170,7 +171,8 @@ public class LogInterceptor implements HandlerInterceptor {
|
|||||||
// (本框架代码规范)例如:@Tag(name = "部门管理 API") -> 部门管理
|
// (本框架代码规范)例如:@Tag(name = "部门管理 API") -> 部门管理
|
||||||
if (classTag != null) {
|
if (classTag != null) {
|
||||||
String name = classTag.name();
|
String name = classTag.name();
|
||||||
logDO.setModule(StrUtil.isNotBlank(name) ? name.replace("API", "").trim() : "请在该接口类上指定所属模块");
|
logDO
|
||||||
|
.setModule(StrUtil.isNotBlank(name) ? name.replace("API", StringConsts.EMPTY).trim() : "请在该接口类上指定所属模块");
|
||||||
}
|
}
|
||||||
// 例如:@Log(module = "部门管理") -> 部门管理
|
// 例如:@Log(module = "部门管理") -> 部门管理
|
||||||
if (classLog != null && StrUtil.isNotBlank(classLog.module())) {
|
if (classLog != null && StrUtil.isNotBlank(classLog.module())) {
|
||||||
@ -213,7 +215,7 @@ public class LogInterceptor implements HandlerInterceptor {
|
|||||||
*/
|
*/
|
||||||
private void logRequest(LogDO logDO, HttpServletRequest request) {
|
private void logRequest(LogDO logDO, HttpServletRequest request) {
|
||||||
logDO.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString()
|
logDO.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString()
|
||||||
: request.getRequestURL().append("?").append(request.getQueryString()).toString());
|
: request.getRequestURL().append(StringConsts.QUESTION_MARK).append(request.getQueryString()).toString());
|
||||||
logDO.setRequestMethod(request.getMethod());
|
logDO.setRequestMethod(request.getMethod());
|
||||||
logDO.setRequestHeaders(this.desensitize(ServletUtil.getHeaderMap(request)));
|
logDO.setRequestHeaders(this.desensitize(ServletUtil.getHeaderMap(request)));
|
||||||
String requestBody = this.getRequestBody(request);
|
String requestBody = this.getRequestBody(request);
|
||||||
|
@ -28,6 +28,7 @@ import org.springdoc.api.annotations.ParameterObject;
|
|||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import top.charles7c.cnadmin.common.annotation.Query;
|
import top.charles7c.cnadmin.common.annotation.Query;
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录日志查询条件
|
* 登录日志查询条件
|
||||||
@ -54,6 +55,6 @@ public class LoginLogQuery implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@Schema(description = "登录时间")
|
@Schema(description = "登录时间")
|
||||||
@Query(type = Query.Type.BETWEEN)
|
@Query(type = Query.Type.BETWEEN)
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = StringConsts.NORM_DATE_TIME_PATTERN)
|
||||||
private List<Date> createTime;
|
private List<Date> createTime;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import org.springdoc.api.annotations.ParameterObject;
|
|||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import top.charles7c.cnadmin.common.annotation.Query;
|
import top.charles7c.cnadmin.common.annotation.Query;
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志查询条件
|
* 操作日志查询条件
|
||||||
@ -61,7 +62,7 @@ public class OperationLogQuery implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@Schema(description = "操作时间")
|
@Schema(description = "操作时间")
|
||||||
@Query(type = Query.Type.BETWEEN)
|
@Query(type = Query.Type.BETWEEN)
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = StringConsts.NORM_DATE_TIME_PATTERN)
|
||||||
private List<Date> createTime;
|
private List<Date> createTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,6 +28,7 @@ import org.springdoc.api.annotations.ParameterObject;
|
|||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import top.charles7c.cnadmin.common.annotation.Query;
|
import top.charles7c.cnadmin.common.annotation.Query;
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统日志查询条件
|
* 系统日志查询条件
|
||||||
@ -47,6 +48,6 @@ public class SystemLogQuery implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@Query(type = Query.Type.BETWEEN)
|
@Query(type = Query.Type.BETWEEN)
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = StringConsts.NORM_DATE_TIME_PATTERN)
|
||||||
private List<Date> createTime;
|
private List<Date> createTime;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ public class SaTokenRedisDaoImpl implements SaTokenDao {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> searchData(String prefix, String keyword, int start, int size, boolean sortType) {
|
public List<String> searchData(String prefix, String keyword, int start, int size, boolean sortType) {
|
||||||
Collection<String> keys = RedisUtils.keys(prefix + "*" + keyword + "*");
|
Collection<String> keys = RedisUtils.keys(String.format("%s*%s*", prefix, keyword));
|
||||||
List<String> list = new ArrayList<>(keys);
|
List<String> list = new ArrayList<>(keys);
|
||||||
return SaFoxUtil.searchList(list, start, size, sortType);
|
return SaFoxUtil.searchList(list, start, size, sortType);
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
|||||||
import org.springdoc.api.annotations.ParameterObject;
|
import org.springdoc.api.annotations.ParameterObject;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在线用户查询条件
|
* 在线用户查询条件
|
||||||
*
|
*
|
||||||
@ -50,6 +52,6 @@ public class OnlineUserQuery implements Serializable {
|
|||||||
* 登录时间
|
* 登录时间
|
||||||
*/
|
*/
|
||||||
@Schema(description = "登录时间")
|
@Schema(description = "登录时间")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = StringConsts.NORM_DATE_TIME_PATTERN)
|
||||||
private List<Date> loginTime;
|
private List<Date> loginTime;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import org.springdoc.api.annotations.ParameterObject;
|
|||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import top.charles7c.cnadmin.common.annotation.Query;
|
import top.charles7c.cnadmin.common.annotation.Query;
|
||||||
|
import top.charles7c.cnadmin.common.constant.StringConsts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户查询条件
|
* 用户查询条件
|
||||||
@ -61,7 +62,7 @@ public class UserQuery implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@Query(type = Query.Type.BETWEEN)
|
@Query(type = Query.Type.BETWEEN)
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = StringConsts.NORM_DATE_TIME_PATTERN)
|
||||||
private List<Date> createTime;
|
private List<Date> createTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,13 +38,12 @@ public interface RoleDeptService {
|
|||||||
boolean save(List<Long> deptIds, Long roleId);
|
boolean save(List<Long> deptIds, Long roleId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据角色 ID 查询
|
* 根据角色 ID 删除
|
||||||
*
|
*
|
||||||
* @param roleId
|
* @param roleIds
|
||||||
* 角色 ID
|
* 角色 ID 列表
|
||||||
* @return 部门 ID 列表
|
|
||||||
*/
|
*/
|
||||||
List<Long> listDeptIdByRoleId(Long roleId);
|
void deleteByRoleIds(List<Long> roleIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据部门 ID 删除
|
* 根据部门 ID 删除
|
||||||
@ -55,10 +54,11 @@ public interface RoleDeptService {
|
|||||||
void deleteByDeptIds(List<Long> deptIds);
|
void deleteByDeptIds(List<Long> deptIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据角色 ID 删除
|
* 根据角色 ID 查询
|
||||||
*
|
*
|
||||||
* @param roleIds
|
* @param roleId
|
||||||
* 角色 ID 列表
|
* 角色 ID
|
||||||
|
* @return 部门 ID 列表
|
||||||
*/
|
*/
|
||||||
void deleteByRoleIds(List<Long> roleIds);
|
List<Long> listDeptIdByRoleId(Long roleId);
|
||||||
}
|
}
|
@ -37,6 +37,14 @@ public interface RoleMenuService {
|
|||||||
*/
|
*/
|
||||||
boolean save(List<Long> menuIds, Long roleId);
|
boolean save(List<Long> menuIds, Long roleId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据角色 ID 删除
|
||||||
|
*
|
||||||
|
* @param roleIds
|
||||||
|
* 角色 ID 列表
|
||||||
|
*/
|
||||||
|
void deleteByRoleIds(List<Long> roleIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据角色 ID 查询
|
* 根据角色 ID 查询
|
||||||
*
|
*
|
||||||
@ -45,12 +53,4 @@ public interface RoleMenuService {
|
|||||||
* @return 菜单 ID 列表
|
* @return 菜单 ID 列表
|
||||||
*/
|
*/
|
||||||
List<Long> listMenuIdByRoleIds(List<Long> roleIds);
|
List<Long> listMenuIdByRoleIds(List<Long> roleIds);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据角色 ID 删除
|
|
||||||
*
|
|
||||||
* @param roleIds
|
|
||||||
* 角色 ID 列表
|
|
||||||
*/
|
|
||||||
void deleteByRoleIds(List<Long> roleIds);
|
|
||||||
}
|
}
|
@ -38,13 +38,12 @@ public interface UserRoleService {
|
|||||||
boolean save(List<Long> roleIds, Long userId);
|
boolean save(List<Long> roleIds, Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据角色 ID 列表查询
|
* 根据用户 ID 删除
|
||||||
*
|
*
|
||||||
* @param roleIds
|
* @param userIds
|
||||||
* 角色 ID 列表
|
* 用户 ID 列表
|
||||||
* @return 总记录数
|
|
||||||
*/
|
*/
|
||||||
Long countByRoleIds(List<Long> roleIds);
|
void deleteByUserIds(List<Long> userIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据用户 ID 查询
|
* 根据用户 ID 查询
|
||||||
@ -56,10 +55,11 @@ public interface UserRoleService {
|
|||||||
List<Long> listRoleIdByUserId(Long userId);
|
List<Long> listRoleIdByUserId(Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据用户 ID 删除
|
* 根据角色 ID 列表查询
|
||||||
*
|
*
|
||||||
* @param userIds
|
* @param roleIds
|
||||||
* 用户 ID 列表
|
* 角色 ID 列表
|
||||||
|
* @return 总记录数
|
||||||
*/
|
*/
|
||||||
void deleteByUserIds(List<Long> userIds);
|
Long countByRoleIds(List<Long> roleIds);
|
||||||
}
|
}
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ public class RoleDeptServiceImpl implements RoleDeptService {
|
|||||||
private final RoleDeptMapper roleDeptMapper;
|
private final RoleDeptMapper roleDeptMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean save(List<Long> deptIds, Long roleId) {
|
public boolean save(List<Long> deptIds, Long roleId) {
|
||||||
// 检查是否有变更
|
// 检查是否有变更
|
||||||
List<Long> oldDeptIdList = roleDeptMapper.lambdaQuery().select(RoleDeptDO::getDeptId)
|
List<Long> oldDeptIdList = roleDeptMapper.lambdaQuery().select(RoleDeptDO::getDeptId)
|
||||||
@ -58,17 +60,19 @@ public class RoleDeptServiceImpl implements RoleDeptService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> listDeptIdByRoleId(Long roleId) {
|
@Transactional(rollbackFor = Exception.class)
|
||||||
return roleDeptMapper.selectDeptIdByRoleId(roleId);
|
public void deleteByRoleIds(List<Long> roleIds) {
|
||||||
|
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getRoleId, roleIds).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void deleteByDeptIds(List<Long> deptIds) {
|
public void deleteByDeptIds(List<Long> deptIds) {
|
||||||
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getDeptId, deptIds).remove();
|
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getDeptId, deptIds).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteByRoleIds(List<Long> roleIds) {
|
public List<Long> listDeptIdByRoleId(Long roleId) {
|
||||||
roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getRoleId, roleIds).remove();
|
return roleDeptMapper.selectDeptIdByRoleId(roleId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
|
||||||
@ -43,6 +44,7 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
|||||||
private final RoleMenuMapper roleMenuMapper;
|
private final RoleMenuMapper roleMenuMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean save(List<Long> menuIds, Long roleId) {
|
public boolean save(List<Long> menuIds, Long roleId) {
|
||||||
// 检查是否有变更
|
// 检查是否有变更
|
||||||
List<Long> oldMenuIdList = roleMenuMapper.lambdaQuery().select(RoleMenuDO::getMenuId)
|
List<Long> oldMenuIdList = roleMenuMapper.lambdaQuery().select(RoleMenuDO::getMenuId)
|
||||||
@ -58,6 +60,12 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
|||||||
return roleMenuMapper.insertBatch(roleMenuList);
|
return roleMenuMapper.insertBatch(roleMenuList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void deleteByRoleIds(List<Long> roleIds) {
|
||||||
|
roleMenuMapper.lambdaUpdate().in(RoleMenuDO::getRoleId, roleIds).remove();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> listMenuIdByRoleIds(List<Long> roleIds) {
|
public List<Long> listMenuIdByRoleIds(List<Long> roleIds) {
|
||||||
if (CollUtil.isEmpty(roleIds)) {
|
if (CollUtil.isEmpty(roleIds)) {
|
||||||
@ -65,9 +73,4 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
|||||||
}
|
}
|
||||||
return roleMenuMapper.selectMenuIdByRoleIds(roleIds);
|
return roleMenuMapper.selectMenuIdByRoleIds(roleIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteByRoleIds(List<Long> roleIds) {
|
|
||||||
roleMenuMapper.lambdaUpdate().in(RoleMenuDO::getRoleId, roleIds).remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import java.util.stream.Collectors;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ public class UserRoleServiceImpl implements UserRoleService {
|
|||||||
private final UserRoleMapper userRoleMapper;
|
private final UserRoleMapper userRoleMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean save(List<Long> roleIds, Long userId) {
|
public boolean save(List<Long> roleIds, Long userId) {
|
||||||
// 检查是否有变更
|
// 检查是否有变更
|
||||||
List<Long> oldRoleIdList = userRoleMapper.lambdaQuery().select(UserRoleDO::getRoleId)
|
List<Long> oldRoleIdList = userRoleMapper.lambdaQuery().select(UserRoleDO::getRoleId)
|
||||||
@ -58,8 +60,9 @@ public class UserRoleServiceImpl implements UserRoleService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long countByRoleIds(List<Long> roleIds) {
|
@Transactional(rollbackFor = Exception.class)
|
||||||
return userRoleMapper.lambdaQuery().in(UserRoleDO::getRoleId, roleIds).count();
|
public void deleteByUserIds(List<Long> userIds) {
|
||||||
|
userRoleMapper.lambdaUpdate().in(UserRoleDO::getUserId, userIds).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -68,7 +71,7 @@ public class UserRoleServiceImpl implements UserRoleService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteByUserIds(List<Long> userIds) {
|
public Long countByRoleIds(List<Long> roleIds) {
|
||||||
userRoleMapper.lambdaUpdate().in(UserRoleDO::getUserId, userIds).remove();
|
return userRoleMapper.lambdaQuery().in(UserRoleDO::getRoleId, roleIds).count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void updateBasicInfo(UpdateBasicInfoRequest request, Long id) {
|
public void updateBasicInfo(UpdateBasicInfoRequest request, Long id) {
|
||||||
super.getById(id);
|
super.getById(id);
|
||||||
baseMapper.lambdaUpdate().set(UserDO::getNickname, request.getNickname())
|
baseMapper.lambdaUpdate().set(UserDO::getNickname, request.getNickname())
|
||||||
@ -219,6 +220,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void resetPassword(Long id) {
|
public void resetPassword(Long id) {
|
||||||
UserDO user = super.getById(id);
|
UserDO user = super.getById(id);
|
||||||
user.setPassword(SecureUtils.md5Salt(SysConsts.DEFAULT_PASSWORD, id.toString()));
|
user.setPassword(SecureUtils.md5Salt(SysConsts.DEFAULT_PASSWORD, id.toString()));
|
||||||
@ -227,6 +229,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void updateRole(UpdateUserRoleRequest request, Long id) {
|
public void updateRole(UpdateUserRoleRequest request, Long id) {
|
||||||
super.getById(id);
|
super.getById(id);
|
||||||
// 保存用户和角色关联
|
// 保存用户和角色关联
|
||||||
|
@ -84,7 +84,8 @@ public class UserCenterController {
|
|||||||
String rawNewPassword =
|
String rawNewPassword =
|
||||||
ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updatePasswordRequest.getNewPassword()));
|
ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updatePasswordRequest.getNewPassword()));
|
||||||
ValidationUtils.throwIfBlank(rawNewPassword, "新密码解密失败");
|
ValidationUtils.throwIfBlank(rawNewPassword, "新密码解密失败");
|
||||||
ValidationUtils.throwIf(!ReUtil.isMatch(RegexConsts.PASSWORD, rawNewPassword), "密码长度 6 到 32 位,同时包含字母和数字");
|
ValidationUtils.throwIf(!ReUtil.isMatch(RegexConsts.PASSWORD, rawNewPassword),
|
||||||
|
"密码长度为 6 到 32 位,可以包含字母、数字、下划线,特殊字符,同时包含字母和数字");
|
||||||
|
|
||||||
// 修改密码
|
// 修改密码
|
||||||
userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId());
|
userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId());
|
||||||
|
Loading…
Reference in New Issue
Block a user