12 Commits

Author SHA1 Message Date
3738fa4872 Merge branch 'dev' into 2.0.x
# Conflicts:
#	continew-admin-common/src/main/java/top/charles7c/cnadmin/common/model/query/SortQuery.java
#	continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/LoginLogQuery.java
#	continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/OperationLogQuery.java
#	continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/SystemLogQuery.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/query/OnlineUserQuery.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/DeptQuery.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/MenuQuery.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/RoleQuery.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/UserQuery.java
2023-04-13 22:36:57 +08:00
0f2f35d608 Merge branch 'dev' into 2.0.x
# Conflicts:
#	README.md
2023-04-03 21:37:38 +08:00
cf3044312c style: 适配 Java 16 新特性
1.instanceof 模式匹配(Java 14 预览特性 => Java 16 标准特性)
详情请参阅:https://docs.oracle.com/en/java/javase/16/language/pattern-matching-instanceof-operator.html
2023-03-31 23:08:50 +08:00
38f52aaafa style: 适配 Java 14 新特性
1.增强 switch(Java 12 预览特性 => Java 14 标准特性)
详情请参阅:https://docs.oracle.com/en/java/javase/14/language/switch-expressions.html
2.@Serial(类似于 @Override 的检查注解,用于检查序列化)
2023-03-31 23:00:57 +08:00
5a5bd1681e style: 适配 Java 11 新 API
1.对 Optional 的 isPresent() 取反用法 => isEmpty()
2.集合 toArray(new String[0]) 用法 => toArray(String[]::new)
2023-03-31 22:46:14 +08:00
74e61a0111 style: 优化 Redis 配置写法 2023-03-31 22:33:03 +08:00
7dda38d2b8 Merge branch 'dev' into 2.0.x
# Conflicts:
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java
#	continew-admin-webapi/src/main/resources/application.yml
2023-03-31 22:22:50 +08:00
95c27ea323 chore: Spring Boot 3.0.3 => 3.0.5
1.Spring Boot 3.0.3 => 3.0.5
2.Sa-Token 适配 Spring Boot 3.x
2023-03-31 00:08:07 +08:00
40e11a7a25 fix: 修复部分配置错误 2023-03-30 23:40:30 +08:00
0aafcc015c Merge branch 'pr_2' into 2.0.x
# Conflicts:
#	continew-admin-common/pom.xml
#	continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java
#	continew-admin-common/src/main/java/top/charles7c/cnadmin/common/util/helper/LoginHelper.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/MenuRequest.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateBasicInfoRequest.java
#	continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java
#	pom.xml
2023-03-30 22:59:43 +08:00
65401d0219 chore: 1.1.0-SNAPSHOT => 2.0.0-SNAPSHOT 2023-03-30 22:52:04 +08:00
dlj
dea160a7b2 chore: Spring Boot 2.7.8 => 3.0.3
1.Spring Boot 2.7.8 => 3.0.3
2.Knife4j 适配 Spring Boot 3.x
3.ServletUtil => JakartaServletUtil
4.javax.* => jakarta.*
2023-03-30 22:28:02 +08:00
84 changed files with 270 additions and 180 deletions

View File

@@ -4,7 +4,7 @@
<img src="https://img.shields.io/badge/License-Apache--2.0-blue.svg" alt="License" />
</a>
<a href="https://github.com/Charles7c/continew-admin/tree/1.0.x" target="_blank">
<img src="https://img.shields.io/badge/SNAPSHOT-v1.1.0-%23ff3f59.svg" alt="Release" />
<img src="https://img.shields.io/badge/SNAPSHOT-v2.0.0-%23ff3f59.svg" alt="Release" />
</a>
<a href="https://github.com/Charles7c/continew-admin" target="_blank">
<img src="https://img.shields.io/github/stars/Charles7c/continew-admin?style=social" alt="GitHub stars" />
@@ -19,7 +19,7 @@
<img src="https://gitee.com/Charles7c/continew-admin/badge/fork.svg?theme=white" alt="Gitee forks" />
</a>
📚 [在线文档](https://doc.charles7c.top) | ✨ [提交需求](https://doc.charles7c.top/require) | 🚀 [演示地址](https://cnadmin.charles7c.top)(账号/密码admin/admin123
📚 <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
## 简介
@@ -255,28 +255,28 @@ continew-admin
## 技术栈
| 名称 | 版本 | 简介 |
| :----------------------------------------------------------- | :----------- | :----------------------------------------------------------- |
| <a href="https://cn.vuejs.org/" target="_blank">Vue</a> | 3.2.47 | 渐进式 JavaScript 框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 |
| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 4.9.5 | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design Vue</a> | 2.44.5 | 字节跳动推出的前端 UI 框架,样式美观,组件丰富。 |
| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 2.7.10 | 简化新 Spring 应用的初始搭建以及开发过程。 |
| <a href="https://undertow.io/" target="_blank">Undertow</a> | 2.2.23.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.34.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 |
| <a href="https://mariadb.org/" target="_blank">MariaDB</a> | 10.10.2 | MySQL 的一个分支,主要由开源社区在维护,完全兼容 MySQL包括 API 和命令行,能轻松成为 MySQL 的代替品。 |
| <a href="https://baomidou.com/" target="_blank">MyBatis Plus</a> | 3.5.3.1 | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 |
| <a href="https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611" target="_blank">dynamic-datasource-spring-boot-starter</a> | 3.6.1 | 基于 Spring Boot 的快速集成多数据源的启动器。 |
| Hikari | 4.0.3 | JDBC 连接池,号称 “史上最快连接池”SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 |
| <a href="https://dev.mysql.com/doc/connector-j/8.0/en/" target="_blank">mysql-connector-j</a> | 8.0.32 | MySQL Java 驱动。 |
| <a href="https://github.com/p6spy/p6spy" target="_blank">P6Spy</a> | 3.9.1 | SQL 性能分析组件。 |
| <a href="https://github.com/liquibase/liquibase" target="_blank">Liquibase</a> | 4.9.1 | 用于管理数据库版本,跟踪、管理和应用数据库变化。 |
| <a href="https://redis.io/" target="_blank">Redis</a> | 6.2.7 | 高性能的 key-value 数据库。 |
| <a href="https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D" target="_blank">Redisson</a> | 3.20.0 | 不仅仅是一个 Redis Java 客户端,同其他 Redis Java 客户端有着很大的区别,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动层面上,比如仅针对 Redis 提供连接方式,发送命令和处理返回结果等。而 Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 |
| <a href="https://easyexcel.opensource.alibaba.com/" target="_blank">Easy Excel</a> | 3.2.1 | 一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。 |
| Easy Captcha | 1.6.2 | Java 图形验证码,支持 gif、中文、算术等类型可用于 Java Web、JavaSE 等项目。 |
| <a href="https://doc.xiaominfo.com/" target="_blank">Knife4j</a> | 4.1.0 | 前身是 swagger-bootstrap-ui集 Swagger2 和 OpenAPI3 为一体的增强解决方案。本项目使用的是 <a href="https://gitee.com/xiaoym/swagger-bootstrap-ui-demo/tree/master/knife4j-springdoc-openapi-demo" target="_blank">knife4j-openapi3-spring-boot-starter</a> 基于 OpenAPI3 规范,在 Spring Boot < 3.0.0-M1 的单体架构下可以直接引用此 starter该模块包含了 UI 部分底层基于 springdoc-openapi 项目 |
| <a href="https://www.hutool.cn/" target="_blank">Hutool</a> | 5.8.16 | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 |
| <a href="https://projectlombok.org/" target="_blank">Lombok</a> | 1.18.26 | 在 Java 开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码,让编写的类更加简洁。 |
| 名称 | 版本 | 简介 |
| :----------------------------------------------------------- | :---------- | :----------------------------------------------------------- |
| <a href="https://cn.vuejs.org/" target="_blank">Vue</a> | 3.2.47 | 渐进式 JavaScript 框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 |
| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 4.9.5 | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design Vue</a> | 2.44.5 | 字节跳动推出的前端 UI 框架,样式美观,组件丰富。 |
| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.0.5 | 简化新 Spring 应用的初始搭建以及开发过程。 |
| <a href="https://undertow.io/" target="_blank">Undertow</a> | 2.3.4.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.34.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 |
| <a href="https://mariadb.org/" target="_blank">MariaDB</a> | 10.10.2 | MySQL 的一个分支,主要由开源社区在维护,完全兼容 MySQL包括 API 和命令行,能轻松成为 MySQL 的代替品。 |
| <a href="https://baomidou.com/" target="_blank">MyBatis Plus</a> | 3.5.3.1 | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 |
| <a href="https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611" target="_blank">dynamic-datasource-spring-boot-starter</a> | 3.6.1 | 基于 Spring Boot 的快速集成多数据源的启动器。 |
| Hikari | 5.0.1 | JDBC 连接池,号称 “史上最快连接池”SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 |
| <a href="https://dev.mysql.com/doc/connector-j/8.0/en/" target="_blank">mysql-connector-j</a> | 8.0.32 | MySQL Java 驱动。 |
| <a href="https://github.com/p6spy/p6spy" target="_blank">P6Spy</a> | 3.9.1 | SQL 性能分析组件。 |
| <a href="https://github.com/liquibase/liquibase" target="_blank">Liquibase</a> | 4.17.2 | 用于管理数据库版本,跟踪、管理和应用数据库变化。 |
| <a href="https://redis.io/" target="_blank">Redis</a> | 6.2.7 | 高性能的 key-value 数据库。 |
| <a href="https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D" target="_blank">Redisson</a> | 3.20.0 | 不仅仅是一个 Redis Java 客户端,同其他 Redis Java 客户端有着很大的区别,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动层面上,比如仅针对 Redis 提供连接方式,发送命令和处理返回结果等。而 Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 |
| <a href="https://easyexcel.opensource.alibaba.com/" target="_blank">Easy Excel</a> | 3.2.1 | 一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。 |
| Easy Captcha | 1.6.2 | Java 图形验证码,支持 gif、中文、算术等类型可用于 Java Web、JavaSE 等项目。 |
| <a href="https://doc.xiaominfo.com/" target="_blank">Knife4j</a> | 4.1.0 | 前身是 swagger-bootstrap-ui集 Swagger2 和 OpenAPI3 为一体的增强解决方案。本项目使用的是 knife4j-openapi3-jakarta-spring-boot-starter 基于 OpenAPI3 规范,在 Spring Boot >= 3.0.0-M1 的单体架构下可以直接引用此 starter该模块包含了 Ui 部分,底层基于 springdoc-openapi 项目。 |
| <a href="https://www.hutool.cn/" target="_blank">Hutool</a> | 5.8.16 | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 |
| <a href="https://projectlombok.org/" target="_blank">Lombok</a> | 1.18.26 | 在 Java 开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码,让编写的类更加简洁。 |
## 部分系统截图

View File

@@ -80,7 +80,7 @@ limitations under the License.
<!-- Sa-Token轻量级 Java 权限认证框架,让鉴权变得简单、优雅) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
</dependency>
<!-- Sa-Token 整合 JWT -->
@@ -130,7 +130,7 @@ limitations under the License.
<!-- Knife4j前身是 swagger-bootstrap-ui集 Swagger2 和 OpenAPI3 为一体的增强解决方案) -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
<!-- Redisson不仅仅是一个 Redis Java 客户端) -->

View File

@@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.base;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import lombok.NoArgsConstructor;

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.base;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -34,6 +35,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
@Data
public class BaseDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.base;
import java.io.Serial;
import java.time.LocalDateTime;
import lombok.Data;
@@ -34,6 +35,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
@Data
public class BaseDetailVO extends BaseVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,9 +16,10 @@
package top.charles7c.cnadmin.common.base;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.groups.Default;
import jakarta.validation.groups.Default;
import lombok.Data;
@@ -31,6 +32,7 @@ import lombok.Data;
@Data
public class BaseRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -18,7 +18,7 @@ package top.charles7c.cnadmin.common.base;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import cn.hutool.core.lang.tree.Tree;

View File

@@ -20,7 +20,7 @@ import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
@@ -217,8 +217,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseDO,
* 待填充列表信息
*/
protected void fill(Object baseObj) {
if (baseObj instanceof BaseVO) {
BaseVO baseVO = (BaseVO)baseObj;
if (baseObj instanceof BaseVO baseVO) {
Long createUser = baseVO.getCreateUser();
if (createUser == null) {
return;
@@ -235,8 +234,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseDO,
* 待填充详情信息
*/
protected void fillDetail(Object detailObj) {
if (detailObj instanceof BaseDetailVO) {
BaseDetailVO detailVO = (BaseDetailVO)detailObj;
if (detailObj instanceof BaseDetailVO detailVO) {
this.fill(detailVO);
Long updateUser = detailVO.getUpdateUser();

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.base;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -36,6 +37,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
@Data
public class BaseVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -60,9 +60,8 @@ public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {
Long createUser = LoginHelper.getUserId();
LocalDateTime createTime = LocalDateTime.now();
if (metaObject.getOriginalObject() instanceof BaseDO) {
if (metaObject.getOriginalObject()instanceof BaseDO baseDO) {
// 继承了 BaseDO 的类,填充创建信息
BaseDO baseDO = (BaseDO)metaObject.getOriginalObject();
baseDO.setCreateUser(ObjectUtil.defaultIfNull(baseDO.getCreateUser(), createUser));
baseDO.setCreateTime(ObjectUtil.defaultIfNull(baseDO.getCreateTime(), createTime));
baseDO.setUpdateUser(ObjectUtil.defaultIfNull(baseDO.getUpdateUser(), createUser));
@@ -94,9 +93,8 @@ public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {
Long updateUser = LoginHelper.getUserId();
LocalDateTime updateTime = LocalDateTime.now();
if (metaObject.getOriginalObject() instanceof BaseDO) {
if (metaObject.getOriginalObject()instanceof BaseDO baseDO) {
// 继承了 BaseDO 的类,填充修改信息
BaseDO baseDO = (BaseDO)metaObject.getOriginalObject();
baseDO.setUpdateUser(updateUser);
baseDO.setUpdateTime(updateTime);
} else {

View File

@@ -16,20 +16,19 @@
package top.charles7c.cnadmin.common.handler;
import static top.charles7c.cnadmin.common.annotation.CrudRequestMapping.Api;
import java.lang.reflect.Method;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.web.util.pattern.PathPatternParser;
import top.charles7c.cnadmin.common.annotation.CrudRequestMapping;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import java.lang.reflect.Method;
import static top.charles7c.cnadmin.common.annotation.CrudRequestMapping.Api;
/**
* CRUD 请求映射器处理器映射器
*
@@ -55,7 +54,14 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi
// 拼接路径前缀(合并了 @RequestMapping 的部分能力)
String pathPrefix = crudRequestMapping.value();
if (StrUtil.isNotBlank(pathPrefix)) {
requestMappingInfo = RequestMappingInfo.paths(pathPrefix).build().combine(requestMappingInfo);
/*
* 问题RequestMappingInfo.paths(pathPrefix) 返回的 RequestMappingInfo 对象里 pathPatternsCondition = null
* 导致 combine() 方法抛出断言异常! 修复:创建 options 对象,并设置 PatternParser
*/
RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration();
options.setPatternParser(PathPatternParser.defaultInstance);
requestMappingInfo =
RequestMappingInfo.paths(pathPrefix).options(options).build().combine(requestMappingInfo);
}
// 过滤 API

View File

@@ -18,9 +18,9 @@ package top.charles7c.cnadmin.common.handler;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
@@ -184,18 +184,11 @@ public class GlobalExceptionHandler {
@ExceptionHandler(NotLoginException.class)
public R handleNotLoginException(NotLoginException e, HttpServletRequest request) {
log.error("请求地址 [{}],认证失败,无法访问系统资源。", request.getRequestURI(), e);
String errorMsg;
switch (e.getType()) {
case NotLoginException.KICK_OUT:
errorMsg = "您已被踢下线";
break;
case NotLoginException.BE_REPLACED_MESSAGE:
errorMsg = "您已被顶下线";
break;
default:
errorMsg = "登录状态已过期,请重新登录";
break;
}
String errorMsg = switch (e.getType()) {
case NotLoginException.KICK_OUT -> "您已被踢下线";
case NotLoginException.BE_REPLACED_MESSAGE -> "您已被顶下线";
default -> "登录状态已过期,请重新登录";
};
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.UNAUTHORIZED.value(), errorMsg);
}

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.dto;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -30,6 +31,7 @@ import lombok.Data;
@Data
public class LogContext implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.dto;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Set;
@@ -35,6 +36,7 @@ import top.charles7c.cnadmin.common.constant.SysConsts;
@Data
public class LoginUser implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.dto;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -31,6 +32,7 @@ import top.charles7c.cnadmin.common.enums.DataScopeEnum;
@Data
public class RoleDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,7 +16,9 @@
package top.charles7c.cnadmin.common.model.query;
import javax.validation.constraints.Min;
import java.io.Serial;
import jakarta.validation.constraints.Min;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -24,7 +26,7 @@ import lombok.NoArgsConstructor;
import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.validator.constraints.Range;
import org.springdoc.api.annotations.ParameterObject;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Sort;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -46,6 +48,7 @@ import cn.hutool.core.util.StrUtil;
@Schema(description = "分页查询条件")
public class PageQuery extends SortQuery {
@Serial
private static final long serialVersionUID = 1L;
/** 默认页码1 */
private static final int DEFAULT_PAGE = 1;

View File

@@ -16,9 +16,10 @@
package top.charles7c.cnadmin.common.model.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@@ -36,6 +37,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "修改状态信息")
public class UpdateStatusRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "验证码信息")
public class CaptchaVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -37,6 +38,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "键值对信息")
public class LabelValueVO<V> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.vo;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -43,6 +44,7 @@ import cn.hutool.core.collection.CollUtil;
@Schema(description = "分页信息")
public class PageDataVO<V> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.common.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.AccessLevel;
@@ -37,6 +38,7 @@ import org.springframework.http.HttpStatus;
@Schema(description = "响应信息")
public class R<V> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 是否成功 */

View File

@@ -19,7 +19,7 @@ package top.charles7c.cnadmin.common.util;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

View File

@@ -46,9 +46,8 @@ public class ExceptionUtils {
* 异常
*/
public static void printException(Runnable runnable, Throwable throwable) {
if (throwable == null && runnable instanceof Future<?>) {
if (throwable == null && runnable instanceof Future<?> future) {
try {
Future<?> future = (Future<?>)runnable;
if (future.isDone()) {
future.get();
}

View File

@@ -22,8 +22,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.AccessLevel;
import lombok.Data;
@@ -200,14 +200,14 @@ public class MailUtils {
// 设置收信人
// 抄送人
if (CollUtil.isNotEmpty(ccs)) {
messageHelper.setCc(ccs.toArray(new String[0]));
messageHelper.setCc(ccs.toArray(String[]::new));
}
// 密送人
if (CollUtil.isNotEmpty(bccs)) {
messageHelper.setBcc(bccs.toArray(new String[0]));
messageHelper.setBcc(bccs.toArray(String[]::new));
}
// 收件人
messageHelper.setTo(tos.toArray(new String[0]));
messageHelper.setTo(tos.toArray(String[]::new));
// 设置附件
if (ArrayUtil.isNotEmpty(files)) {

View File

@@ -18,8 +18,8 @@ package top.charles7c.cnadmin.common.util;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

View File

@@ -18,14 +18,14 @@ package top.charles7c.cnadmin.common.util.helper;
import java.time.LocalDateTime;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import cn.hutool.extra.spring.SpringUtil;
import top.charles7c.cnadmin.common.constant.CacheConsts;
@@ -60,7 +60,7 @@ public class LoginHelper {
// 记录登录信息
HttpServletRequest request = ServletUtils.getRequest();
loginUser.setClientIp(ServletUtil.getClientIP(request));
loginUser.setClientIp(JakartaServletUtil.getClientIP(request));
loginUser.setLocation(IpUtils.getCityInfo(loginUser.getClientIp()));
loginUser.setBrowser(ServletUtils.getBrowser(request));
LogContext logContext = LogContextHolder.get();

View File

@@ -83,7 +83,7 @@ public class QueryHelper {
* 查询数据类型
*/
private static <Q, R> void buildQuery(Q query, Field field, QueryWrapper<R> queryWrapper) {
boolean accessible = field.isAccessible();
boolean accessible = field.canAccess(null);
try {
field.setAccessible(true);
// 没有 @Query直接返回
@@ -144,57 +144,34 @@ public class QueryHelper {
String columnName = StrUtil.toUnderlineCase(fieldName);
Query.Type queryType = queryAnnotation.type();
switch (queryType) {
case EQUAL:
queryWrapper.eq(columnName, fieldValue);
break;
case NOT_EQUAL:
queryWrapper.ne(columnName, fieldValue);
break;
case GREATER_THAN:
queryWrapper.gt(columnName, fieldValue);
break;
case LESS_THAN:
queryWrapper.lt(columnName, fieldValue);
break;
case GREATER_THAN_OR_EQUAL:
queryWrapper.ge(columnName, fieldValue);
break;
case LESS_THAN_OR_EQUAL:
queryWrapper.le(columnName, fieldValue);
break;
case BETWEEN:
case EQUAL -> queryWrapper.eq(columnName, fieldValue);
case NOT_EQUAL -> queryWrapper.ne(columnName, fieldValue);
case GREATER_THAN -> queryWrapper.gt(columnName, fieldValue);
case LESS_THAN -> queryWrapper.lt(columnName, fieldValue);
case GREATER_THAN_OR_EQUAL -> queryWrapper.ge(columnName, fieldValue);
case LESS_THAN_OR_EQUAL -> queryWrapper.le(columnName, fieldValue);
case BETWEEN -> {
List<Object> between = new ArrayList<>((List<Object>)fieldValue);
if (between.size() >= 2) {
queryWrapper.between(columnName, between.get(0), between.get(1));
}
break;
case LEFT_LIKE:
queryWrapper.likeLeft(columnName, fieldValue);
break;
case INNER_LIKE:
queryWrapper.like(columnName, fieldValue);
break;
case RIGHT_LIKE:
queryWrapper.likeRight(columnName, fieldValue);
break;
case IN:
}
case LEFT_LIKE -> queryWrapper.likeLeft(columnName, fieldValue);
case INNER_LIKE -> queryWrapper.like(columnName, fieldValue);
case RIGHT_LIKE -> queryWrapper.likeRight(columnName, fieldValue);
case IN -> {
if (CollUtil.isNotEmpty((List<Object>)fieldValue)) {
queryWrapper.in(columnName, (List<Object>)fieldValue);
}
break;
case NOT_IN:
}
case NOT_IN -> {
if (CollUtil.isNotEmpty((List<Object>)fieldValue)) {
queryWrapper.notIn(columnName, (List<Object>)fieldValue);
}
break;
case IS_NULL:
queryWrapper.isNull(columnName);
break;
case IS_NOT_NULL:
queryWrapper.isNotNull(columnName);
break;
default:
throw new IllegalArgumentException(String.format("暂不支持 [%s] 查询类型", queryType));
}
case IS_NULL -> queryWrapper.isNull(columnName);
case IS_NOT_NULL -> queryWrapper.isNotNull(columnName);
default -> throw new IllegalArgumentException(String.format("暂不支持 [%s] 查询类型", queryType));
}
}
}

View File

@@ -19,10 +19,10 @@ package top.charles7c.cnadmin.monitor.filter;
import java.io.IOException;
import java.util.Objects;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.Ordered;
import org.springframework.lang.NonNull;

View File

@@ -19,8 +19,8 @@ package top.charles7c.cnadmin.monitor.interceptor;
import java.time.LocalDateTime;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -41,7 +41,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
@@ -217,13 +217,13 @@ public class LogInterceptor implements HandlerInterceptor {
logDO.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString()
: request.getRequestURL().append(StringConsts.QUESTION_MARK).append(request.getQueryString()).toString());
logDO.setRequestMethod(request.getMethod());
logDO.setRequestHeaders(this.desensitize(ServletUtil.getHeaderMap(request)));
logDO.setRequestHeaders(this.desensitize(JakartaServletUtil.getHeaderMap(request)));
String requestBody = this.getRequestBody(request);
if (StrUtil.isNotBlank(requestBody)) {
logDO.setRequestBody(this.desensitize(
JSONUtil.isTypeJSON(requestBody) ? JSONUtil.parseObj(requestBody) : ServletUtil.getParamMap(request)));
logDO.setRequestBody(this.desensitize(JSONUtil.isTypeJSON(requestBody) ? JSONUtil.parseObj(requestBody)
: JakartaServletUtil.getParamMap(request)));
}
logDO.setClientIp(ServletUtil.getClientIP(request));
logDO.setClientIp(JakartaServletUtil.getClientIP(request));
logDO.setLocation(IpUtils.getCityInfo(logDO.getClientIp()));
logDO.setBrowser(ServletUtils.getBrowser(request));
logDO.setCreateUser(ObjectUtil.defaultIfNull(logDO.getCreateUser(), LoginHelper.getUserId()));
@@ -245,7 +245,7 @@ public class LogInterceptor implements HandlerInterceptor {
private void logResponse(LogDO logDO, HttpServletResponse response) {
int status = response.getStatus();
logDO.setStatusCode(status);
logDO.setResponseHeaders(this.desensitize(ServletUtil.getHeadersMap(response)));
logDO.setResponseHeaders(this.desensitize(JakartaServletUtil.getHeadersMap(response)));
// 响应体(不记录非 JSON 响应数据)
String responseBody = this.getResponseBody(response);
if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) {
@@ -330,7 +330,7 @@ public class LogInterceptor implements HandlerInterceptor {
}
// 2、检查是否需要记录内网 IP 操作
boolean isInnerIp = IpUtils.isInnerIp(ServletUtil.getClientIP(request));
boolean isInnerIp = IpUtils.isInnerIp(JakartaServletUtil.getClientIP(request));
if (isInnerIp && Boolean.FALSE.equals(operationLogProperties.getIncludeInnerIp())) {
return false;
}

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.monitor.model.entity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -36,6 +37,7 @@ import top.charles7c.cnadmin.monitor.enums.LogStatusEnum;
@TableName("sys_log")
public class LogDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.monitor.model.query;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
@Schema(description = "登录日志查询条件")
public class LoginLogQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.monitor.model.query;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
@Schema(description = "操作日志查询条件")
public class OperationLogQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.monitor.model.query;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
@Schema(description = "系统日志查询条件")
public class SystemLogQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -34,6 +35,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
@Data
public class LogVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serial;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -32,6 +34,7 @@ import top.charles7c.cnadmin.monitor.enums.LogStatusEnum;
@Schema(description = "登录日志信息")
public class LoginLogVO extends LogVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serial;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -32,6 +34,7 @@ import top.charles7c.cnadmin.monitor.enums.LogStatusEnum;
@Schema(description = "操作日志信息")
public class OperationLogVO extends LogVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serial;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -30,6 +32,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "系统日志详情信息")
public class SystemLogDetailVO extends LogVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.monitor.model.vo;
import java.io.Serial;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -30,6 +32,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "系统日志信息")
public class SystemLogVO extends LogVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.query;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -38,6 +39,7 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
@Schema(description = "在线用户查询条件")
public class OnlineUserQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,9 +16,10 @@
package top.charles7c.cnadmin.auth.model.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "登录信息")
public class LoginRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "令牌信息")
public class LoginVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "元数据信息")
public class MetaVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.vo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -33,6 +34,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "在线用户信息")
public class OnlineUserVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.vo;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@@ -38,6 +39,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class RouteVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.auth.model.vo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -43,6 +44,7 @@ import top.charles7c.cnadmin.common.enums.GenderEnum;
@Schema(description = "用户信息")
public class UserInfoVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -34,6 +36,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@TableName("sys_dept")
public class DeptDO extends BaseDO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -34,6 +36,7 @@ import top.charles7c.cnadmin.common.enums.MenuTypeEnum;
@TableName("sys_menu")
public class MenuDO extends BaseDO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -35,6 +37,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@TableName("sys_role")
public class RoleDO extends BaseDO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
@TableName("sys_role_dept")
public class RoleDeptDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
@TableName("sys_role_menu")
public class RoleMenuDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import java.time.LocalDateTime;
import lombok.Data;
@@ -37,6 +38,7 @@ import top.charles7c.cnadmin.common.enums.GenderEnum;
@TableName("sys_user")
public class UserDO extends BaseDO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.entity;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
@TableName("sys_user_role")
public class UserRoleDO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.query;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import top.charles7c.cnadmin.common.annotation.Query;
@Schema(description = "部门查询条件")
public class DeptQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.query;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import top.charles7c.cnadmin.common.annotation.Query;
@Schema(description = "菜单查询条件")
public class MenuQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.query;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import top.charles7c.cnadmin.common.annotation.Query;
@Schema(description = "角色查询条件")
public class RoleQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.query;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.constant.StringConsts;
@Schema(description = "用户查询条件")
public class UserQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,9 +16,11 @@
package top.charles7c.cnadmin.system.model.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serial;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -40,6 +42,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "创建或修改部门信息")
public class DeptRequest extends BaseRequest {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,9 +16,11 @@
package top.charles7c.cnadmin.system.model.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serial;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -39,6 +41,7 @@ import top.charles7c.cnadmin.common.enums.MenuTypeEnum;
@Schema(description = "创建或修改菜单信息")
public class MenuRequest extends BaseRequest {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,12 +16,13 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -44,6 +45,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "创建或修改角色信息")
public class RoleRequest extends BaseRequest {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,11 +16,12 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.enums.GenderEnum;
@Schema(description = "修改基础信息")
public class UpdateBasicInfoRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,10 +16,11 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -39,6 +40,7 @@ import top.charles7c.cnadmin.common.constant.RegexConsts;
@Schema(description = "修改邮箱信息")
public class UpdateEmailRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,9 +16,10 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "修改密码信息")
public class UpdatePasswordRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,10 +16,11 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import javax.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
@@ -35,6 +36,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "修改用户角色信息")
public class UpdateUserRoleRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,12 +16,13 @@
package top.charles7c.cnadmin.system.model.request;
import java.io.Serial;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@@ -44,6 +45,7 @@ import top.charles7c.cnadmin.common.enums.GenderEnum;
@Schema(description = "创建或修改用户信息")
public class UserRequest extends BaseRequest {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
@@ -34,6 +35,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "头像信息")
public class AvatarVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -40,6 +42,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "部门详情信息")
public class DeptDetailVO extends BaseDetailVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -38,6 +40,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "部门信息")
public class DeptVO extends BaseVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -43,6 +45,7 @@ import top.charles7c.cnadmin.common.enums.MenuTypeEnum;
@Schema(description = "菜单信息")
public class MenuVO extends BaseVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import java.util.List;
import lombok.Data;
@@ -42,6 +43,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "角色详情信息")
public class RoleDetailVO extends BaseDetailVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,8 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -37,6 +39,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@Schema(description = "角色信息")
public class RoleVO extends BaseVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@@ -45,6 +46,7 @@ import top.charles7c.cnadmin.common.util.helper.LoginHelper;
@Schema(description = "用户详情信息")
public class UserDetailVO extends BaseDetailVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -16,6 +16,7 @@
package top.charles7c.cnadmin.system.model.vo;
import java.io.Serial;
import java.util.Objects;
import lombok.Data;
@@ -42,6 +43,7 @@ import top.charles7c.cnadmin.common.util.helper.LoginHelper;
@Schema(description = "用户信息")
public class UserVO extends BaseVO {
@Serial
private static final long serialVersionUID = 1L;
/**

View File

@@ -21,7 +21,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
@@ -131,8 +131,7 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
@Override
public void fillDetail(Object detailObj) {
super.fillDetail(detailObj);
if (detailObj instanceof DeptDetailVO) {
DeptDetailVO detailVO = (DeptDetailVO)detailObj;
if (detailObj instanceof DeptDetailVO detailVO) {
if (Objects.equals(SysConsts.SUPER_PARENT_ID, detailVO.getParentId())) {
return;
}

View File

@@ -137,8 +137,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
@Override
public void fillDetail(Object detailObj) {
super.fillDetail(detailObj);
if (detailObj instanceof RoleDetailVO) {
RoleDetailVO detailVO = (RoleDetailVO)detailObj;
if (detailObj instanceof RoleDetailVO detailVO) {
Long roleId = detailVO.getId();
if (SysConsts.ADMIN_ROLE_CODE.equals(detailVO.getCode())) {
List<MenuVO> list = menuService.list(null, null);

View File

@@ -22,7 +22,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Optional;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
@@ -147,8 +147,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
@Override
public void fillDetail(Object detailObj) {
super.fillDetail(detailObj);
if (detailObj instanceof UserDetailVO) {
UserDetailVO detailVO = (UserDetailVO)detailObj;
if (detailObj instanceof UserDetailVO detailVO) {
detailVO.setDeptName(ExceptionUtils.exToNull(() -> deptService.get(detailVO.getDeptId()).getName()));
List<Long> roleIdList = userRoleService.listRoleIdByUserId(detailVO.getId());
detailVO.setRoleIds(roleIdList);

View File

@@ -1,7 +1,7 @@
{
"name": "continew-admin-ui",
"description": "ContiNew Admin 中后台管理框架Continue New Admin持续以最新流行技术栈构建拥抱变化迭代优化。",
"version": "1.1.0-SNAPSHOT",
"version": "2.0.0-SNAPSHOT",
"private": true,
"author": "Charles7c",
"license": "Apache-2.0",

View File

@@ -4,7 +4,7 @@
<a href="https://blog.charles7c.top/about/me" target="_blank" rel="noopenner noreferrer">Charles7c</a>
<span>&nbsp;&nbsp;</span>
<a href="https://github.com/Charles7c/continew-admin" target="_blank" rel="noopenner noreferrer">{{ $t('title') }}</a>&nbsp;
v1.1.0-SNAPSHOT
v2.0.0-SNAPSHOT
<span>&nbsp;&nbsp;</span>
<a href="https://beian.miit.gov.cn" target="_blank" rel="noopenner noreferrer">津ICP备2022005864号-2</a>
</a-layout-footer>

View File

@@ -18,9 +18,9 @@ package top.charles7c.cnadmin.webapi.controller.common;
import java.time.Duration;
import javax.mail.MessagingException;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import jakarta.mail.MessagingException;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.RequiredArgsConstructor;

View File

@@ -98,7 +98,7 @@ public class CommonController {
Set<Class<?>> classSet = ClassUtil.scanPackageBySuper(properties.getBasePackage(), BaseEnum.class);
Optional<Class<?>> first =
classSet.stream().filter(c -> c.getSimpleName().equalsIgnoreCase(enumTypeName)).findFirst();
if (!first.isPresent()) {
if (first.isEmpty()) {
return R.fail("枚举字典不存在");
}
// 转换枚举为字典列表

View File

@@ -16,7 +16,7 @@
package top.charles7c.cnadmin.webapi.controller.system;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;

View File

@@ -51,7 +51,7 @@ spring.liquibase:
change-log: classpath:/db/changelog/db.changelog-master.yaml
--- ### Redis 单机配置
spring:
spring.data:
redis:
# 地址
host: ${REDIS_HOST:127.0.0.1}

View File

@@ -51,7 +51,7 @@ spring.liquibase:
change-log: classpath:/db/changelog/db.changelog-master.yaml
--- ### Redis 单机配置
spring:
spring.data:
redis:
# 地址
host: ${REDIS_HOST:127.0.0.1}

View File

@@ -5,7 +5,7 @@ continew-admin:
# 应用名称
appName: continew-admin
# 版本
version: 1.1.0-SNAPSHOT
version: 2.0.0-SNAPSHOT
# 描述
description: ContiNew Admin 中后台管理框架/脚手架Continue New Admin持续以最新流行技术栈构建拥抱变化迭代优化。
# URL

12
pom.xml
View File

@@ -38,7 +38,7 @@ limitations under the License.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
@@ -59,12 +59,8 @@ limitations under the License.
<hutool.version>5.8.16</hutool.version>
<!-- ### 基础环境相关 ### -->
<revision>1.1.0-SNAPSHOT</revision>
<java.version>1.8</java.version>
<revision>2.0.0-SNAPSHOT</revision>
<spotless.version>2.28.0</spotless.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<profiles>
@@ -101,7 +97,7 @@ limitations under the License.
<!-- Sa-Token轻量级 Java 权限认证框架,让鉴权变得简单、优雅) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${sa-token.version}</version>
</dependency>
@@ -255,7 +251,7 @@ limitations under the License.
<configuration>
<java>
<importOrder>
<order>java,javax,lombok,io,org,com,cn,top.charles7c,</order>
<order>java,jakarta,lombok,io,org,com,cn,top.charles7c,</order>
</importOrder>
<removeUnusedImports/>
<eclipse>