From 8bd38f630280b76b40aa95564b6e6dfc0d873699 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 21 Jan 2025 17:13:04 +0800 Subject: [PATCH 01/39] =?UTF-8?q?docs:=20=E6=96=87=E6=A1=A3=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=A1=B9=E7=9B=AE=E6=9B=B4=E6=96=B0=E7=9A=84=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 74 +++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 58315170..01a6f061 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,11 @@ ![](https://raw.gitmirror.com/youlaitech/image/main/docs/rainbow.png)
- 🔍 在线预览 | 📖 阅读文档 | 🌐English + 🔍 在线预览 | 📖 阅读文档
## 📢 项目简介 -**在线预览**: [https://vue3.youlai.tech](https://vue3.youlai.tech) - 基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-Plus、Knife4j、Vue 3、Element-Plus 构建的前后端分离单体权限管理系统。 - **🚀 开发框架**: 使用 Spring Boot 3 和 Vue 3,以及 Element-Plus 等主流技术栈,实时更新。 @@ -37,7 +35,37 @@ - **🛠️ 功能模块**: 包括用户管理、角色管理、菜单管理、部门管理、字典管理等多个功能。 -- **📘 接口文档**: 自动生成接口文档,支持在线调试,提高开发效率。 + +## 🌈 项目地址 + +- **在线预览**:[https://vue.youlai.tech](https://vue.youlai.tech) +- **前端项目**:[vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) +- **接口文档**:[https://www.apifox.cn/apidoc](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) +- **项目文档**:[youlai-boot 企业级权限管理系统全功能详解](https://youlai.blog.csdn.net/article/details/145178880) +- **从0到1文档**:[从0到1搭建 youlai-boot 企业级权限管理系统](https://youlai.blog.csdn.net/article/details/145177011) + +## 🚀 项目启动 + +1. **克隆项目** + + ```bash + git clone https://gitee.com/youlaiorg/youlai-boot.git + ``` + +2. **数据库初始化** + + 执行 [youlai_boot.sql](sql/mysql8/youlai_boot.sql) 脚本完成数据库创建、表结构和基础数据的初始化。 + +3. **修改配置** + + [application-dev.yml](src/main/resources/application-dev.yml) 修改MySQL、Redis连接配置; + +4. **启动项目** + + 执行 [YoulaiBootApplication.java](src/main/java/com/youlai/boot/YoulaiBootApplication.java) 的 main 方法完成后端项目启动; + + 访问接口文档地址 [http://localhost:8989/doc.html](http://localhost:8989/doc.html) 验证项目启动是否成功。 + ## 📁 项目目录 ``` @@ -47,6 +75,7 @@ youlai-boot │ └── mysql8 # MySQL8 脚本 ├── src # 源码目录 │ ├── common # 公共模块 +│ │ ├── annotation # 注解定义 │ │ ├── base # 基础类 │ │ ├── constant # 常量 │ │ ├── enums # 枚举类型 @@ -71,7 +100,7 @@ youlai-boot │ │ ├── WebSocketConfig # WebSocket 自动装配配置 │ │ └── XxlJobConfig # XXL-JOB 自动装配配置 │ ├── core # 核心功能 -│ │ ├── annotation # 注解定义 + │ │ ├── aspect # 切面 │ │ │ ├── LogAspect # 日志切面 │ │ │ └── RepeatSubmitAspect # 防重提交切面 @@ -81,7 +110,7 @@ youlai-boot │ │ ├── handler # 处理器 │ │ │ ├── MyDataPermissionHandler # 数据权限处理器 │ │ │ └── MyMetaObjectHandler # 元对象字段填充处理器 -│ │ └── security # Security 安全中心 +│ │ └── security # Spring Security 安全模块 │ ├── modules # 业务模块 │ │ ├── member # 会员模块【业务模块演示】 │ │ ├── order # 订单模块【业务模块演示】 @@ -112,35 +141,8 @@ youlai-boot └── end ``` -## 🌺 前端工程 -| Gitee | Github | -|-------|------| -| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | [vue3-element-admin](https://github.com/youlaitech/vue3-element-admin) | -## 🌈 接口文档 - -- `knife4j` 接口文档:[http://localhost:8989/doc.html](http://localhost:8989/doc.html) -- `swagger` 接口文档:[http://localhost:8989/swagger-ui/index.html](http://localhost:8989/swagger-ui/index.html) -- `apifox` 在线接口文档:[https://www.apifox.cn/apidoc](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) - - -## 🚀 项目启动 - -1. **数据库初始化** - - 执行 [youlai_boot.sql](sql/mysql8/youlai_boot.sql) 脚本完成数据库创建、表结构和基础数据的初始化。 - -2. **修改配置** - - [application-dev.yml](src/main/resources/application-dev.yml) 修改MySQL、Redis连接配置; - -3. **启动项目** - - 执行 [SystemApplication.java](src/main/java/com/youlai/boot/YouLaiApplication.java) 的 main 方法完成后端项目启动; - - 访问接口文档地址 [http://localhost:8989/doc.html](http://localhost:8989/doc.html) 验证项目启动是否成功。 - ## ✅ 项目统计 ![Alt](https://repobeats.axiom.co/api/embed/544c5c0b5b3611a6c4d5ef0faa243a9066b89659.svg "Repobeats analytics image") @@ -152,9 +154,7 @@ Thanks to all the contributors! ## 💖 加交流群 -> 关注公众号【有来技术】,获取交流群二维码,不想关注公众号或二维码过期欢迎加我微信(`haoxianrui`)备注【有来】即可,拉你进群。 - -| ![](https://s2.loli.net/2022/11/19/OGjum9wr8f6idLX.png) | -|---------------------------------------------------------| +> 关注公众号 有来技术 ,点击菜单 交流群 获取加群二维码。 +![](https://foruda.gitee.com/images/1737108820762592766/3390ed0d_716974.png) From c2ab755cf3cb4dad966a25ec8ceddbc2706693dd Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Wed, 22 Jan 2025 11:56:58 +0800 Subject: [PATCH 02/39] =?UTF-8?q?refactor:=20MinIO=20=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=BF=94=E5=9B=9E=E5=90=8D=E7=A7=B0=E4=B8=8D?= =?UTF-8?q?=E5=B8=A6=E6=96=87=E4=BB=B6=E5=A4=B9=E5=92=8C=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E4=BF=A1=E6=81=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/BusinessException.java | 7 +++ .../exception/GlobalExceptionHandler.java | 8 +-- .../boot/common/result/IResultCode.java | 4 +- .../youlai/boot/common/result/ResultCode.java | 16 ++--- .../boot/shared/file/model/FileInfo.java | 7 +++ .../file/service/impl/MinioFileService.java | 58 ++++++++++--------- 6 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/youlai/boot/common/exception/BusinessException.java b/src/main/java/com/youlai/boot/common/exception/BusinessException.java index c74ae972..06467091 100644 --- a/src/main/java/com/youlai/boot/common/exception/BusinessException.java +++ b/src/main/java/com/youlai/boot/common/exception/BusinessException.java @@ -20,6 +20,13 @@ public class BusinessException extends RuntimeException { this.resultCode = errorCode; } + + public BusinessException(IResultCode errorCode,String message) { + super(message); + this.resultCode = errorCode; + } + + public BusinessException(String message, Throwable cause) { super(message, cause); } diff --git a/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java b/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java index 2021dbd9..cf7722a8 100644 --- a/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/youlai/boot/common/exception/GlobalExceptionHandler.java @@ -30,7 +30,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; - /** * 全局系统异常处理器 *

@@ -219,9 +218,9 @@ public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Result handleBizException(BusinessException e) { - log.error("biz exception: {}", e.getMessage()); + log.error("biz exception", e); if (e.getResultCode() != null) { - return Result.failed(e.getResultCode()); + return Result.failed(e.getResultCode(), e.getMessage()); } return Result.failed(e.getMessage()); } @@ -239,8 +238,7 @@ public class GlobalExceptionHandler { || e instanceof AuthenticationException) { throw e; } - log.error("unknown exception: {}", e.getMessage()); - e.printStackTrace(); + log.error("unknown exception", e); return Result.failed(e.getLocalizedMessage()); } diff --git a/src/main/java/com/youlai/boot/common/result/IResultCode.java b/src/main/java/com/youlai/boot/common/result/IResultCode.java index 479639e3..741d604a 100644 --- a/src/main/java/com/youlai/boot/common/result/IResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/IResultCode.java @@ -3,8 +3,8 @@ package com.youlai.boot.common.result; /** * 响应码接口 * - * @author Ray - * @since 2022/2/18 + * @author Ray.Hao + * @since 1.0.0 **/ public interface IResultCode { diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index 73ab7752..026927ef 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -42,7 +42,7 @@ public enum ResultCode implements IResultCode, Serializable { VOICE_VERIFICATION_CODE_INPUT_ERROR("A0133", "语音校验码输入错误"), USER_CERTIFICATE_EXCEPTION("A0140", "用户证件异常"), - USER_CERTIFICATE_TYPE_NOT_SELECTED("A0141", "用户证��类型未选择"), + USER_CERTIFICATE_TYPE_NOT_SELECTED("A0141", "用户证件类型未选择"), MAINLAND_ID_NUMBER_VERIFICATION_ILLEGAL("A0142", "大陆身份证编号校验非法"), USER_BASIC_INFORMATION_VERIFICATION_FAILED("A0150", "用户基本信息校验失败"), @@ -127,12 +127,14 @@ public enum ResultCode implements IResultCode, Serializable { USER_RESOURCE_NOT_FOUND("A0606", "用户资源不存在"), /** 二级宏观错误码 */ - USER_UPLOAD_FILE_EXCEPTION("A0700", "用户上传文件异常"), - USER_UPLOAD_FILE_TYPE_MISMATCH("A0701", "用户上传文件类型不匹配"), - USER_UPLOAD_FILE_TOO_LARGE("A0702", "用户上传文件太大"), - USER_UPLOAD_IMAGE_TOO_LARGE("A0703", "用户上传图片太大"), - USER_UPLOAD_VIDEO_TOO_LARGE("A0704", "用户上传视频太大"), - USER_UPLOAD_COMPRESSED_FILE_TOO_LARGE("A0705", "用户上传压缩文件太大"), + UPLOAD_FILE_EXCEPTION("A0700", "上传文件异常"), + UPLOAD_FILE_TYPE_MISMATCH("A0701", "上传文件类型不匹配"), + UPLOAD_FILE_TOO_LARGE("A0702", "上传文件太大"), + UPLOAD_IMAGE_TOO_LARGE("A0703", "上传图片太大"), + UPLOAD_VIDEO_TOO_LARGE("A0704", "上传视频太大"), + UPLOAD_COMPRESSED_FILE_TOO_LARGE("A0705", "上传压缩文件太大"), + + DELETE_FILE_EXCEPTION("A0710", "删除文件异常"), /** 二级宏观错误码 */ USER_CURRENT_VERSION_EXCEPTION("A0800", "用户当前版本异常"), diff --git a/src/main/java/com/youlai/boot/shared/file/model/FileInfo.java b/src/main/java/com/youlai/boot/shared/file/model/FileInfo.java index f1251dc4..ec550a18 100644 --- a/src/main/java/com/youlai/boot/shared/file/model/FileInfo.java +++ b/src/main/java/com/youlai/boot/shared/file/model/FileInfo.java @@ -3,6 +3,13 @@ package com.youlai.boot.shared.file.model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; + +/** + * 文件信息对象 + * + * @author Ray.Hao + * @since 1.0.0 + */ @Schema(description = "文件对象") @Data public class FileInfo { diff --git a/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java b/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java index db5fce55..59c7e576 100644 --- a/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java +++ b/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java @@ -5,30 +5,30 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import com.youlai.boot.common.exception.BusinessException; +import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.shared.file.service.FileService; import com.youlai.boot.shared.file.model.FileInfo; import io.minio.*; -import io.minio.errors.*; import io.minio.http.Method; import jakarta.annotation.PostConstruct; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; +import java.io.File; import java.io.InputStream; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.time.LocalDateTime; /** * MinIO 文件上传服务类 * - * @author haoxr + * @author Ray.Hao * @since 2023/6/2 */ @Component @@ -36,6 +36,7 @@ import java.time.LocalDateTime; @ConfigurationProperties(prefix = "oss.minio") @RequiredArgsConstructor @Data +@Slf4j public class MinioFileService implements FileService { /** @@ -77,7 +78,7 @@ public class MinioFileService implements FileService { * 上传文件 * * @param file 表单文件对象 - * @return + * @return 文件信息 */ @Override public FileInfo uploadFile(MultipartFile file) { @@ -85,16 +86,19 @@ public class MinioFileService implements FileService { // 创建存储桶(存储桶不存在),如果有搭建好的minio服务,建议放在init方法中 createBucketIfAbsent(bucketName); - // 生成文件名(日期文件夹) + // 文件后缀 String suffix = FileUtil.getSuffix(file.getOriginalFilename()); - String uuid = IdUtil.simpleUUID(); - String fileName = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + uuid + "." + suffix; + // 文件夹名称 + String dateFolder = DateUtil.format(LocalDateTime.now(), "yyyyMMdd"); + // 文件名称 + String fileName = IdUtil.simpleUUID() + "." + suffix; + // try-with-resource 语法糖自动释放流 try (InputStream inputStream = file.getInputStream()) { // 文件上传 PutObjectArgs putObjectArgs = PutObjectArgs.builder() .bucket(bucketName) - .object(fileName) + .object(dateFolder + "/"+ fileName) .contentType(file.getContentType()) .stream(inputStream, inputStream.available(), -1) .build(); @@ -104,15 +108,18 @@ public class MinioFileService implements FileService { String fileUrl; // 未配置自定义域名 if (StrUtil.isBlank(customDomain)) { + // 获取文件URL GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder() - .bucket(bucketName).object(fileName) + .bucket(bucketName) + .object(dateFolder + "/"+ fileName) .method(Method.GET) .build(); fileUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); fileUrl = fileUrl.substring(0, fileUrl.indexOf("?")); - } else { // 配置自定义文件路径域名 - fileUrl = customDomain + '/' + bucketName + "/" + fileName; + } else { + // 配置自定义文件路径域名 + fileUrl = customDomain + "/"+ bucketName + "/"+ dateFolder + "/"+ fileName; } FileInfo fileInfo = new FileInfo(); @@ -120,7 +127,8 @@ public class MinioFileService implements FileService { fileInfo.setUrl(fileUrl); return fileInfo; } catch (Exception e) { - throw new RuntimeException("文件上传失败"); + log.error("上传文件失败", e); + throw new BusinessException(ResultCode.UPLOAD_FILE_EXCEPTION, e.getMessage()); } } @@ -128,9 +136,8 @@ public class MinioFileService implements FileService { /** * 删除文件 * - * @param filePath 文件路径 http://localhost:9000/default/20221120/test.jpg - * - * @return + * @param filePath 文件完整路径 + * @return 是否删除成功 */ @Override public boolean deleteFile(String filePath) { @@ -152,7 +159,8 @@ public class MinioFileService implements FileService { minioClient.removeObject(removeObjectArgs); return true; } catch (Exception e) { - throw new RuntimeException("文件删除失败", e); + log.error("删除文件失败", e); + throw new BusinessException(ResultCode.DELETE_FILE_EXCEPTION, e.getMessage()); } } @@ -161,17 +169,11 @@ public class MinioFileService implements FileService { * PUBLIC桶策略 * 如果不配置,则新建的存储桶默认是PRIVATE,则存储桶文件会拒绝访问 Access Denied * - * @param bucketName - * @return + * @param bucketName 存储桶名称 + * @return 存储桶策略 */ private static String publicBucketPolicy(String bucketName) { - /** - * AWS的S3存储桶策略 - * Principal: 生效用户对象 - * Resource: 指定存储桶 - * Action: 操作行为 - */ - + // AWS的S3存储桶策略 JSON 格式 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/example-bucket-policies.html return "{\"Version\":\"2012-10-17\"," + "\"Statement\":[{\"Effect\":\"Allow\"," + "\"Principal\":{\"AWS\":[\"*\"]}," @@ -185,7 +187,7 @@ public class MinioFileService implements FileService { /** * 创建存储桶(存储桶不存在) * - * @param bucketName + * @param bucketName 存储桶名称 */ @SneakyThrows private void createBucketIfAbsent(String bucketName) { From f1f30712f7c1e21ff659aa8ee570e16c7b404362 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Wed, 22 Jan 2025 16:14:43 +0800 Subject: [PATCH 03/39] =?UTF-8?q?feat(shared):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6=E6=9C=8D=E5=8A=A1=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加文件上传和删除方法的代码注释 - 使用 Hutool 的 DatePattern 优化日期格式化 - 修复文件路径分隔符问题,提高代码兼容性 --- .../file/service/impl/LocalFileService.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java b/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java index f6a217e4..46740dc4 100644 --- a/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java +++ b/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java @@ -1,5 +1,6 @@ package com.youlai.boot.shared.file.service.impl; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; @@ -7,6 +8,7 @@ import com.youlai.boot.shared.file.model.FileInfo; import com.youlai.boot.shared.file.service.FileService; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -23,40 +25,53 @@ import java.time.LocalDateTime; * @author Theo * @since 2024-12-09 17:11 */ +@Data +@Slf4j @Component @ConditionalOnProperty(value = "oss.type", havingValue = "local") @ConfigurationProperties(prefix = "oss.local") @RequiredArgsConstructor -@Data public class LocalFileService implements FileService { @Value("${oss.local.storage-path}") private String storagePath; + /** + * 上传文件方法 + * + * @param file 表单文件对象 + * @return 文件信息 + */ @Override public FileInfo uploadFile(MultipartFile file) { // 生成文件名(日期文件夹) String suffix = FileUtil.getSuffix(file.getOriginalFilename()); String uuid = IdUtil.simpleUUID(); - String folder = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + File.separator; - String fileName = uuid + "." + suffix; + String folder = DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN); + String fileName = uuid + "." + suffix; String filePrefix = storagePath.endsWith(File.separator) ? storagePath : storagePath + File.separator; // try-with-resource 语法糖自动释放流 try (InputStream inputStream = file.getInputStream()) { // 上传文件 - FileUtil.writeFromStream(inputStream, filePrefix +folder+ fileName); + FileUtil.writeFromStream(inputStream, filePrefix + folder + File.separator + fileName); } catch (Exception e) { - e.printStackTrace(); + log.error("文件上传失败", e); throw new RuntimeException("文件上传失败"); } // 获取文件访问路径,因为这里是本地存储,所以直接返回文件的相对路径,需要前端自行处理访问前缀 - String fileUrl = File.separator +folder+File.separator + fileName; + String fileUrl = File.separator + folder + File.separator + fileName; FileInfo fileInfo = new FileInfo(); fileInfo.setName(fileName); fileInfo.setUrl(fileUrl); return fileInfo; } + + /** + * 删除文件 + * @param filePath 文件完整URL + * @return 是否删除成功 + */ @Override public boolean deleteFile(String filePath) { //判断文件是否为空 From 8936f61f43b31a8df6c93336367ce2964a5e6da8 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Wed, 22 Jan 2025 16:25:13 +0800 Subject: [PATCH 04/39] =?UTF-8?q?feat(User):=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=82=AE=E7=AE=B1=E5=AD=97=E6=AE=B5-=20=E5=9C=A8=20Us?= =?UTF-8?q?erMapper.xml=20=E6=96=87=E4=BB=B6=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E7=94=A8=E6=88=B7=E9=82=AE=E7=AE=B1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=20-=20=E5=9C=A8=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E7=9B=B8=E5=85=B3=20SQL=20=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=B8=AD=E5=8C=85=E5=90=AB=E4=BA=86=E9=82=AE=E7=AE=B1=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/system/UserMapper.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml index 88e103af..1cfc5907 100644 --- a/src/main/resources/mapper/system/UserMapper.xml +++ b/src/main/resources/mapper/system/UserMapper.xml @@ -14,6 +14,7 @@ u.gender, u.avatar, u.STATUS, + u.email, d.NAME AS dept_name, GROUP_CONCAT( r.NAME ) AS roleNames, u.create_time @@ -182,6 +183,7 @@ u.username, u.nickname, u.mobile, + u.email, CASE u.gender WHEN 1 THEN '男' WHEN 2 THEN '女' @@ -219,6 +221,7 @@ u.gender, u.avatar, u.STATUS, + u.email, d.NAME AS deptName, GROUP_CONCAT(r.NAME) AS roleNames, u.create_time From d15af9f51e483f46191e791c0fede1ba0b6e9249 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Wed, 22 Jan 2025 16:45:28 +0800 Subject: [PATCH 05/39] =?UTF-8?q?refactor(system):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 UserMapper 中的性别转换逻辑 - 在 UserServiceImpl 中添加字典数据获取和性别转换逻辑 --- .../system/service/impl/UserServiceImpl.java | 38 ++++++++++++------- .../resources/mapper/system/UserMapper.xml | 6 +-- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index e9beb707..c4f74448 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -10,29 +10,29 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SystemConstants; -import com.youlai.boot.core.security.manager.TokenManager; +import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.model.Option; +import com.youlai.boot.core.security.manager.TokenManager; +import com.youlai.boot.core.security.service.PermissionService; +import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.shared.mail.service.MailService; import com.youlai.boot.shared.sms.enums.SmsTypeEnum; import com.youlai.boot.shared.sms.service.SmsService; +import com.youlai.boot.system.converter.UserConverter; +import com.youlai.boot.system.enums.DictCodeEnum; +import com.youlai.boot.system.mapper.UserMapper; +import com.youlai.boot.system.model.bo.UserBO; +import com.youlai.boot.system.model.dto.UserAuthInfo; +import com.youlai.boot.system.model.dto.UserExportDTO; +import com.youlai.boot.system.model.entity.DictData; import com.youlai.boot.system.model.entity.User; import com.youlai.boot.system.model.entity.UserRole; import com.youlai.boot.system.model.form.*; -import com.youlai.boot.system.converter.UserConverter; -import com.youlai.boot.common.exception.BusinessException; -import com.youlai.boot.system.model.vo.UserProfileVO; -import com.youlai.boot.core.security.util.SecurityUtils; -import com.youlai.boot.system.mapper.UserMapper; -import com.youlai.boot.system.model.dto.UserAuthInfo; -import com.youlai.boot.system.model.bo.UserBO; import com.youlai.boot.system.model.query.UserPageQuery; -import com.youlai.boot.system.model.dto.UserExportDTO; import com.youlai.boot.system.model.vo.UserInfoVO; import com.youlai.boot.system.model.vo.UserPageVO; -import com.youlai.boot.core.security.service.PermissionService; -import com.youlai.boot.system.service.RoleService; -import com.youlai.boot.system.service.UserRoleService; -import com.youlai.boot.system.service.UserService; +import com.youlai.boot.system.model.vo.UserProfileVO; +import com.youlai.boot.system.service.*; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; @@ -69,6 +69,8 @@ public class UserServiceImpl extends ServiceImpl implements Us private final TokenManager tokenManager; + private final DictDataService dictDataService; + private final UserConverter userConverter; /** @@ -274,7 +276,15 @@ public class UserServiceImpl extends ServiceImpl implements Us */ @Override public List listExportUsers(UserPageQuery queryParams) { - return this.baseMapper.listExportUsers(queryParams); + List userExportDTOS = this.baseMapper.listExportUsers(queryParams); + //获取角色的字典数据 + List list = dictDataService.list(new LambdaQueryWrapper().eq(DictData::getDictCode, DictCodeEnum.GENDER.getValue())); + Map genderMap = list.stream().collect(Collectors.toMap(DictData::getValue, DictData::getLabel)); + userExportDTOS.forEach(userExportDTO -> { + String genderLabel = genderMap.get(userExportDTO.getGender()); + userExportDTO.setGender(genderLabel); + }); + return null; } /** diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml index 1cfc5907..0940c488 100644 --- a/src/main/resources/mapper/system/UserMapper.xml +++ b/src/main/resources/mapper/system/UserMapper.xml @@ -184,11 +184,7 @@ u.nickname, u.mobile, u.email, - CASE u.gender - WHEN 1 THEN '男' - WHEN 2 THEN '女' - ELSE '保密' - END gender, + u.gender, d.NAME AS dept_name, u.create_time FROM From 5b97e69ef91bf959c512291433cf161ec0968ec1 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Feb 2025 09:51:31 +0800 Subject: [PATCH 06/39] =?UTF-8?q?fix(youlai=5Fboot.sql):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DSQL=E8=84=9A=E6=9C=AC=20sys=5Fuser=20=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=20id=20=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #IBJQXR --- sql/mysql5/youlai_boot.sql | 2 +- sql/mysql8/youlai_boot.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index b9dbe911..2459df40 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -393,7 +393,7 @@ INSERT INTO `sys_role_menu` VALUES (2, 143); -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( - `id` int NOT NULL AUTO_INCREMENT, + `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(64) NULL DEFAULT NULL COMMENT '用户名', `nickname` varchar(64) NULL DEFAULT NULL COMMENT '昵称', `gender` tinyint(1) NULL DEFAULT 1 COMMENT '性别((1-男 2-女 0-保密)', diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index 70247977..7aead97f 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -351,7 +351,7 @@ INSERT INTO `sys_role_menu` VALUES (2, 143); -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( - `id` int NOT NULL AUTO_INCREMENT, + `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(64) DEFAULT NULL COMMENT '用户名', `nickname` varchar(64) DEFAULT NULL COMMENT '昵称', `gender` tinyint(1) NULL DEFAULT 1 COMMENT '性别((1-男 2-女 0-保密)', From 284f6dafb03c64cdcddf5f02c1abf82fadce2145 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Feb 2025 13:42:16 +0800 Subject: [PATCH 07/39] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=20web=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=85=A8=E5=B1=80=E9=85=8D=E7=BD=AE=E5=92=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/youlai/boot/config/WebMvcConfig.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/youlai/boot/config/WebMvcConfig.java b/src/main/java/com/youlai/boot/config/WebMvcConfig.java index ec938575..41fa407b 100644 --- a/src/main/java/com/youlai/boot/config/WebMvcConfig.java +++ b/src/main/java/com/youlai/boot/config/WebMvcConfig.java @@ -1,14 +1,10 @@ package com.youlai.boot.config; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateTime; -import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -24,15 +20,13 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.math.BigInteger; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.TimeZone; /** - * WebMvc 自动装配配置 + * Web 配置 * - * @author Ray + * @author Ray.Hao * @since 2020/10/16 */ @Configuration @@ -47,21 +41,22 @@ public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); - objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); + ObjectMapper objectMapper = new ObjectMapper(); - // 处理 Long 和 BigInteger 类型,避免前端精度丢失问题 + // 注册 JavaTimeModule(替代手动注册 LocalDateTimeSerializer) + JavaTimeModule javaTimeModule = new JavaTimeModule(); + objectMapper.registerModule(javaTimeModule); + + // 配置全局日期格式和时区 + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); + + // 处理 Long/BigInteger 的精度问题 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); - simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer( - DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN).withZone(ZoneId.of( "GMT+8")) - )); objectMapper.registerModule(simpleModule); - objectMapper.setDateFormat(new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN)); - jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(1, jackson2HttpMessageConverter); From b0ede31721b3687518ed51b769cdff6a29d8e9a5 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Feb 2025 13:44:12 +0800 Subject: [PATCH 08/39] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/youlai/boot/system/model/vo/VisitTrendVO.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/model/vo/VisitTrendVO.java b/src/main/java/com/youlai/boot/system/model/vo/VisitTrendVO.java index 0a47b0a1..42e8a2cb 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/VisitTrendVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/VisitTrendVO.java @@ -10,7 +10,7 @@ import java.util.List; /** * 访问趋势VO * - * @author Ray + * @author Ray.Hao * @since 2.3.0 */ @Schema(description = "访问趋势VO") @@ -24,9 +24,6 @@ public class VisitTrendVO { @Schema(description = "浏览量(PV)") private List pvList; - @Schema(description = "访客数(UV)") - private List uvList; - @Schema(description = "IP数") private List ipList; From abfbae6f49e68bd9f2d5d31359e4c0fef7ef18ee Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Feb 2025 13:45:59 +0800 Subject: [PATCH 09/39] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=A0bo?= =?UTF-8?q?=E5=92=8Cvo=E7=9A=84=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E5=AF=BC=E8=87=B4mapstruct=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E8=BD=AC=E6=8D=A2=E6=97=B6=E5=8C=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=B0=91=E4=BA=868=E5=B0=8F=E6=97=B6=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/system/model/bo/UserBO.java | 6 ++---- .../java/com/youlai/boot/system/model/vo/UserPageVO.java | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/model/bo/UserBO.java b/src/main/java/com/youlai/boot/system/model/bo/UserBO.java index 2756db20..7fbc61ae 100644 --- a/src/main/java/com/youlai/boot/system/model/bo/UserBO.java +++ b/src/main/java/com/youlai/boot/system/model/bo/UserBO.java @@ -1,9 +1,8 @@ package com.youlai.boot.system.model.bo; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; -import java.util.Date; +import java.time.LocalDateTime; /** * 用户持久化对象 @@ -67,6 +66,5 @@ public class UserBO { /** * 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - private Date createTime; + private LocalDateTime createTime; } diff --git a/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java b/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java index cf1ce1b0..0baa4c5b 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/UserPageVO.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.Date; +import java.time.LocalDateTime; /** * 用户分页视图对象 @@ -48,6 +48,6 @@ public class UserPageVO { @Schema(description="创建时间") @JsonFormat(pattern = "yyyy/MM/dd HH:mm") - private Date createTime; + private LocalDateTime createTime; } From 8caf20a455de88fe797c95b8b699169c0c1ed67e Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Feb 2025 13:49:54 +0800 Subject: [PATCH 10/39] =?UTF-8?q?chore:=20=E6=97=B6=E5=8C=BA=E5=92=8C?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F=E7=94=B1=20WebMvcConfig=20?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=AE=A1=E7=90=86=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=BA=86=E5=BD=93=E5=89=8D=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=85=8D=E7=BD=AE=E4=BB=A5=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 5 ----- src/main/resources/application-prod.yml | 5 ----- 2 files changed, 10 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 0a9722ae..18094a6e 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -2,11 +2,6 @@ server: port: 8989 spring: - jackson: - ## 默认序列化时间格式 - date-format: yyyy-MM-dd HH:mm:ss - ## 默认序列化时区 - time-zone: GMT+8 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 24379401..2fa52d4a 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -2,11 +2,6 @@ server: port: 8989 spring: - jackson: - ## 默认序列化时间格式 - date-format: yyyy-MM-dd HH:mm:ss - ## 默认序列化时区 - time-zone: GMT+8 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver From cb8a2c4f41454c3de60146d2a4febbf1b71db917 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 10 Feb 2025 10:21:39 +0800 Subject: [PATCH 11/39] =?UTF-8?q?feat(cache):=20=E6=B7=BB=E5=8A=A0=20Caffe?= =?UTF-8?q?ine=E7=BC=93=E5=AD=98=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=97=A5=E5=BF=97=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在应用配置中添加 Caffeine 缓存配置 - 新增 CaffeineConfig 类用于缓存管理 - 在 Log 实体中添加 userAgent 字段保存原始用户代理字符串 - 优化 LogAspect 中的用户代理解析逻辑,增加缓存支持 - 更新数据库表结构,在 log 表中添加 user_agent 列 --- pom.xml | 7 +++ sql/mysql5/youlai_boot.sql | 1 + sql/mysql8/youlai_boot.sql | 1 + .../youlai/boot/config/CaffeineConfig.java | 37 ++++++++++++++++ .../youlai/boot/core/aspect/LogAspect.java | 44 +++++++++++++++++-- .../system/controller/UserController.java | 2 + .../youlai/boot/system/model/entity/Log.java | 6 ++- src/main/resources/application-dev.yml | 2 + src/main/resources/application-prod.yml | 3 +- 9 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/youlai/boot/config/CaffeineConfig.java diff --git a/pom.xml b/pom.xml index c5885bd0..8f2f43ee 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,7 @@ 4.5.5.B + 2.9.3 @@ -232,6 +233,12 @@ ${weixin-java.version} + + com.github.ben-manes.caffeine + caffeine + ${caffeine.version} + + diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index 2459df40..ab74d5ae 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -144,6 +144,7 @@ CREATE TABLE `sys_log` ( `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', `os` varchar(100) DEFAULT NULL COMMENT '终端系统', + `user_agent` varchar(255) DEFAULT NULL COMMENT '原生的用户代理字符串', `create_by` bigint DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index 7aead97f..677b923a 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -416,6 +416,7 @@ CREATE TABLE `sys_log` ( `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', `os` varchar(100) DEFAULT NULL COMMENT '终端系统', + `user_agent` varchar(255) DEFAULT NULL COMMENT '原生的用户代理字符串', `create_by` bigint DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', diff --git a/src/main/java/com/youlai/boot/config/CaffeineConfig.java b/src/main/java/com/youlai/boot/config/CaffeineConfig.java new file mode 100644 index 00000000..bba14491 --- /dev/null +++ b/src/main/java/com/youlai/boot/config/CaffeineConfig.java @@ -0,0 +1,37 @@ +package com.youlai.boot.config; + +import com.github.benmanes.caffeine.cache.Caffeine; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.CacheManager; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * caffeine缓存配置 + * + * @author Theo + * @since 2025-01-22 17:40:23 + */ +@Slf4j +@Configuration +public class CaffeineConfig { + + @Value("${spring.cache.caffeine.spec}") + private String caffeineSpec; + + /** + * 缓存管理器 + * + * @return CacheManager 缓存管理器 + */ + @Bean + public CacheManager cacheManager() { + CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager(); + Caffeine caffeineBuilder = Caffeine.from(caffeineSpec); + caffeineCacheManager.setCaffeine(caffeineBuilder); + return caffeineCacheManager; + } +} + diff --git a/src/main/java/com/youlai/boot/core/aspect/LogAspect.java b/src/main/java/com/youlai/boot/core/aspect/LogAspect.java index 9fe680e4..39c72941 100644 --- a/src/main/java/com/youlai/boot/core/aspect/LogAspect.java +++ b/src/main/java/com/youlai/boot/core/aspect/LogAspect.java @@ -3,9 +3,11 @@ package com.youlai.boot.core.aspect; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.excel.util.StringUtils; import com.aliyun.oss.HttpMethod; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.util.IPUtils; @@ -21,6 +23,7 @@ import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import org.springframework.cache.CacheManager; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -37,14 +40,18 @@ import java.util.Objects; * @author Ray.Hao * @since 2024/6/25 */ +@Slf4j @Aspect @Component @RequiredArgsConstructor -@Slf4j public class LogAspect { private final LogService logService; private final HttpServletRequest request; + private final CacheManager cacheManager; + /** + * 切点 + */ @Pointcut("@annotation(com.youlai.boot.common.annotation.Log)") public void logPointcut() { } @@ -72,7 +79,12 @@ public class LogAspect { } /** - * 保持日志 + * 保存日志 + * + * @param joinPoint 切点 + * @param e 异常 + * @param jsonResult 响应结果 + * @param logAnnotation 日志注解 */ private void saveLog(final JoinPoint joinPoint, final Exception e, Object jsonResult, com.youlai.boot.common.annotation.Log logAnnotation) { String requestURI = request.getRequestURI(); @@ -120,8 +132,9 @@ public class LogAspect { log.setExecutionTime(executionTime); // 获取浏览器和终端系统信息 String userAgentString = request.getHeader("User-Agent"); - UserAgent userAgent = UserAgentUtil.parse(userAgentString); - if(Objects.nonNull(userAgent)) { + log.setUserAgent(userAgentString); + UserAgent userAgent = resolveUserAgent(userAgentString); + if (Objects.nonNull(userAgent)) { // 系统信息 log.setOs(userAgent.getOs().getName()); // 浏览器信息 @@ -193,4 +206,27 @@ public class LogAspect { return obj instanceof MultipartFile || obj instanceof HttpServletRequest || obj instanceof HttpServletResponse; } + + /** + * 解析UserAgent + * + * @param userAgentString UserAgent字符串 + * @return UserAgent + */ + public UserAgent resolveUserAgent(String userAgentString) { + if (StringUtils.isBlank(userAgentString)) { + return null; + } + // 给userAgentStringMD5加密一次防止过长 + String userAgentStringMD5 = DigestUtil.md5Hex(userAgentString); + //判断是否命中缓存 + UserAgent userAgent = Objects.requireNonNull(cacheManager.getCache("userAgent")).get(userAgentStringMD5, UserAgent.class); + if (userAgent != null) { + return userAgent; + } + userAgent = UserAgentUtil.parse(userAgentString); + Objects.requireNonNull(cacheManager.getCache("userAgent")).put(userAgentStringMD5, userAgent); + return userAgent; + } + } diff --git a/src/main/java/com/youlai/boot/system/controller/UserController.java b/src/main/java/com/youlai/boot/system/controller/UserController.java index 0b5e39fa..2e2b626a 100644 --- a/src/main/java/com/youlai/boot/system/controller/UserController.java +++ b/src/main/java/com/youlai/boot/system/controller/UserController.java @@ -1,5 +1,6 @@ package com.youlai.boot.system.controller; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -63,6 +64,7 @@ public class UserController { @Valid UserPageQuery queryParams ) { IPage result = userService.getUserPage(queryParams); + return PageResult.success(result); } diff --git a/src/main/java/com/youlai/boot/system/model/entity/Log.java b/src/main/java/com/youlai/boot/system/model/entity/Log.java index 0e807f36..7181acc1 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/Log.java +++ b/src/main/java/com/youlai/boot/system/model/entity/Log.java @@ -2,7 +2,6 @@ package com.youlai.boot.system.model.entity; import com.baomidou.mybatisplus.annotation.*; import com.youlai.boot.common.enums.LogModuleEnum; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; @@ -87,6 +86,11 @@ public class Log implements Serializable { */ private String os; + /** + * 原生的用户代理字符串 + */ + private String userAgent; + /** * 执行时间(毫秒) */ diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 18094a6e..d53a2843 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -35,6 +35,8 @@ spring: time-to-live: 3600000 # 缓存null值,防止缓存穿透 cache-null-values: true + caffeine: + spec: initialCapacity=50,maximumSize=1000,expireAfterWrite=600s # 邮件配置 mail: host: smtp.youlai.tech diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 2fa52d4a..b8a47f2c 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -48,7 +48,8 @@ spring: enable: true # 邮件发送者 from: youlaitech@163.com - + caffeine: + spec: initialCapacity=50,maximumSize=500,expireAfterWrite=3600s mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml global-config: From 745c74dbda4e4850dc5bf9be3119490ff544578b Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 10 Feb 2025 10:29:51 +0800 Subject: [PATCH 12/39] =?UTF-8?q?refactor(log):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=A1=A8=E4=B8=AD=E7=9A=84=20user=5Fagent=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5-=20=E4=BB=8E=20Log=20=E7=B1=BB=E4=B8=AD?= =?UTF-8?q?=E5=88=A0=E9=99=A4=20userAgent=20=E5=B1=9E=E6=80=A7=20-=20?= =?UTF-8?q?=E4=BB=8E=E6=95=B0=E6=8D=AE=E5=BA=93=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=88MySQL=205=20=E5=92=8C=20MySQL8=EF=BC=89=E4=B8=AD?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=20user=5Fagent=E5=88=97=20-=20=E5=9C=A8=20Lo?= =?UTF-8?q?gAspect=20=E4=B8=AD=E7=A7=BB=E9=99=A4=E8=AE=BE=E7=BD=AE=20userA?= =?UTF-8?q?gent=20=E7=9A=84=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除该字段可以减少数据库存储空间的使用,并简化日志数据的处理和查询。 --- sql/mysql5/youlai_boot.sql | 1 - sql/mysql8/youlai_boot.sql | 1 - src/main/java/com/youlai/boot/core/aspect/LogAspect.java | 1 - src/main/java/com/youlai/boot/system/model/entity/Log.java | 5 ----- 4 files changed, 8 deletions(-) diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index ab74d5ae..2459df40 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -144,7 +144,6 @@ CREATE TABLE `sys_log` ( `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', `os` varchar(100) DEFAULT NULL COMMENT '终端系统', - `user_agent` varchar(255) DEFAULT NULL COMMENT '原生的用户代理字符串', `create_by` bigint DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index 677b923a..7aead97f 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -416,7 +416,6 @@ CREATE TABLE `sys_log` ( `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', `os` varchar(100) DEFAULT NULL COMMENT '终端系统', - `user_agent` varchar(255) DEFAULT NULL COMMENT '原生的用户代理字符串', `create_by` bigint DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', diff --git a/src/main/java/com/youlai/boot/core/aspect/LogAspect.java b/src/main/java/com/youlai/boot/core/aspect/LogAspect.java index 39c72941..6094bb56 100644 --- a/src/main/java/com/youlai/boot/core/aspect/LogAspect.java +++ b/src/main/java/com/youlai/boot/core/aspect/LogAspect.java @@ -132,7 +132,6 @@ public class LogAspect { log.setExecutionTime(executionTime); // 获取浏览器和终端系统信息 String userAgentString = request.getHeader("User-Agent"); - log.setUserAgent(userAgentString); UserAgent userAgent = resolveUserAgent(userAgentString); if (Objects.nonNull(userAgent)) { // 系统信息 diff --git a/src/main/java/com/youlai/boot/system/model/entity/Log.java b/src/main/java/com/youlai/boot/system/model/entity/Log.java index 7181acc1..4e8a05e1 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/Log.java +++ b/src/main/java/com/youlai/boot/system/model/entity/Log.java @@ -86,11 +86,6 @@ public class Log implements Serializable { */ private String os; - /** - * 原生的用户代理字符串 - */ - private String userAgent; - /** * 执行时间(毫秒) */ From f7351025930f9bf960d66e1f2b7b6398aa9bc750 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 10 Feb 2025 11:37:03 +0800 Subject: [PATCH 13/39] =?UTF-8?q?fix(system):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9=E9=82=AE=E7=AE=B1=E5=92=8C?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 EmailUpdateForm 和 MobileUpdateForm 中添加了 @NotBlank 注解,确保邮箱和手机号不能为空 - 在 UserServiceImpl 中增加了验证码过期检查和验证完成后删除验证码的逻辑 - 优化了错误提示信息,提高用户体验 --- .../boot/system/model/form/EmailUpdateForm.java | 5 ++++- .../boot/system/model/form/MobileUpdateForm.java | 3 +++ .../boot/system/service/impl/UserServiceImpl.java | 11 +++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/system/model/form/EmailUpdateForm.java b/src/main/java/com/youlai/boot/system/model/form/EmailUpdateForm.java index 971fdf45..22524f1d 100644 --- a/src/main/java/com/youlai/boot/system/model/form/EmailUpdateForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/EmailUpdateForm.java @@ -1,6 +1,7 @@ package com.youlai.boot.system.model.form; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; /** @@ -9,14 +10,16 @@ import lombok.Data; * @author Ray.Hao * @since 2024/8/19 */ -@Schema(description = "修改邮箱表单") @Data +@Schema(description = "修改邮箱表单") public class EmailUpdateForm { @Schema(description = "邮箱") + @NotBlank(message = "邮箱不能为空") private String email; @Schema(description = "验证码") + @NotBlank(message = "验证码不能为空") private String code; } diff --git a/src/main/java/com/youlai/boot/system/model/form/MobileUpdateForm.java b/src/main/java/com/youlai/boot/system/model/form/MobileUpdateForm.java index a5612b48..d15bf824 100644 --- a/src/main/java/com/youlai/boot/system/model/form/MobileUpdateForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/MobileUpdateForm.java @@ -1,6 +1,7 @@ package com.youlai.boot.system.model.form; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; /** @@ -14,9 +15,11 @@ import lombok.Data; public class MobileUpdateForm { @Schema(description = "手机号码") + @NotBlank(message = "手机号码不能为空") private String mobile; @Schema(description = "验证码") + @NotBlank(message = "验证码不能为空") private String code; } diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index c4f74448..e563df8b 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -451,9 +451,14 @@ public class UserServiceImpl extends ServiceImpl implements Us String redisCacheKey = RedisConstants.SMS_CHANGE_CODE_PREFIX + mobile; String cachedVerifyCode = redisTemplate.opsForValue().get(redisCacheKey); + if (StrUtil.isBlank(cachedVerifyCode)) { + throw new BusinessException("验证码已过期"); + } if (!inputVerifyCode.equals(cachedVerifyCode)) { throw new BusinessException("验证码错误"); } + // 验证完成删除验证码 + redisTemplate.delete(redisCacheKey); // 更新手机号码 return this.update( @@ -505,9 +510,15 @@ public class UserServiceImpl extends ServiceImpl implements Us String redisCacheKey = RedisConstants.EMAIL_CHANGE_CODE_PREFIX + email; String cachedVerifyCode = redisTemplate.opsForValue().get(redisCacheKey); + if (StrUtil.isBlank(cachedVerifyCode)) { + throw new BusinessException("验证码已过期"); + } + if (!inputVerifyCode.equals(cachedVerifyCode)) { throw new BusinessException("验证码错误"); } + // 验证完成删除验证码 + redisTemplate.delete(redisCacheKey); // 更新邮箱地址 return this.update( From e7e60855ba19986b937f77e99e6f1e41dd11f960 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Mon, 17 Feb 2025 01:01:51 +0800 Subject: [PATCH 14/39] =?UTF-8?q?fix:=20caffeine=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index b8a47f2c..c369e617 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -34,6 +34,8 @@ spring: time-to-live: 3600000 # 缓存null值,防止缓存穿透 cache-null-values: true + caffeine: + spec: initialCapacity=50,maximumSize=1000,expireAfterWrite=600s # 邮件配置 mail: host: smtp.youlai.tech @@ -48,8 +50,6 @@ spring: enable: true # 邮件发送者 from: youlaitech@163.com - caffeine: - spec: initialCapacity=50,maximumSize=500,expireAfterWrite=3600s mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml global-config: From 4d5cc8b0eb17fbf4c436d7c58e3a5afbd9ea1777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E7=8B=BC=E8=93=9D=E5=A4=A9?= Date: Thu, 20 Feb 2025 16:57:50 +0000 Subject: [PATCH 15/39] =?UTF-8?q?!25=20=E3=80=90BUG=E3=80=91=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=9D=BF=E5=9D=97=5F=E5=AD=97=E5=85=B8=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=AF=B9=E8=B1=A1=5F=E7=BC=BA=E5=B0=91=E5=AD=97?= =?UTF-8?q?=E6=AE=B5remark=20fix:=20=E8=A1=A5=E5=85=85=E7=BC=BA=E5=B0=91?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5remark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/system/model/form/DictForm.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/youlai/boot/system/model/form/DictForm.java b/src/main/java/com/youlai/boot/system/model/form/DictForm.java index 3c7073a8..31e5a996 100644 --- a/src/main/java/com/youlai/boot/system/model/form/DictForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/DictForm.java @@ -28,6 +28,9 @@ public class DictForm { @Schema(description = "字典编码", example ="gender") private String dictCode; + @Schema(description = "备注") + private String remark; + @Schema(description = "字典状态(1-启用,0-禁用)", example = "1") @Range(min = 0, max = 1, message = "字典状态不正确") private Integer status; From 12121b907bac8f729b8f64ac23069f5d4f7e482c Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Fri, 21 Feb 2025 01:08:25 +0800 Subject: [PATCH 16/39] =?UTF-8?q?docs(README.md):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=A2=84=E8=A7=88=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01a6f061..395da5d1 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ![](https://raw.gitmirror.com/youlaitech/image/main/docs/rainbow.png)

- 🔍 在线预览 | 📖 阅读文档 + 🖥️ 在线预览 | 📑 阅读文档
## 📢 项目简介 From 8510220c34ffc04acda920e4dae6d8218435a189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E7=8B=BC=E8=93=9D=E5=A4=A9?= Date: Fri, 21 Feb 2025 13:09:17 +0000 Subject: [PATCH 17/39] =?UTF-8?q?!26=20fix:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=A1=B5=E9=9D=A2=E6=8C=89=E7=85=A7=20=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=AD=97=E6=AE=B5=20=E6=8E=92=E5=BA=8F=20*=20fix:=20?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E6=8C=89?= =?UTF-8?q?=E7=85=A7=20=E6=8E=92=E5=BA=8F=E5=AD=97=E6=AE=B5=20=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/youlai/boot/system/service/impl/RoleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/system/service/impl/RoleServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/RoleServiceImpl.java index f1e8f66b..e56a0271 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/RoleServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/RoleServiceImpl.java @@ -67,7 +67,7 @@ public class RoleServiceImpl extends ServiceImpl implements Ro .like(Role::getCode, keywords) ) .ne(!SecurityUtils.isRoot(), Role::getCode, SystemConstants.ROOT_ROLE_CODE) // 非超级管理员不显示超级管理员角色 - .orderByDesc(Role::getCreateTime).orderByDesc(Role::getUpdateTime) + .orderByAsc(Role::getSort).orderByDesc(Role::getCreateTime).orderByDesc(Role::getUpdateTime) ); // 实体转换 From 3006c75de7a59275f58d139516626882366ffeea Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Mon, 24 Feb 2025 20:00:06 +0800 Subject: [PATCH 18/39] =?UTF-8?q?refactor:=20sql=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=95=B4=E7=90=86=EF=BC=8C=E7=BB=9F=E4=B8=80=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E9=9B=86=E7=BB=9F=E4=B8=80=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=20MySQL=205.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker-compose.yml | 2 +- sql/{mysql8 => mysql}/xxl_job.sql | 0 sql/{mysql8 => mysql}/youlai_boot.sql | 484 ++++++++++++----------- sql/mysql5/youlai_boot.sql | 531 -------------------------- 4 files changed, 254 insertions(+), 763 deletions(-) rename sql/{mysql8 => mysql}/xxl_job.sql (100%) rename sql/{mysql8 => mysql}/youlai_boot.sql (55%) delete mode 100644 sql/mysql5/youlai_boot.sql diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c9196f3e..eade344f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -15,7 +15,7 @@ services: volumes: - ./mysql/conf/my.cnf:/etc/my.cnf # 挂载 my.cnf 文件到容器的指定路径 - ./mysql/data:/var/lib/mysql # 持久化 MySQL 数据 - - ../sql/mysql8:/docker-entrypoint-initdb.d # 初始化 SQL 脚本目录 + - ../sql/mysql:/docker-entrypoint-initdb.d # 初始化 SQL 脚本目录 ports: - 3306:3306 networks: diff --git a/sql/mysql8/xxl_job.sql b/sql/mysql/xxl_job.sql similarity index 100% rename from sql/mysql8/xxl_job.sql rename to sql/mysql/xxl_job.sql diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql/youlai_boot.sql similarity index 55% rename from sql/mysql8/youlai_boot.sql rename to sql/mysql/youlai_boot.sql index 7aead97f..0fd3a84c 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql/youlai_boot.sql @@ -1,12 +1,12 @@ -# YouLai_Boot 数据库(MySQL 8.x) +# YouLai_Boot 数据库(MySQL 5.7 ~ MySQL 8.x) # Copyright (c) 2021-present, youlai.tech -- ---------------------------- -- 1. 创建数据库 -- ---------------------------- -CREATE DATABASE IF NOT EXISTS youlai_boot DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; +CREATE DATABASE IF NOT EXISTS youlai_boot DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; -- ---------------------------- @@ -26,27 +26,27 @@ START TRANSACTION; DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `sys_dept` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '部门名称', - `code` varchar(100) NOT NULL COMMENT '部门编号', - `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父节点id', - `tree_path` varchar(255) NOT NULL DEFAULT '' COMMENT '父节点id路径', - `sort` smallint NULL DEFAULT 0 COMMENT '显示顺序', - `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态(1-正常 0-禁用)', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人ID', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '修改人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除标识(1-已删除 0-未删除)', + `name` varchar(100) NOT NULL COMMENT '部门名称', + `code` varchar(100) NOT NULL COMMENT '部门编号', + `parent_id` bigint DEFAULT 0 COMMENT '父节点id', + `tree_path` varchar(255) NOT NULL COMMENT '父节点id路径', + `sort` smallint DEFAULT 0 COMMENT '显示顺序', + `status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-禁用)', + `create_by` bigint NULL COMMENT '创建人ID', + `create_time` datetime NULL COMMENT '创建时间', + `update_by` bigint NULL COMMENT '修改人ID', + `update_time` datetime NULL COMMENT '更新时间', + `is_deleted` tinyint DEFAULT 0 COMMENT '逻辑删除标识(1-已删除 0-未删除)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '部门编号唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '部门表'; -- ---------------------------- -- Records of sys_dept -- ---------------------------- -INSERT INTO `sys_dept` VALUES (1, '有来技术', 'YOULAI', 0, '0', 1, 1, 1, NULL, 1, '2024-06-24 23:48:59', 0); -INSERT INTO `sys_dept` VALUES (2, '研发部门', 'RD001', 1, '0,1', 1, 1, 2, NULL, 2, '2022-04-19 12:46:37', 0); -INSERT INTO `sys_dept` VALUES (3, '测试部门', 'QA001', 1, '0,1', 1, 1, 2, NULL, 2, '2022-04-19 12:46:37', 0); +INSERT INTO `sys_dept` VALUES (1, '有来技术', 'YOULAI', 0, '0', 1, 1, 1, NULL, 1, now(), 0); +INSERT INTO `sys_dept` VALUES (2, '研发部门', 'RD001', 1, '0,1', 1, 1, 2, NULL, 2, now(), 0); +INSERT INTO `sys_dept` VALUES (3, '测试部门', 'QA001', 1, '0,1', 1, 1, 2, NULL, 2, now(), 0); -- ---------------------------- -- Table structure for sys_dict @@ -54,18 +54,18 @@ INSERT INTO `sys_dept` VALUES (3, '测试部门', 'QA001', 1, '0,1', 1, 1, 2, NU DROP TABLE IF EXISTS `sys_dict`; CREATE TABLE `sys_dict` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键 ', - `dict_code` varchar(50) DEFAULT '' COMMENT '类型编码', - `name` varchar(50) DEFAULT '' COMMENT '类型名称', + `dict_code` varchar(50) COMMENT '类型编码', + `name` varchar(50) COMMENT '类型名称', `status` tinyint(1) DEFAULT '0' COMMENT '状态(0:正常;1:禁用)', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint DEFAULT NULL COMMENT '创建人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `update_by` bigint DEFAULT NULL COMMENT '修改人ID', + `remark` varchar(255) COMMENT '备注', + `create_time` datetime COMMENT '创建时间', + `create_by` bigint COMMENT '创建人ID', + `update_time` datetime COMMENT '更新时间', + `update_by` bigint COMMENT '修改人ID', `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(1-删除,0-未删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_dict_code` (`dict_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict -- ---------------------------- @@ -80,19 +80,19 @@ INSERT INTO `sys_dict` VALUES (3, 'notice_level', '通知级别', 1, NULL, now() DROP TABLE IF EXISTS `sys_dict_data`; CREATE TABLE `sys_dict_data` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `dict_code` varchar(50) DEFAULT NULL COMMENT '关联字典编码,与sys_dict表中的dict_code对应', - `value` varchar(50) DEFAULT '' COMMENT '字典项值', - `label` varchar(100) DEFAULT '' COMMENT '字典项标签', - `tag_type` varchar(50) DEFAULT NULL COMMENT '标签类型,用于前端样式展示(如success、warning等)', + `dict_code` varchar(50) COMMENT '关联字典编码,与sys_dict表中的dict_code对应', + `value` varchar(50) COMMENT '字典项值', + `label` varchar(100) COMMENT '字典项标签', + `tag_type` varchar(50) COMMENT '标签类型,用于前端样式展示(如success、warning等)', `status` tinyint DEFAULT '0' COMMENT '状态(1-正常,0-禁用)', `sort` int DEFAULT '0' COMMENT '排序', - `remark` varchar(255) DEFAULT '' COMMENT '备注', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint DEFAULT NULL COMMENT '创建人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `update_by` bigint DEFAULT NULL COMMENT '修改人ID', + `remark` varchar(255) COMMENT '备注', + `create_time` datetime COMMENT '创建时间', + `create_by` bigint COMMENT '创建人ID', + `update_time` datetime COMMENT '更新时间', + `update_by` bigint COMMENT '修改人ID', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典数据表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典数据表'; -- ---------------------------- -- Records of sys_dict_data @@ -117,102 +117,102 @@ DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', `parent_id` bigint NOT NULL COMMENT '父菜单ID', - `tree_path` varchar(255) DEFAULT NULL COMMENT '父节点ID路径', - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单名称', + `tree_path` varchar(255) COMMENT '父节点ID路径', + `name` varchar(64) NOT NULL COMMENT '菜单名称', `type` tinyint NOT NULL COMMENT '菜单类型(1-菜单 2-目录 3-外链 4-按钮)', - `route_name` varchar(255) DEFAULT NULL COMMENT '路由名称(Vue Router 中用于命名路由)', - `route_path` varchar(128) DEFAULT '' COMMENT '路由路径(Vue Router 中定义的 URL 路径)', - `component` varchar(128) DEFAULT NULL COMMENT '组件路径(组件页面完整路径,相对于 src/views/,缺省后缀 .vue)', - `perm` varchar(128) DEFAULT NULL COMMENT '【按钮】权限标识', - `always_show` tinyint NULL DEFAULT 0 COMMENT '【目录】只有一个子路由是否始终显示(1-是 0-否)', - `keep_alive` tinyint NULL DEFAULT 0 COMMENT '【菜单】是否开启页面缓存(1-是 0-否)', - `visible` tinyint(1) NOT NULL DEFAULT 1 COMMENT '显示状态(1-显示 0-隐藏)', - `sort` int NULL DEFAULT 0 COMMENT '排序', - `icon` varchar(64) DEFAULT '' COMMENT '菜单图标', - `redirect` varchar(128) DEFAULT NULL COMMENT '跳转路径', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `route_name` varchar(255) COMMENT '路由名称(Vue Router 中用于命名路由)', + `route_path` varchar(128) COMMENT '路由路径(Vue Router 中定义的 URL 路径)', + `component` varchar(128) COMMENT '组件路径(组件页面完整路径,相对于 src/views/,缺省后缀 .vue)', + `perm` varchar(128) COMMENT '【按钮】权限标识', + `always_show` tinyint DEFAULT 0 COMMENT '【目录】只有一个子路由是否始终显示(1-是 0-否)', + `keep_alive` tinyint DEFAULT 0 COMMENT '【菜单】是否开启页面缓存(1-是 0-否)', + `visible` tinyint(1) DEFAULT 1 COMMENT '显示状态(1-显示 0-隐藏)', + `sort` int DEFAULT 0 COMMENT '排序', + `icon` varchar(64) COMMENT '菜单图标', + `redirect` varchar(128) COMMENT '跳转路径', + `create_time` datetime NULL COMMENT '创建时间', + `update_time` datetime NULL COMMENT '更新时间', `params` json NULL COMMENT '路由参数', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单管理'; -- ---------------------------- -- Records of sys_menu -- ---------------------------- -INSERT INTO `sys_menu` VALUES (1, 0, '0', '系统管理', 2, '', '/system', 'Layout', NULL, NULL, NULL, 1, 1, 'system', '/system/user', '2024-10-05 23:35:58', '2024-10-05 23:35:58', NULL); -INSERT INTO `sys_menu` VALUES (2, 1, '0,1', '用户管理', 1, 'User', 'user', 'system/user/index', NULL, NULL, 1, 1, 1, 'el-icon-User', NULL, '2024-10-05 23:35:59', '2024-10-05 23:35:59', NULL); -INSERT INTO `sys_menu` VALUES (3, 1, '0,1', '角色管理', 1, 'Role', 'role', 'system/role/index', NULL, NULL, 1, 1, 2, 'role', NULL, '2024-10-05 23:36:00', '2024-10-05 23:36:00', NULL); -INSERT INTO `sys_menu` VALUES (4, 1, '0,1', '菜单管理', 1, 'SysMenu', 'menu', 'system/menu/index', NULL, NULL, 1, 1, 3, 'menu', NULL, '2024-10-05 23:36:01', '2024-10-05 23:36:01', NULL); -INSERT INTO `sys_menu` VALUES (5, 1, '0,1', '部门管理', 1, 'Dept', 'dept', 'system/dept/index', NULL, NULL, 1, 1, 4, 'tree', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (6, 1, '0,1', '字典管理', 1, 'Dict', 'dict', 'system/dict/index', NULL, NULL, 1, 1, 5, 'dict', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (20, 0, '0', '多级菜单', 2, NULL, '/multi-level', 'Layout', NULL, 1, NULL, 1, 9, 'cascader', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (21, 20, '0,20', '菜单一级', 1, NULL, 'multi-level1', 'demo/multi-level/level1', NULL, 1, NULL, 1, 1, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (22, 21, '0,20,21', '菜单二级', 1, NULL, 'multi-level2', 'demo/multi-level/children/level2', NULL, 0, NULL, 1, 1, '', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (23, 22, '0,20,21,22', '菜单三级-1', 1, NULL, 'multi-level3-1', 'demo/multi-level/children/children/level3-1', NULL, 0, 1, 1, 1, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (24, 22, '0,20,21,22', '菜单三级-2', 1, NULL, 'multi-level3-2', 'demo/multi-level/children/children/level3-2', NULL, 0, 1, 1, 2, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (26, 0, '0', '平台文档', 2, '', '/doc', 'Layout', NULL, NULL, NULL, 1, 8, 'document', 'https://juejin.cn/post/7228990409909108793', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (30, 26, '0,26', '平台文档(外链)', 3, NULL, 'https://juejin.cn/post/7228990409909108793', '', NULL, NULL, NULL, 1, 2, 'link', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (31, 2, '0,1,2', '用户新增', 4, NULL, '', NULL, 'sys:user:add', NULL, NULL, 1, 1, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (32, 2, '0,1,2', '用户编辑', 4, NULL, '', NULL, 'sys:user:edit', NULL, NULL, 1, 2, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (33, 2, '0,1,2', '用户删除', 4, NULL, '', NULL, 'sys:user:delete', NULL, NULL, 1, 3, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (36, 0, '0', '组件封装', 2, NULL, '/component', 'Layout', NULL, NULL, NULL, 1, 10, 'menu', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); +INSERT INTO `sys_menu` VALUES (1, 0, '0', '系统管理', 2, '', '/system', 'Layout', NULL, NULL, NULL, 1, 1, 'system', '/system/user', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (2, 1, '0,1', '用户管理', 1, 'User', 'user', 'system/user/index', NULL, NULL, 1, 1, 1, 'el-icon-User', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (3, 1, '0,1', '角色管理', 1, 'Role', 'role', 'system/role/index', NULL, NULL, 1, 1, 2, 'role', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (4, 1, '0,1', '菜单管理', 1, 'SysMenu', 'menu', 'system/menu/index', NULL, NULL, 1, 1, 3, 'menu', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (5, 1, '0,1', '部门管理', 1, 'Dept', 'dept', 'system/dept/index', NULL, NULL, 1, 1, 4, 'tree', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (6, 1, '0,1', '字典管理', 1, 'Dict', 'dict', 'system/dict/index', NULL, NULL, 1, 1, 5, 'dict', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (20, 0, '0', '多级菜单', 2, NULL, '/multi-level', 'Layout', NULL, 1, NULL, 1, 9, 'cascader', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (21, 20, '0,20', '菜单一级', 1, NULL, 'multi-level1', 'demo/multi-level/level1', NULL, 1, NULL, 1, 1, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (22, 21, '0,20,21', '菜单二级', 1, NULL, 'multi-level2', 'demo/multi-level/children/level2', NULL, 0, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (23, 22, '0,20,21,22', '菜单三级-1', 1, NULL, 'multi-level3-1', 'demo/multi-level/children/children/level3-1', NULL, 0, 1, 1, 1, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (24, 22, '0,20,21,22', '菜单三级-2', 1, NULL, 'multi-level3-2', 'demo/multi-level/children/children/level3-2', NULL, 0, 1, 1, 2, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (26, 0, '0', '平台文档', 2, '', '/doc', 'Layout', NULL, NULL, NULL, 1, 8, 'document', 'https://juejin.cn/post/7228990409909108793', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (30, 26, '0,26', '平台文档(外链)', 3, NULL, 'https://juejin.cn/post/7228990409909108793', '', NULL, NULL, NULL, 1, 2, 'link', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (31, 2, '0,1,2', '用户新增', 4, NULL, '', NULL, 'sys:user:add', NULL, NULL, 1, 1, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (32, 2, '0,1,2', '用户编辑', 4, NULL, '', NULL, 'sys:user:edit', NULL, NULL, 1, 2, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (33, 2, '0,1,2', '用户删除', 4, NULL, '', NULL, 'sys:user:delete', NULL, NULL, 1, 3, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (36, 0, '0', '组件封装', 2, NULL, '/component', 'Layout', NULL, NULL, NULL, 1, 10, 'menu', '', now(), now(), NULL); INSERT INTO `sys_menu` VALUES (37, 36, '0,36', '富文本编辑器', 1, NULL, 'wang-editor', 'demo/wang-editor', NULL, NULL, 1, 1, 2, '', '', NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (38, 36, '0,36', '图片上传', 1, NULL, 'upload', 'demo/upload', NULL, NULL, 1, 1, 3, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (39, 36, '0,36', '图标选择器', 1, NULL, 'icon-selector', 'demo/icon-selector', NULL, NULL, 1, 1, 4, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (40, 0, '0', '接口文档', 2, NULL, '/api', 'Layout', NULL, 1, NULL, 1, 7, 'api', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (41, 40, '0,40', 'Apifox', 1, NULL, 'apifox', 'demo/api/apifox', NULL, NULL, 1, 1, 1, 'api', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (70, 3, '0,1,3', '角色新增', 4, NULL, '', NULL, 'sys:role:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (71, 3, '0,1,3', '角色编辑', 4, NULL, '', NULL, 'sys:role:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (72, 3, '0,1,3', '角色删除', 4, NULL, '', NULL, 'sys:role:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (73, 4, '0,1,4', '菜单新增', 4, NULL, '', NULL, 'sys:menu:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (74, 4, '0,1,4', '菜单编辑', 4, NULL, '', NULL, 'sys:menu:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (75, 4, '0,1,4', '菜单删除', 4, NULL, '', NULL, 'sys:menu:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (76, 5, '0,1,5', '部门新增', 4, NULL, '', NULL, 'sys:dept:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (77, 5, '0,1,5', '部门编辑', 4, NULL, '', NULL, 'sys:dept:edit', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (78, 5, '0,1,5', '部门删除', 4, NULL, '', NULL, 'sys:dept:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (79, 6, '0,1,6', '字典新增', 4, NULL, '', NULL, 'sys:dict:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (81, 6, '0,1,6', '字典编辑', 4, NULL, '', NULL, 'sys:dict:edit', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (84, 6, '0,1,6', '字典删除', 4, NULL, '', NULL, 'sys:dict:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (88, 2, '0,1,2', '重置密码', 4, NULL, '', NULL, 'sys:user:password:reset', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (89, 0, '0', '功能演示', 2, NULL, '/function', 'Layout', NULL, NULL, NULL, 1, 12, 'menu', '', '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (90, 89, '0,89', 'Websocket', 1, NULL, '/function/websocket', 'demo/websocket', NULL, NULL, 1, 1, 3, '', '', '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (91, 89, '0,89', '敬请期待...', 2, NULL, 'other/:id', 'demo/other', NULL, NULL, NULL, 1, 4, '', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (95, 36, '0,36', '字典组件', 1, NULL, 'dict-demo', 'demo/dictionary', NULL, NULL, 1, 1, 4, '', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (97, 89, '0,89', 'Icons', 1, NULL, 'icon-demo', 'demo/icons', NULL, NULL, 1, 1, 2, 'el-icon-Notification', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (102, 26, '0,26', 'document', 3, '', 'internal-doc', 'demo/internal-doc', NULL, NULL, NULL, 1, 1, 'document', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (105, 2, '0,1,2', '用户查询', 4, NULL, '', NULL, 'sys:user:query', 0, 0, 1, 0, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (106, 2, '0,1,2', '用户导入', 4, NULL, '', NULL, 'sys:user:import', NULL, NULL, 1, 5, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (107, 2, '0,1,2', '用户导出', 4, NULL, '', NULL, 'sys:user:export', NULL, NULL, 1, 6, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); +INSERT INTO `sys_menu` VALUES (38, 36, '0,36', '图片上传', 1, NULL, 'upload', 'demo/upload', NULL, NULL, 1, 1, 3, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (39, 36, '0,36', '图标选择器', 1, NULL, 'icon-selector', 'demo/icon-selector', NULL, NULL, 1, 1, 4, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (40, 0, '0', '接口文档', 2, NULL, '/api', 'Layout', NULL, 1, NULL, 1, 7, 'api', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (41, 40, '0,40', 'Apifox', 1, NULL, 'apifox', 'demo/api/apifox', NULL, NULL, 1, 1, 1, 'api', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (70, 3, '0,1,3', '角色新增', 4, NULL, '', NULL, 'sys:role:add', NULL, NULL, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (71, 3, '0,1,3', '角色编辑', 4, NULL, '', NULL, 'sys:role:edit', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (72, 3, '0,1,3', '角色删除', 4, NULL, '', NULL, 'sys:role:delete', NULL, NULL, 1, 4, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (73, 4, '0,1,4', '菜单新增', 4, NULL, '', NULL, 'sys:menu:add', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (74, 4, '0,1,4', '菜单编辑', 4, NULL, '', NULL, 'sys:menu:edit', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (75, 4, '0,1,4', '菜单删除', 4, NULL, '', NULL, 'sys:menu:delete', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (76, 5, '0,1,5', '部门新增', 4, NULL, '', NULL, 'sys:dept:add', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (77, 5, '0,1,5', '部门编辑', 4, NULL, '', NULL, 'sys:dept:edit', NULL, NULL, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (78, 5, '0,1,5', '部门删除', 4, NULL, '', NULL, 'sys:dept:delete', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (79, 6, '0,1,6', '字典新增', 4, NULL, '', NULL, 'sys:dict:add', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (81, 6, '0,1,6', '字典编辑', 4, NULL, '', NULL, 'sys:dict:edit', NULL, NULL, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (84, 6, '0,1,6', '字典删除', 4, NULL, '', NULL, 'sys:dict:delete', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (88, 2, '0,1,2', '重置密码', 4, NULL, '', NULL, 'sys:user:password:reset', NULL, NULL, 1, 4, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (89, 0, '0', '功能演示', 2, NULL, '/function', 'Layout', NULL, NULL, NULL, 1, 12, 'menu', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (90, 89, '0,89', 'Websocket', 1, NULL, '/function/websocket', 'demo/websocket', NULL, NULL, 1, 1, 3, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (91, 89, '0,89', '敬请期待...', 2, NULL, 'other/:id', 'demo/other', NULL, NULL, NULL, 1, 4, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (95, 36, '0,36', '字典组件', 1, NULL, 'dict-demo', 'demo/dictionary', NULL, NULL, 1, 1, 4, '', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (97, 89, '0,89', 'Icons', 1, NULL, 'icon-demo', 'demo/icons', NULL, NULL, 1, 1, 2, 'el-icon-Notification', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (102, 26, '0,26', 'document', 3, '', 'internal-doc', 'demo/internal-doc', NULL, NULL, NULL, 1, 1, 'document', '', now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (105, 2, '0,1,2', '用户查询', 4, NULL, '', NULL, 'sys:user:query', 0, 0, 1, 0, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (106, 2, '0,1,2', '用户导入', 4, NULL, '', NULL, 'sys:user:import', NULL, NULL, 1, 5, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (107, 2, '0,1,2', '用户导出', 4, NULL, '', NULL, 'sys:user:export', NULL, NULL, 1, 6, '', NULL, now(), now(), NULL); INSERT INTO `sys_menu` VALUES (108, 36, '0,36', '增删改查', 1, NULL, 'curd', 'demo/curd/index', NULL, NULL, 1, 1, 0, '', '', NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (109, 36, '0,36', '列表选择器', 1, NULL, 'table-select', 'demo/table-select/index', NULL, NULL, 1, 1, 1, '', '', NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (110, 0, '0', '路由参数', 2, NULL, '/route-param', 'Layout', NULL, 1, 1, 1, 11, 'el-icon-ElementPlus', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (111, 110, '0,110', '参数(type=1)', 1, NULL, 'route-param-type1', 'demo/route-param', NULL, 0, 1, 1, 1, 'el-icon-Star', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', '{\"type\": \"1\"}'); -INSERT INTO `sys_menu` VALUES (112, 110, '0,110', '参数(type=2)', 1, NULL, 'route-param-type2', 'demo/route-param', NULL, 0, 1, 1, 2, 'el-icon-StarFilled', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', '{\"type\": \"2\"}'); -INSERT INTO `sys_menu` VALUES (117, 1, '0,1', '系统日志', 1, 'Log', 'log', 'system/log/index', NULL, 0, 1, 1, 6, 'document', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/codegen', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成', 1, 'Codegen', 'codegen', 'codegen/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (120, 1, '0,1', '系统配置', 1, 'Config', 'config', 'system/config/index', NULL, 0, 1, 1, 7, 'setting', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (121, 120, '0,1,120', '系统配置查询', 4, NULL, '', NULL, 'sys:config:query', 0, 1, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (122, 120, '0,1,120', '系统配置新增', 4, NULL, '', NULL, 'sys:config:add', 0, 1, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (123, 120, '0,1,120', '系统配置修改', 4, NULL, '', NULL, 'sys:config:update', 0, 1, 1, 3, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (124, 120, '0,1,120', '系统配置删除', 4, NULL, '', NULL, 'sys:config:delete', 0, 1, 1, 4, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (125, 120, '0,1,120', '系统配置刷新', 4, NULL, '', NULL, 'sys:config:refresh', 0, 1, 1, 5, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (126, 1, '0,1', '通知公告', 1, 'Notice', 'notice', 'system/notice/index', NULL, NULL, NULL, 1, 9, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (127, 126, '0,1,126', '通知查询', 4, NULL, '', NULL, 'sys:notice:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (128, 126, '0,1,126', '通知新增', 4, NULL, '', NULL, 'sys:notice:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (129, 126, '0,1,126', '通知编辑', 4, NULL, '', NULL, 'sys:notice:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (130, 126, '0,1,126', '通知删除', 4, NULL, '', NULL, 'sys:notice:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (133, 126, '0,1,126', '通知发布', 4, NULL, '', NULL, 'sys:notice:publish', 0, 1, 1, 5, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (134, 126, '0,1,126', '通知撤回', 4, NULL, '', NULL, 'sys:notice:revoke', 0, 1, 1, 6, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (135, 1, '0,1', '字典数据', 1, 'DictData', 'dict-data', 'system/dict/data', NULL, 0, 1, 0, 6, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (136, 135, '0,1,135', '字典数据新增', 4, NULL, '', NULL, 'sys:dict-data:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (137, 135, '0,1,135', '字典数据编辑', 4, NULL, '', NULL, 'sys:dict-data:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:09', '2024-10-05 23:36:09', NULL); -INSERT INTO `sys_menu` VALUES (138, 135, '0,1,135', '字典数据删除', 4, NULL, '', NULL, 'sys:dict-data:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:09', '2024-10-05 23:36:09', NULL); -INSERT INTO `sys_menu` VALUES (139, 3, '0,1,3', '角色查询', 4, NULL, '', NULL, 'sys:role:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (140, 4, '0,1,4', '菜单查询', 4, NULL, '', NULL, 'sys:menu:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (141, 5, '0,1,5', '部门查询', 4, NULL, '', NULL, 'sys:dept:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (142, 6, '0,1,6', '字典查询', 4, NULL, '', NULL, 'sys:dict:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (143, 135, '0,1,135', '字典数据查询', 4, NULL, '', NULL, 'sys:dict-data:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); +INSERT INTO `sys_menu` VALUES (110, 0, '0', '路由参数', 2, NULL, '/route-param', 'Layout', NULL, 1, 1, 1, 11, 'el-icon-ElementPlus', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (111, 110, '0,110', '参数(type=1)', 1, NULL, 'route-param-type1', 'demo/route-param', NULL, 0, 1, 1, 1, 'el-icon-Star', NULL, now(), now(), '{\"type\": \"1\"}'); +INSERT INTO `sys_menu` VALUES (112, 110, '0,110', '参数(type=2)', 1, NULL, 'route-param-type2', 'demo/route-param', NULL, 0, 1, 1, 2, 'el-icon-StarFilled', NULL, now(), now(), '{\"type\": \"2\"}'); +INSERT INTO `sys_menu` VALUES (117, 1, '0,1', '系统日志', 1, 'Log', 'log', 'system/log/index', NULL, 0, 1, 1, 6, 'document', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/codegen', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成', 1, 'Codegen', 'codegen', 'codegen/index', NULL, 0, 1, 1, 1, 'code', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (120, 1, '0,1', '系统配置', 1, 'Config', 'config', 'system/config/index', NULL, 0, 1, 1, 7, 'setting', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (121, 120, '0,1,120', '系统配置查询', 4, NULL, '', NULL, 'sys:config:query', 0, 1, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (122, 120, '0,1,120', '系统配置新增', 4, NULL, '', NULL, 'sys:config:add', 0, 1, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (123, 120, '0,1,120', '系统配置修改', 4, NULL, '', NULL, 'sys:config:update', 0, 1, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (124, 120, '0,1,120', '系统配置删除', 4, NULL, '', NULL, 'sys:config:delete', 0, 1, 1, 4, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (125, 120, '0,1,120', '系统配置刷新', 4, NULL, '', NULL, 'sys:config:refresh', 0, 1, 1, 5, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (126, 1, '0,1', '通知公告', 1, 'Notice', 'notice', 'system/notice/index', NULL, NULL, NULL, 1, 9, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (127, 126, '0,1,126', '通知查询', 4, NULL, '', NULL, 'sys:notice:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (128, 126, '0,1,126', '通知新增', 4, NULL, '', NULL, 'sys:notice:add', NULL, NULL, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (129, 126, '0,1,126', '通知编辑', 4, NULL, '', NULL, 'sys:notice:edit', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (130, 126, '0,1,126', '通知删除', 4, NULL, '', NULL, 'sys:notice:delete', NULL, NULL, 1, 4, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (133, 126, '0,1,126', '通知发布', 4, NULL, '', NULL, 'sys:notice:publish', 0, 1, 1, 5, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (134, 126, '0,1,126', '通知撤回', 4, NULL, '', NULL, 'sys:notice:revoke', 0, 1, 1, 6, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (135, 1, '0,1', '字典数据', 1, 'DictData', 'dict-data', 'system/dict/data', NULL, 0, 1, 0, 6, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (136, 135, '0,1,135', '字典数据新增', 4, NULL, '', NULL, 'sys:dict-data:add', NULL, NULL, 1, 2, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (137, 135, '0,1,135', '字典数据编辑', 4, NULL, '', NULL, 'sys:dict-data:edit', NULL, NULL, 1, 3, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (138, 135, '0,1,135', '字典数据删除', 4, NULL, '', NULL, 'sys:dict-data:delete', NULL, NULL, 1, 4, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (139, 3, '0,1,3', '角色查询', 4, NULL, '', NULL, 'sys:role:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (140, 4, '0,1,4', '菜单查询', 4, NULL, '', NULL, 'sys:menu:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (141, 5, '0,1,5', '部门查询', 4, NULL, '', NULL, 'sys:dept:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (142, 6, '0,1,6', '字典查询', 4, NULL, '', NULL, 'sys:dict:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); +INSERT INTO `sys_menu` VALUES (143, 135, '0,1,135', '字典数据查询', 4, NULL, '', NULL, 'sys:dict-data:query', NULL, NULL, 1, 1, '', NULL, now(), now(), NULL); -- ---------------------------- -- Table structure for sys_role @@ -220,36 +220,36 @@ INSERT INTO `sys_menu` VALUES (143, 135, '0,1,135', '字典数据查询', 4, NUL DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `id` bigint NOT NULL AUTO_INCREMENT, - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名称', - `code` varchar(32) NOT NULL COMMENT '角色编码', - `sort` int NULL DEFAULT NULL COMMENT '显示顺序', - `status` tinyint(1) NULL DEFAULT 1 COMMENT '角色状态(1-正常 0-停用)', - `data_scope` tinyint NULL DEFAULT NULL COMMENT '数据权限(0-所有数据 1-部门及子部门数据 2-本部门数据3-本人数据)', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人 ID', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '更新人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', + `name` varchar(64) NOT NULL COMMENT '角色名称', + `code` varchar(32) NOT NULL COMMENT '角色编码', + `sort` int NULL COMMENT '显示顺序', + `status` tinyint(1) DEFAULT 1 COMMENT '角色状态(1-正常 0-停用)', + `data_scope` tinyint NULL COMMENT '数据权限(0-所有数据 1-部门及子部门数据 2-本部门数据3-本人数据)', + `create_by` bigint NULL COMMENT '创建人 ID', + `create_time` datetime NULL COMMENT '创建时间', + `update_by` bigint NULL COMMENT '更新人ID', + `update_time` datetime NULL COMMENT '更新时间', + `is_deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_name`(`name` ASC) USING BTREE COMMENT '角色名称唯一索引', UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '角色编码唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色表'; -- ---------------------------- -- Records of sys_role -- ---------------------------- -INSERT INTO `sys_role` VALUES (1, '超级管理员', 'ROOT', 1, 1, 0, NULL, '2021-05-21 14:56:51', NULL, '2018-12-23 16:00:00', 0); -INSERT INTO `sys_role` VALUES (2, '系统管理员', 'ADMIN', 2, 1, 0, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (3, '访问游客', 'GUEST', 3, 1, 2, NULL, '2021-05-26 15:49:05', NULL, '2019-05-05 16:00:00', 0); -INSERT INTO `sys_role` VALUES (4, '系统管理员1', 'ADMIN1', 4, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (5, '系统管理员2', 'ADMIN2', 5, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (6, '系统管理员3', 'ADMIN3', 6, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (7, '系统管理员4', 'ADMIN4', 7, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (8, '系统管理员5', 'ADMIN5', 8, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (9, '系统管理员6', 'ADMIN6', 9, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (10, '系统管理员7', 'ADMIN7', 10, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (11, '系统管理员8', 'ADMIN8', 11, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (12, '系统管理员9', 'ADMIN9', 12, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (1, '超级管理员', 'ROOT', 1, 1, 0, NULL, now(), NULL, now(), 0); +INSERT INTO `sys_role` VALUES (2, '系统管理员', 'ADMIN', 2, 1, 0, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (3, '访问游客', 'GUEST', 3, 1, 2, NULL, now(), NULL, now(), 0); +INSERT INTO `sys_role` VALUES (4, '系统管理员1', 'ADMIN1', 4, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (5, '系统管理员2', 'ADMIN2', 5, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (6, '系统管理员3', 'ADMIN3', 6, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (7, '系统管理员4', 'ADMIN4', 7, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (8, '系统管理员5', 'ADMIN5', 8, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (9, '系统管理员6', 'ADMIN6', 9, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (10, '系统管理员7', 'ADMIN7', 10, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (11, '系统管理员8', 'ADMIN8', 11, 1, 1, NULL, now(), NULL, NULL, 0); +INSERT INTO `sys_role` VALUES (12, '系统管理员9', 'ADMIN9', 12, 1, 1, NULL, now(), NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_role_menu @@ -259,7 +259,7 @@ CREATE TABLE `sys_role_menu` ( `role_id` bigint NOT NULL COMMENT '角色ID', `menu_id` bigint NOT NULL COMMENT '菜单ID', UNIQUE INDEX `uk_roleid_menuid`(`role_id` ASC, `menu_id` ASC) USING BTREE COMMENT '角色菜单唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; -- ---------------------------- -- Records of sys_role_menu @@ -346,37 +346,38 @@ INSERT INTO `sys_role_menu` VALUES (2, 140); INSERT INTO `sys_role_menu` VALUES (2, 141); INSERT INTO `sys_role_menu` VALUES (2, 142); INSERT INTO `sys_role_menu` VALUES (2, 143); + -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT, - `username` varchar(64) DEFAULT NULL COMMENT '用户名', - `nickname` varchar(64) DEFAULT NULL COMMENT '昵称', - `gender` tinyint(1) NULL DEFAULT 1 COMMENT '性别((1-男 2-女 0-保密)', - `password` varchar(100) DEFAULT NULL COMMENT '密码', - `dept_id` int NULL DEFAULT NULL COMMENT '部门ID', - `avatar` varchar(255) DEFAULT '' COMMENT '用户头像', - `mobile` varchar(20) DEFAULT NULL COMMENT '联系方式', - `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态((1-正常 0-禁用)', - `email` varchar(128) DEFAULT NULL COMMENT '用户邮箱', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '修改人ID', - `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', - `openid` char(28) DEFAULT NULL COMMENT '微信 openid', + `username` varchar(64) COMMENT '用户名', + `nickname` varchar(64) COMMENT '昵称', + `gender` tinyint(1) DEFAULT 1 COMMENT '性别((1-男 2-女 0-保密)', + `password` varchar(100) COMMENT '密码', + `dept_id` int COMMENT '部门ID', + `avatar` varchar(255) COMMENT '用户头像', + `mobile` varchar(20) COMMENT '联系方式', + `status` tinyint(1) DEFAULT 1 COMMENT '状态(1-正常 0-禁用)', + `email` varchar(128) COMMENT '用户邮箱', + `create_time` datetime COMMENT '创建时间', + `create_by` bigint COMMENT '创建人ID', + `update_time` datetime COMMENT '更新时间', + `update_by` bigint COMMENT '修改人ID', + `is_deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', + `openid` char(28) COMMENT '微信 openid', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `login_name`(`username` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表'; -- ---------------------------- -- Records of sys_user -- ---------------------------- -INSERT INTO `sys_user` VALUES (1, 'root', '有来技术', 0, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', NULL, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345677', 1, 'youlaitech@163.com', NULL, NULL, NULL, NULL, 0,NULL); -INSERT INTO `sys_user` VALUES (2, 'admin', '系统管理员', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 1, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345678', 1, '', '2019-10-10 13:41:22', NULL, '2022-07-31 12:39:30', NULL, 0,NULL); -INSERT INTO `sys_user` VALUES (3, 'test', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345679', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0,NULL); +INSERT INTO `sys_user` VALUES (1, 'root', '有来技术', 0, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', NULL, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345677', 1, 'youlaitech@163.com', now(), NULL, now(), NULL, 0,NULL); +INSERT INTO `sys_user` VALUES (2, 'admin', '系统管理员', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 1, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345678', 1, 'youlaitech@163.com', now(), NULL, now(), NULL, 0,NULL); +INSERT INTO `sys_user` VALUES (3, 'test', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345679', 1, 'youlaitech@163.com', now(), NULL, now(), NULL, 0,NULL); -- ---------------------------- -- Table structure for sys_user_role @@ -386,7 +387,7 @@ CREATE TABLE `sys_user_role` ( `user_id` bigint NOT NULL COMMENT '用户ID', `role_id` bigint NOT NULL COMMENT '角色ID', PRIMARY KEY (`user_id`, `role_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表'; -- ---------------------------- -- Records of sys_user_role @@ -402,26 +403,26 @@ INSERT INTO `sys_user_role` VALUES (3, 3); DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `module` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志模块', - `request_method` varchar(64) NOT NULL DEFAULT '' COMMENT '请求方式', - `request_params` text COMMENT '请求参数(批量请求参数可能会超过text)', - `response_content` mediumtext COMMENT '返回参数', - `content` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志内容', - `request_uri` varchar(255) DEFAULT NULL COMMENT '请求路径', - `method` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '方法名', - `ip` varchar(45) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'IP地址', - `province` varchar(100) DEFAULT NULL COMMENT '省份', - `city` varchar(100) DEFAULT NULL COMMENT '城市', - `execution_time` bigint DEFAULT NULL COMMENT '执行时间(ms)', - `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', - `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', - `os` varchar(100) DEFAULT NULL COMMENT '终端系统', - `create_by` bigint DEFAULT NULL COMMENT '创建人ID', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', + `module` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志模块', + `request_method` varchar(64) NOT NULL COMMENT '请求方式', + `request_params` text COMMENT '请求参数(批量请求参数可能会超过text)', + `response_content` mediumtext COMMENT '返回参数', + `content` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志内容', + `request_uri` varchar(255) COMMENT '请求路径', + `method` varchar(255) CHARACTER SET utf8mb4 COMMENT '方法名', + `ip` varchar(45) CHARACTER SET utf8mb4 COMMENT 'IP地址', + `province` varchar(100) COMMENT '省份', + `city` varchar(100) COMMENT '城市', + `execution_time` bigint COMMENT '执行时间(ms)', + `browser` varchar(100) COMMENT '浏览器', + `browser_version` varchar(100) COMMENT '浏览器版本', + `os` varchar(100) COMMENT '终端系统', + `create_by` bigint COMMENT '创建人ID', + `create_time` datetime COMMENT '创建时间', + `is_deleted` tinyint DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_create_time` (`create_time`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统日志表'; +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表'; -- ---------------------------- -- Table structure for gen_config @@ -429,19 +430,19 @@ CREATE TABLE `sys_log` ( DROP TABLE IF EXISTS `gen_config`; CREATE TABLE `gen_config` ( `id` bigint NOT NULL AUTO_INCREMENT, - `table_name` varchar(100) NOT NULL COMMENT '表名', - `module_name` varchar(100) DEFAULT NULL COMMENT '模块名', - `package_name` varchar(255) NOT NULL COMMENT '包名', - `business_name` varchar(100) NOT NULL COMMENT '业务名', - `entity_name` varchar(100) NOT NULL COMMENT '实体类名', - `author` varchar(50) NOT NULL COMMENT '作者', - `parent_menu_id` bigint DEFAULT NULL COMMENT '上级菜单ID,对应sys_menu的id ', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `is_deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `table_name` varchar(100) NOT NULL COMMENT '表名', + `module_name` varchar(100) COMMENT '模块名', + `package_name` varchar(255) NOT NULL COMMENT '包名', + `business_name` varchar(100) NOT NULL COMMENT '业务名', + `entity_name` varchar(100) NOT NULL COMMENT '实体类名', + `author` varchar(50) NOT NULL COMMENT '作者', + `parent_menu_id` bigint COMMENT '上级菜单ID,对应sys_menu的id ', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', + `is_deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_tablename` (`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成基础配置表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码生成基础配置表'; -- ---------------------------- -- Table structure for gen_field_config @@ -450,26 +451,26 @@ DROP TABLE IF EXISTS `gen_field_config`; CREATE TABLE `gen_field_config` ( `id` bigint NOT NULL AUTO_INCREMENT, `config_id` bigint NOT NULL COMMENT '关联的配置ID', - `column_name` varchar(100) DEFAULT NULL, - `column_type` varchar(50) DEFAULT NULL, - `column_length` int DEFAULT NULL, - `field_name` varchar(100) NOT NULL COMMENT '字段名称', - `field_type` varchar(100) DEFAULT NULL COMMENT '字段类型', - `field_sort` int DEFAULT NULL COMMENT '字段排序', - `field_comment` varchar(255) DEFAULT NULL COMMENT '字段描述', - `max_length` int NULL DEFAULT NULL, - `is_required` tinyint(1) DEFAULT NULL COMMENT '是否必填', + `column_name` varchar(100) , + `column_type` varchar(50) , + `column_length` int , + `field_name` varchar(100) NOT NULL COMMENT '字段名称', + `field_type` varchar(100) COMMENT '字段类型', + `field_sort` int COMMENT '字段排序', + `field_comment` varchar(255) COMMENT '字段描述', + `max_length` int , + `is_required` tinyint(1) COMMENT '是否必填', `is_show_in_list` tinyint(1) DEFAULT '0' COMMENT '是否在列表显示', `is_show_in_form` tinyint(1) DEFAULT '0' COMMENT '是否在表单显示', `is_show_in_query` tinyint(1) DEFAULT '0' COMMENT '是否在查询条件显示', - `query_type` tinyint DEFAULT NULL COMMENT '查询方式', - `form_type` tinyint DEFAULT NULL COMMENT '表单类型', - `dict_type` varchar(50) DEFAULT NULL COMMENT '字典类型', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `query_type` tinyint COMMENT '查询方式', + `form_type` tinyint COMMENT '表单类型', + `dict_type` varchar(50) COMMENT '字典类型', + `create_time` datetime COMMENT '创建时间', + `update_time` datetime COMMENT '更新时间', PRIMARY KEY (`id`), KEY `config_id` (`config_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成字段配置表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码生成字段配置表'; -- ---------------------------- -- 系统配置表 @@ -480,11 +481,11 @@ CREATE TABLE `sys_config` ( `config_name` varchar(50) NOT NULL COMMENT '配置名称', `config_key` varchar(50) NOT NULL COMMENT '配置key', `config_value` varchar(100) NOT NULL COMMENT '配置值', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `remark` varchar(255) COMMENT '备注', `create_time` datetime COMMENT '创建时间', `create_by` bigint COMMENT '创建人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `update_by` bigint DEFAULT NULL COMMENT '更新人ID', + `update_time` datetime COMMENT '更新时间', + `update_by` bigint COMMENT '更新人ID', `is_deleted` tinyint(4) DEFAULT '0' NOT NULL COMMENT '逻辑删除标识(0-未删除 1-已删除)', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='系统配置表'; @@ -497,40 +498,61 @@ INSERT INTO `sys_config` VALUES (1, '系统限流QPS', 'IP_QPS_THRESHOLD_LIMIT', DROP TABLE IF EXISTS `sys_notice`; CREATE TABLE `sys_notice` ( `id` bigint NOT NULL AUTO_INCREMENT, - `title` varchar(50) DEFAULT NULL COMMENT '通知标题', - `content` text COMMENT '通知内容', + `title` varchar(50) COMMENT '通知标题', + `content` text COMMENT '通知内容', `type` tinyint NOT NULL COMMENT '通知类型(关联字典编码:notice_type)', - `level` varchar(5) NOT NULL COMMENT '通知等级(字典code:notice_level)', + `level` varchar(5) NOT NULL COMMENT '通知等级(字典code:notice_level)', `target_type` tinyint NOT NULL COMMENT '目标类型(1: 全体, 2: 指定)', - `target_user_ids` varchar(255) DEFAULT NULL COMMENT '目标人ID集合(多个使用英文逗号,分割)', - `publisher_id` bigint DEFAULT NULL COMMENT '发布人ID', - `publish_status` tinyint NOT NULL DEFAULT '0' COMMENT '发布状态(0: 未发布, 1: 已发布, -1: 已撤回)', - `publish_time` datetime DEFAULT NULL COMMENT '发布时间', - `revoke_time` datetime DEFAULT NULL COMMENT '撤回时间', + `target_user_ids` varchar(255) COMMENT '目标人ID集合(多个使用英文逗号,分割)', + `publisher_id` bigint COMMENT '发布人ID', + `publish_status` tinyint DEFAULT '0' COMMENT '发布状态(0: 未发布, 1: 已发布, -1: 已撤回)', + `publish_time` datetime COMMENT '发布时间', + `revoke_time` datetime COMMENT '撤回时间', `create_by` bigint NOT NULL COMMENT '创建人ID', `create_time` datetime NOT NULL COMMENT '创建时间', - `update_by` bigint DEFAULT NULL COMMENT '更新人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除(0: 未删除, 1: 已删除)', + `update_by` bigint COMMENT '更新人ID', + `update_time` datetime COMMENT '更新时间', + `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除(0: 未删除, 1: 已删除)', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通知公告表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知公告表'; +INSERT INTO `sys_notice` VALUES (1, 'v2.12.0 新增系统日志,访问趋势统计功能。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 1, 1, now(), now(), 2, now(), 1, now(), 0); +INSERT INTO `sys_notice` VALUES (2, 'v2.13.0 新增菜单搜索。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 1, 1, now(), now(), 2, now(), 1, now(), 0); +INSERT INTO `sys_notice` VALUES (3, 'v2.14.0 新增个人中心。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (4, 'v2.15.0 登录页面改造。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (5, 'v2.16.0 通知公告、字典翻译组件。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (6, '系统将于本周六凌晨 2 点进行维护,预计维护时间为 2 小时。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 2, 'H', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (7, '最近发现一些钓鱼邮件,请大家提高警惕,不要点击陌生链接。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 3, 'L', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (8, '国庆假期从 10 月 1 日至 10 月 7 日放假,共 7 天。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 4, 'L', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (9, '公司将在 10 月 15 日举办新产品发布会,敬请期待。', '公司将在 10 月 15 日举办新产品发布会,敬请期待。', 5, 'H', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); +INSERT INTO `sys_notice` VALUES (10, 'v2.16.1 版本发布。', 'v2.16.1 版本修复了 WebSocket 重复连接导致的后台线程阻塞问题,优化了通知公告。', 1, 'M', 1, '2', 2, 1, now(), now(), 2, now(), 2, now(), 0); + +-- ---------------------------- -- 用户通知公告表 +-- ---------------------------- DROP TABLE IF EXISTS `sys_user_notice`; CREATE TABLE `sys_user_notice` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', `notice_id` bigint NOT NULL COMMENT '公共通知id', `user_id` bigint NOT NULL COMMENT '用户id', - `is_read` bigint NOT NULL DEFAULT '0' COMMENT '读取状态(0: 未读, 1: 已读)', - `read_time` datetime DEFAULT NULL COMMENT '阅读时间', + `is_read` bigint DEFAULT '0' COMMENT '读取状态(0: 未读, 1: 已读)', + `read_time` datetime COMMENT '阅读时间', `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除(0: 未删除, 1: 已删除)', + `update_time` datetime COMMENT '更新时间', + `is_deleted` tinyint DEFAULT '0' COMMENT '逻辑删除(0: 未删除, 1: 已删除)', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户通知公告表'; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户通知公告表'; +INSERT INTO `sys_user_notice` VALUES (1, 1, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (2, 2, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (3, 3, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (4, 4, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (5, 5, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (6, 6, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (7, 7, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (8, 8, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (9, 9, 2, 1, NULL, now(), now(), 0); +INSERT INTO `sys_user_notice` VALUES (10, 10, 2, 1, NULL, now(), now(), 0); SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql deleted file mode 100644 index 2459df40..00000000 --- a/sql/mysql5/youlai_boot.sql +++ /dev/null @@ -1,531 +0,0 @@ - -# YouLai_Boot 数据库(MySQL 5.x) -# Copyright (c) 2021-present, youlai.tech - --- ---------------------------- --- 1. 创建数据库 --- ---------------------------- -CREATE DATABASE IF NOT EXISTS youlai_boot DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; - --- ---------------------------- --- 2. 创建表 && 数据初始化 --- ---------------------------- -use youlai_boot; - -SET NAMES utf8; -SET FOREIGN_KEY_CHECKS = 0; - - -- 开启事务 -START TRANSACTION; - --- ---------------------------- --- Table structure for sys_config --- ---------------------------- -DROP TABLE IF EXISTS `sys_config`; -CREATE TABLE `sys_config` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `config_name` varchar(50) NOT NULL COMMENT '配置名称', - `config_key` varchar(50) NOT NULL COMMENT '配置key', - `config_value` varchar(100) NOT NULL COMMENT '配置值', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `create_time` datetime NOT NULL COMMENT '创建时间', - `create_by` bigint NOT NULL COMMENT '创建人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `update_by` bigint DEFAULT NULL COMMENT '更新人ID', - `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(0-未删除 1-已删除)', - PRIMARY KEY (`id`) -) ENGINE=InnoDB COMMENT='系统配置'; - -INSERT INTO `sys_config` VALUES (1, '系统限流QPS', 'IP_QPS_THRESHOLD_LIMIT', '10', '单个IP请求的最大每秒查询数(QPS)阈值Key', now(), 1, NULL, NULL, 0); - --- ---------------------------- --- Table structure for sys_dept --- ---------------------------- -DROP TABLE IF EXISTS `sys_dept`; -CREATE TABLE `sys_dept` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '部门名称', - `code` varchar(100) NOT NULL COMMENT '部门编号', - `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父节点id', - `tree_path` varchar(255) NOT NULL DEFAULT '' COMMENT '父节点id路径', - `sort` smallint NULL DEFAULT 0 COMMENT '显示顺序', - `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态(1-正常 0-禁用)', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人ID', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '修改人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除标识(1-已删除 0-未删除)', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '部门编号唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_dept --- ---------------------------- -INSERT INTO `sys_dept` VALUES (1, '有来技术', 'YOULAI', 0, '0', 1, 1, 1, NULL, 1, '2024-06-24 23:48:59', 0); -INSERT INTO `sys_dept` VALUES (2, '研发部门', 'RD001', 1, '0,1', 1, 1, 2, NULL, 2, '2022-04-19 12:46:37', 0); -INSERT INTO `sys_dept` VALUES (3, '测试部门', 'QA001', 1, '0,1', 1, 1, 2, NULL, 2, '2022-04-19 12:46:37', 0); - --- ---------------------------- --- Table structure for sys_dict --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict`; -CREATE TABLE `sys_dict` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键 ', - `dict_code` varchar(50) DEFAULT '' COMMENT '字典编码', - `name` varchar(50) DEFAULT '' COMMENT '类型编码', - `status` tinyint(1) DEFAULT '0' COMMENT '状态(0:正常,1:禁用)', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(0:未删除,1:已删除)', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='系统字典表'; - --- ---------------------------- --- Records of sys_dict --- ---------------------------- -INSERT INTO `sys_dict` VALUES (1, 'gender', '性别', 1, NULL, now() , now(), 0); -INSERT INTO `sys_dict` VALUES (2, 'notice_type', '通知类型', 1, NULL, now(), now(), 0); -INSERT INTO `sys_dict` VALUES (3, 'notice_level', '通知级别', 1, NULL, now(), now(), 0); - - --- ---------------------------- --- Table structure for sys_dict_data --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_data`; -CREATE TABLE `sys_dict_data` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `dict_code` varchar(50) DEFAULT NULL COMMENT '关联字典编码,与sys_dict表中的dict_code对应', - `value` varchar(50) DEFAULT '' COMMENT '字典项值', - `label` varchar(100) DEFAULT '' COMMENT '字典项标签', - `tag_type` varchar(50) COLLATE utf8_general_ci DEFAULT NULL COMMENT '标签类型,用于前端样式展示(如success、warning等)', - `status` tinyint DEFAULT '0' COMMENT '状态(1-正常,0-禁用)', - `sort` int DEFAULT '0' COMMENT '排序', - `remark` varchar(255) DEFAULT '' COMMENT '备注', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='字典数据表'; - --- ---------------------------- --- Records of sys_dict_data --- ---------------------------- -INSERT INTO `sys_dict_data` VALUES (1, 'gender', '1', '男', 'primary', 1, 1, NULL, now(), now()); -INSERT INTO `sys_dict_data` VALUES (2, 'gender', '2', '女', 'danger', 1, 2, NULL, now(), now()); -INSERT INTO `sys_dict_data` VALUES (3, 'gender', '0', '保密', 'info', 1, 3, NULL, now(), now()); -INSERT INTO `sys_dict_data` VALUES (4, 'notice_type', '1', '系统升级', 'success', 1, 1, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (5, 'notice_type', '2', '系统维护', 'primary', 1, 2, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (6, 'notice_type', '3', '安全警告', 'danger', 1, 3, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (7, 'notice_type', '4', '假期通知', 'success', 1, 4, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (8, 'notice_type', '5', '公司新闻', 'primary', 1, 5, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (9, 'notice_type', '99', '其他', 'info', 1, 99, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (10, 'notice_level', 'L', '低', 'info', 1, 1, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (11, 'notice_level', 'M', '中', 'warning', 1, 2, '', now(), now()); -INSERT INTO `sys_dict_data` VALUES (12, 'notice_level', 'H', '高', 'danger', 1, 3, '', now(), now()); - --- ---------------------------- --- Table structure for sys_log --- ---------------------------- -DROP TABLE IF EXISTS `sys_log`; -CREATE TABLE `sys_log` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `module` varchar(50) NOT NULL COMMENT '日志模块', - `request_method` varchar(64) NOT NULL DEFAULT '' COMMENT '请求方式', - `request_params` text COMMENT '请求参数(批量请求参数可能会超过text)', - `response_content` mediumtext COMMENT '返回参数', - `content` varchar(255) NOT NULL COMMENT '日志内容', - `request_uri` varchar(255) DEFAULT NULL COMMENT '请求路径', - `method` varchar(255) DEFAULT NULL COMMENT '方法名', - `ip` varchar(45) DEFAULT NULL COMMENT 'IP地址', - `province` varchar(100) DEFAULT NULL COMMENT '省份', - `city` varchar(100) DEFAULT NULL COMMENT '城市', - `execution_time` bigint DEFAULT NULL COMMENT '执行时间(ms)', - `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', - `browser_version` varchar(100) DEFAULT NULL COMMENT '浏览器版本', - `os` varchar(100) DEFAULT NULL COMMENT '终端系统', - `create_by` bigint DEFAULT NULL COMMENT '创建人ID', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_create_time` (`create_time`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统日志表'; - --- ---------------------------- --- Table structure for sys_menu --- ---------------------------- -DROP TABLE IF EXISTS `sys_menu`; -CREATE TABLE `sys_menu` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', - `parent_id` bigint NOT NULL COMMENT '父菜单ID', - `tree_path` varchar(255) NULL DEFAULT NULL COMMENT '父节点ID路径', - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单名称', - `type` tinyint NOT NULL COMMENT '菜单类型(1-菜单 2-目录 3-外链 4-按钮)', - `route_name` varchar(255) NULL DEFAULT NULL COMMENT '路由名称(Vue Router 中用于命名路由)', - `route_path` varchar(128) NULL DEFAULT '' COMMENT '路由路径(Vue Router 中定义的 URL 路径)', - `component` varchar(128) NULL DEFAULT NULL COMMENT '组件路径(组件页面完整路径,相对于 src/views/,缺省后缀 .vue)', - `perm` varchar(128) NULL DEFAULT NULL COMMENT '【按钮】权限标识', - `always_show` tinyint NULL DEFAULT 0 COMMENT '【目录】只有一个子路由是否始终显示(1-是 0-否)', - `keep_alive` tinyint NULL DEFAULT 0 COMMENT '【菜单】是否开启页面缓存(1-是 0-否)', - `visible` tinyint(1) NOT NULL DEFAULT 1 COMMENT '显示状态(1-显示 0-隐藏)', - `sort` int NULL DEFAULT 0 COMMENT '排序', - `icon` varchar(64) NULL DEFAULT '' COMMENT '菜单图标', - `redirect` varchar(128) NULL DEFAULT NULL COMMENT '跳转路径', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `params` json NULL COMMENT '路由参数', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单管理' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_menu --- ---------------------------- -INSERT INTO `sys_menu` VALUES (1, 0, '0', '系统管理', 2, '', '/system', 'Layout', NULL, NULL, NULL, 1, 1, 'system', '/system/user', '2024-10-05 23:35:58', '2024-10-05 23:35:58', NULL); -INSERT INTO `sys_menu` VALUES (2, 1, '0,1', '用户管理', 1, 'User', 'user', 'system/user/index', NULL, NULL, 1, 1, 1, 'el-icon-User', NULL, '2024-10-05 23:35:59', '2024-10-05 23:35:59', NULL); -INSERT INTO `sys_menu` VALUES (3, 1, '0,1', '角色管理', 1, 'Role', 'role', 'system/role/index', NULL, NULL, 1, 1, 2, 'role', NULL, '2024-10-05 23:36:00', '2024-10-05 23:36:00', NULL); -INSERT INTO `sys_menu` VALUES (4, 1, '0,1', '菜单管理', 1, 'SysMenu', 'menu', 'system/menu/index', NULL, NULL, 1, 1, 3, 'menu', NULL, '2024-10-05 23:36:01', '2024-10-05 23:36:01', NULL); -INSERT INTO `sys_menu` VALUES (5, 1, '0,1', '部门管理', 1, 'Dept', 'dept', 'system/dept/index', NULL, NULL, 1, 1, 4, 'tree', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (6, 1, '0,1', '字典管理', 1, 'Dict', 'dict', 'system/dict/index', NULL, NULL, 1, 1, 5, 'dict', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (20, 0, '0', '多级菜单', 2, NULL, '/multi-level', 'Layout', NULL, 1, NULL, 1, 9, 'cascader', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (21, 20, '0,20', '菜单一级', 1, NULL, 'multi-level1', 'demo/multi-level/level1', NULL, 1, NULL, 1, 1, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (22, 21, '0,20,21', '菜单二级', 1, NULL, 'multi-level2', 'demo/multi-level/children/level2', NULL, 0, NULL, 1, 1, '', NULL, '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (23, 22, '0,20,21,22', '菜单三级-1', 1, NULL, 'multi-level3-1', 'demo/multi-level/children/children/level3-1', NULL, 0, 1, 1, 1, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (24, 22, '0,20,21,22', '菜单三级-2', 1, NULL, 'multi-level3-2', 'demo/multi-level/children/children/level3-2', NULL, 0, 1, 1, 2, '', '', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (26, 0, '0', '平台文档', 2, '', '/doc', 'Layout', NULL, NULL, NULL, 1, 8, 'document', 'https://juejin.cn/post/7228990409909108793', '2024-10-05 23:36:02', '2024-10-05 23:36:02', NULL); -INSERT INTO `sys_menu` VALUES (30, 26, '0,26', '平台文档(外链)', 3, NULL, 'https://juejin.cn/post/7228990409909108793', '', NULL, NULL, NULL, 1, 2, 'link', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (31, 2, '0,1,2', '用户新增', 4, NULL, '', NULL, 'sys:user:add', NULL, NULL, 1, 1, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (32, 2, '0,1,2', '用户编辑', 4, NULL, '', NULL, 'sys:user:edit', NULL, NULL, 1, 2, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (33, 2, '0,1,2', '用户删除', 4, NULL, '', NULL, 'sys:user:delete', NULL, NULL, 1, 3, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (36, 0, '0', '组件封装', 2, NULL, '/component', 'Layout', NULL, NULL, NULL, 1, 10, 'menu', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (37, 36, '0,36', '富文本编辑器', 1, NULL, 'wang-editor', 'demo/wang-editor', NULL, NULL, 1, 1, 2, '', '', NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (38, 36, '0,36', '图片上传', 1, NULL, 'upload', 'demo/upload', NULL, NULL, 1, 1, 3, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (39, 36, '0,36', '图标选择器', 1, NULL, 'icon-selector', 'demo/icon-selector', NULL, NULL, 1, 1, 4, '', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (40, 0, '0', '接口文档', 2, NULL, '/api', 'Layout', NULL, 1, NULL, 1, 7, 'api', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (41, 40, '0,40', 'Apifox', 1, NULL, 'apifox', 'demo/api/apifox', NULL, NULL, 1, 1, 1, 'api', '', '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (70, 3, '0,1,3', '角色新增', 4, NULL, '', NULL, 'sys:role:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (71, 3, '0,1,3', '角色编辑', 4, NULL, '', NULL, 'sys:role:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (72, 3, '0,1,3', '角色删除', 4, NULL, '', NULL, 'sys:role:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (73, 4, '0,1,4', '菜单新增', 4, NULL, '', NULL, 'sys:menu:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (74, 4, '0,1,4', '菜单编辑', 4, NULL, '', NULL, 'sys:menu:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (75, 4, '0,1,4', '菜单删除', 4, NULL, '', NULL, 'sys:menu:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (76, 5, '0,1,5', '部门新增', 4, NULL, '', NULL, 'sys:dept:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (77, 5, '0,1,5', '部门编辑', 4, NULL, '', NULL, 'sys:dept:edit', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (78, 5, '0,1,5', '部门删除', 4, NULL, '', NULL, 'sys:dept:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (79, 6, '0,1,6', '字典新增', 4, NULL, '', NULL, 'sys:dict:add', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (81, 6, '0,1,6', '字典编辑', 4, NULL, '', NULL, 'sys:dict:edit', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (84, 6, '0,1,6', '字典删除', 4, NULL, '', NULL, 'sys:dict:delete', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (88, 2, '0,1,2', '重置密码', 4, NULL, '', NULL, 'sys:user:password:reset', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (89, 0, '0', '功能演示', 2, NULL, '/function', 'Layout', NULL, NULL, NULL, 1, 12, 'menu', '', '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (90, 89, '0,89', 'Websocket', 1, NULL, '/function/websocket', 'demo/websocket', NULL, NULL, 1, 1, 3, '', '', '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (91, 89, '0,89', '敬请期待...', 2, NULL, 'other/:id', 'demo/other', NULL, NULL, NULL, 1, 4, '', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (95, 36, '0,36', '字典组件', 1, NULL, 'dict-demo', 'demo/dictionary', NULL, NULL, 1, 1, 4, '', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (97, 89, '0,89', 'Icons', 1, NULL, 'icon-demo', 'demo/icons', NULL, NULL, 1, 1, 2, 'el-icon-Notification', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (102, 26, '0,26', 'document', 3, '', 'internal-doc', 'demo/internal-doc', NULL, NULL, NULL, 1, 1, 'document', '', '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (105, 2, '0,1,2', '用户查询', 4, NULL, '', NULL, 'sys:user:query', 0, 0, 1, 0, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (106, 2, '0,1,2', '用户导入', 4, NULL, '', NULL, 'sys:user:import', NULL, NULL, 1, 5, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (107, 2, '0,1,2', '用户导出', 4, NULL, '', NULL, 'sys:user:export', NULL, NULL, 1, 6, '', NULL, '2024-10-05 23:36:05', '2024-10-05 23:36:05', NULL); -INSERT INTO `sys_menu` VALUES (108, 36, '0,36', '增删改查', 1, NULL, 'curd', 'demo/curd/index', NULL, NULL, 1, 1, 0, '', '', NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (109, 36, '0,36', '列表选择器', 1, NULL, 'table-select', 'demo/table-select/index', NULL, NULL, 1, 1, 1, '', '', NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (110, 0, '0', '路由参数', 2, NULL, '/route-param', 'Layout', NULL, 1, 1, 1, 11, 'el-icon-ElementPlus', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (111, 110, '0,110', '参数(type=1)', 1, NULL, 'route-param-type1', 'demo/route-param', NULL, 0, 1, 1, 1, 'el-icon-Star', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', '{\"type\": \"1\"}'); -INSERT INTO `sys_menu` VALUES (112, 110, '0,110', '参数(type=2)', 1, NULL, 'route-param-type2', 'demo/route-param', NULL, 0, 1, 1, 2, 'el-icon-StarFilled', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', '{\"type\": \"2\"}'); -INSERT INTO `sys_menu` VALUES (117, 1, '0,1', '系统日志', 1, 'Log', 'log', 'system/log/index', NULL, 0, 1, 1, 6, 'document', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/codegen', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-10-05 23:36:07', '2024-10-05 23:36:07', NULL); -INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成', 1, 'Codegen', 'codegen', 'codegen/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (120, 1, '0,1', '系统配置', 1, 'Config', 'config', 'system/config/index', NULL, 0, 1, 1, 7, 'setting', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (121, 120, '0,1,120', '系统配置查询', 4, NULL, '', NULL, 'sys:config:query', 0, 1, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (122, 120, '0,1,120', '系统配置新增', 4, NULL, '', NULL, 'sys:config:add', 0, 1, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (123, 120, '0,1,120', '系统配置修改', 4, NULL, '', NULL, 'sys:config:update', 0, 1, 1, 3, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (124, 120, '0,1,120', '系统配置删除', 4, NULL, '', NULL, 'sys:config:delete', 0, 1, 1, 4, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (125, 120, '0,1,120', '系统配置刷新', 4, NULL, '', NULL, 'sys:config:refresh', 0, 1, 1, 5, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (126, 1, '0,1', '通知公告', 1, 'Notice', 'notice', 'system/notice/index', NULL, NULL, NULL, 1, 9, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (127, 126, '0,1,126', '通知查询', 4, NULL, '', NULL, 'sys:notice:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (128, 126, '0,1,126', '通知新增', 4, NULL, '', NULL, 'sys:notice:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (129, 126, '0,1,126', '通知编辑', 4, NULL, '', NULL, 'sys:notice:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (130, 126, '0,1,126', '通知删除', 4, NULL, '', NULL, 'sys:notice:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (133, 126, '0,1,126', '通知发布', 4, NULL, '', NULL, 'sys:notice:publish', 0, 1, 1, 5, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (134, 126, '0,1,126', '通知撤回', 4, NULL, '', NULL, 'sys:notice:revoke', 0, 1, 1, 6, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (135, 1, '0,1', '字典数据', 1, 'DictData', 'dict-data', 'system/dict/data', NULL, 0, 1, 0, 6, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (136, 135, '0,1,135', '字典数据新增', 4, NULL, '', NULL, 'sys:dict-data:add', NULL, NULL, 1, 2, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); -INSERT INTO `sys_menu` VALUES (137, 135, '0,1,135', '字典数据编辑', 4, NULL, '', NULL, 'sys:dict-data:edit', NULL, NULL, 1, 3, '', NULL, '2024-10-05 23:36:09', '2024-10-05 23:36:09', NULL); -INSERT INTO `sys_menu` VALUES (138, 135, '0,1,135', '字典数据删除', 4, NULL, '', NULL, 'sys:dict-data:delete', NULL, NULL, 1, 4, '', NULL, '2024-10-05 23:36:09', '2024-10-05 23:36:09', NULL); -INSERT INTO `sys_menu` VALUES (139, 3, '0,1,3', '角色查询', 4, NULL, '', NULL, 'sys:role:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (140, 4, '0,1,4', '菜单查询', 4, NULL, '', NULL, 'sys:menu:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (141, 5, '0,1,5', '部门查询', 4, NULL, '', NULL, 'sys:dept:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:03', '2024-10-05 23:36:03', NULL); -INSERT INTO `sys_menu` VALUES (142, 6, '0,1,6', '字典查询', 4, NULL, '', NULL, 'sys:dict:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:04', '2024-10-05 23:36:04', NULL); -INSERT INTO `sys_menu` VALUES (143, 135, '0,1,135', '字典数据查询', 4, NULL, '', NULL, 'sys:dict-data:query', NULL, NULL, 1, 1, '', NULL, '2024-10-05 23:36:08', '2024-10-05 23:36:08', NULL); - --- ---------------------------- --- Table structure for sys_role --- ---------------------------- -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名称', - `code` varchar(32) NOT NULL COMMENT '角色编码', - `sort` int NULL DEFAULT NULL COMMENT '显示顺序', - `status` tinyint(1) NULL DEFAULT 1 COMMENT '角色状态(1-正常 0-停用)', - `data_scope` tinyint NULL DEFAULT NULL COMMENT '数据权限(0-所有数据 1-部门及子部门数据 2-本部门数据3-本人数据)', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人 ID', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '更新人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_name`(`name` ASC) USING BTREE COMMENT '角色名称唯一索引', - UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '角色编码唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_role --- ---------------------------- -INSERT INTO `sys_role` VALUES (1, '超级管理员', 'ROOT', 1, 1, 0, NULL, '2021-05-21 14:56:51', NULL, '2018-12-23 16:00:00', 0); -INSERT INTO `sys_role` VALUES (2, '系统管理员', 'ADMIN', 2, 1, 0, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (3, '访问游客', 'GUEST', 3, 1, 2, NULL, '2021-05-26 15:49:05', NULL, '2019-05-05 16:00:00', 0); -INSERT INTO `sys_role` VALUES (4, '系统管理员1', 'ADMIN1', 4, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (5, '系统管理员2', 'ADMIN2', 5, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (6, '系统管理员3', 'ADMIN3', 6, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (7, '系统管理员4', 'ADMIN4', 7, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (8, '系统管理员5', 'ADMIN5', 8, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (9, '系统管理员6', 'ADMIN6', 9, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (10, '系统管理员7', 'ADMIN7', 10, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (11, '系统管理员8', 'ADMIN8', 11, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); -INSERT INTO `sys_role` VALUES (12, '系统管理员9', 'ADMIN9', 12, 1, 1, NULL, '2021-03-25 12:39:54', NULL, NULL, 0); - --- ---------------------------- --- Table structure for sys_role_menu --- ---------------------------- -DROP TABLE IF EXISTS `sys_role_menu`; -CREATE TABLE `sys_role_menu` ( - `role_id` bigint NOT NULL COMMENT '角色ID', - `menu_id` bigint NOT NULL COMMENT '菜单ID', - UNIQUE INDEX `uk_roleid_menuid`(`role_id` ASC, `menu_id` ASC) USING BTREE COMMENT '角色菜单唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_role_menu --- ---------------------------- -INSERT INTO `sys_role_menu` VALUES (2, 1); -INSERT INTO `sys_role_menu` VALUES (2, 2); -INSERT INTO `sys_role_menu` VALUES (2, 3); -INSERT INTO `sys_role_menu` VALUES (2, 4); -INSERT INTO `sys_role_menu` VALUES (2, 5); -INSERT INTO `sys_role_menu` VALUES (2, 6); -INSERT INTO `sys_role_menu` VALUES (2, 20); -INSERT INTO `sys_role_menu` VALUES (2, 21); -INSERT INTO `sys_role_menu` VALUES (2, 22); -INSERT INTO `sys_role_menu` VALUES (2, 23); -INSERT INTO `sys_role_menu` VALUES (2, 24); -INSERT INTO `sys_role_menu` VALUES (2, 26); -INSERT INTO `sys_role_menu` VALUES (2, 30); -INSERT INTO `sys_role_menu` VALUES (2, 31); -INSERT INTO `sys_role_menu` VALUES (2, 32); -INSERT INTO `sys_role_menu` VALUES (2, 33); -INSERT INTO `sys_role_menu` VALUES (2, 36); -INSERT INTO `sys_role_menu` VALUES (2, 37); -INSERT INTO `sys_role_menu` VALUES (2, 38); -INSERT INTO `sys_role_menu` VALUES (2, 39); -INSERT INTO `sys_role_menu` VALUES (2, 40); -INSERT INTO `sys_role_menu` VALUES (2, 41); -INSERT INTO `sys_role_menu` VALUES (2, 70); -INSERT INTO `sys_role_menu` VALUES (2, 71); -INSERT INTO `sys_role_menu` VALUES (2, 72); -INSERT INTO `sys_role_menu` VALUES (2, 73); -INSERT INTO `sys_role_menu` VALUES (2, 74); -INSERT INTO `sys_role_menu` VALUES (2, 75); -INSERT INTO `sys_role_menu` VALUES (2, 76); -INSERT INTO `sys_role_menu` VALUES (2, 77); -INSERT INTO `sys_role_menu` VALUES (2, 78); -INSERT INTO `sys_role_menu` VALUES (2, 79); -INSERT INTO `sys_role_menu` VALUES (2, 81); -INSERT INTO `sys_role_menu` VALUES (2, 84); -INSERT INTO `sys_role_menu` VALUES (2, 85); -INSERT INTO `sys_role_menu` VALUES (2, 86); -INSERT INTO `sys_role_menu` VALUES (2, 87); -INSERT INTO `sys_role_menu` VALUES (2, 88); -INSERT INTO `sys_role_menu` VALUES (2, 89); -INSERT INTO `sys_role_menu` VALUES (2, 90); -INSERT INTO `sys_role_menu` VALUES (2, 91); -INSERT INTO `sys_role_menu` VALUES (2, 95); -INSERT INTO `sys_role_menu` VALUES (2, 97); -INSERT INTO `sys_role_menu` VALUES (2, 102); -INSERT INTO `sys_role_menu` VALUES (2, 105); -INSERT INTO `sys_role_menu` VALUES (2, 106); -INSERT INTO `sys_role_menu` VALUES (2, 107); -INSERT INTO `sys_role_menu` VALUES (2, 108); -INSERT INTO `sys_role_menu` VALUES (2, 109); -INSERT INTO `sys_role_menu` VALUES (2, 110); -INSERT INTO `sys_role_menu` VALUES (2, 111); -INSERT INTO `sys_role_menu` VALUES (2, 112); -INSERT INTO `sys_role_menu` VALUES (2, 114); -INSERT INTO `sys_role_menu` VALUES (2, 115); -INSERT INTO `sys_role_menu` VALUES (2, 116); -INSERT INTO `sys_role_menu` VALUES (2, 117); -INSERT INTO `sys_role_menu` VALUES (2, 118); -INSERT INTO `sys_role_menu` VALUES (2, 119); -INSERT INTO `sys_role_menu` VALUES (2, 120); -INSERT INTO `sys_role_menu` VALUES (2, 121); -INSERT INTO `sys_role_menu` VALUES (2, 122); -INSERT INTO `sys_role_menu` VALUES (2, 123); -INSERT INTO `sys_role_menu` VALUES (2, 124); -INSERT INTO `sys_role_menu` VALUES (2, 125); -INSERT INTO `sys_role_menu` VALUES (2, 126); -INSERT INTO `sys_role_menu` VALUES (2, 127); -INSERT INTO `sys_role_menu` VALUES (2, 128); -INSERT INTO `sys_role_menu` VALUES (2, 129); -INSERT INTO `sys_role_menu` VALUES (2, 130); -INSERT INTO `sys_role_menu` VALUES (2, 131); -INSERT INTO `sys_role_menu` VALUES (2, 132); -INSERT INTO `sys_role_menu` VALUES (2, 133); -INSERT INTO `sys_role_menu` VALUES (2, 134); -INSERT INTO `sys_role_menu` VALUES (2, 135); -INSERT INTO `sys_role_menu` VALUES (2, 136); -INSERT INTO `sys_role_menu` VALUES (2, 137); -INSERT INTO `sys_role_menu` VALUES (2, 138); -INSERT INTO `sys_role_menu` VALUES (2, 139); -INSERT INTO `sys_role_menu` VALUES (2, 140); -INSERT INTO `sys_role_menu` VALUES (2, 141); -INSERT INTO `sys_role_menu` VALUES (2, 142); -INSERT INTO `sys_role_menu` VALUES (2, 143); - --- ---------------------------- --- Table structure for sys_user --- ---------------------------- -DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `username` varchar(64) NULL DEFAULT NULL COMMENT '用户名', - `nickname` varchar(64) NULL DEFAULT NULL COMMENT '昵称', - `gender` tinyint(1) NULL DEFAULT 1 COMMENT '性别((1-男 2-女 0-保密)', - `password` varchar(100) NULL DEFAULT NULL COMMENT '密码', - `dept_id` int NULL DEFAULT NULL COMMENT '部门ID', - `avatar` varchar(255) NULL DEFAULT '' COMMENT '用户头像', - `mobile` varchar(20) NULL DEFAULT NULL COMMENT '联系方式', - `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态((1-正常 0-禁用)', - `email` varchar(128) NULL DEFAULT NULL COMMENT '用户邮箱', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `create_by` bigint NULL DEFAULT NULL COMMENT '创建人ID', - `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', - `update_by` bigint NULL DEFAULT NULL COMMENT '修改人ID', - `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除 1-已删除)', - `openid` char(28) DEFAULT NULL COMMENT '微信 openid', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `login_name`(`username` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_user --- ---------------------------- -INSERT INTO `sys_user` VALUES (1, 'root', '有来技术', 0, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', NULL, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345677', 1, 'youlaitech@163.com', NULL, NULL, NULL, NULL, 0,NULL); -INSERT INTO `sys_user` VALUES (2, 'admin', '系统管理员', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 1, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345678', 1, '', '2019-10-10 13:41:22', NULL, '2022-07-31 12:39:30', NULL, 0,NULL); -INSERT INTO `sys_user` VALUES (3, 'test', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif', '18812345679', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0,NULL); - --- ---------------------------- --- Table structure for sys_user_role --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_role`; -CREATE TABLE `sys_user_role` ( - `user_id` bigint NOT NULL COMMENT '用户ID', - `role_id` bigint NOT NULL COMMENT '角色ID', - PRIMARY KEY (`user_id`, `role_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of sys_user_role --- ---------------------------- -INSERT INTO `sys_user_role` VALUES (1, 1); -INSERT INTO `sys_user_role` VALUES (2, 2); -INSERT INTO `sys_user_role` VALUES (3, 3); - --- ---------------------------- --- Table structure for gen_config --- ---------------------------- -DROP TABLE IF EXISTS `gen_config`; -CREATE TABLE `gen_config` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `table_name` varchar(100) NOT NULL COMMENT '表名', - `module_name` varchar(100) DEFAULT NULL COMMENT '模块名', - `package_name` varchar(255) NOT NULL COMMENT '包名', - `business_name` varchar(100) NOT NULL COMMENT '业务名', - `entity_name` varchar(100) NOT NULL COMMENT '实体类名', - `author` varchar(50) NOT NULL COMMENT '作者', - `parent_menu_id` bigint DEFAULT NULL COMMENT '上级菜单ID,对应sys_menu的id ', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `is_deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_tablename` (`table_name`) -) ENGINE=InnoDB COMMENT='代码生成基础配置表'; - --- ---------------------------- --- Table structure for gen_field_config --- ---------------------------- -DROP TABLE IF EXISTS `gen_field_config`; -CREATE TABLE `gen_field_config` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `config_id` bigint NOT NULL COMMENT '关联的配置ID', - `column_name` varchar(100) DEFAULT NULL, - `column_type` varchar(50) DEFAULT NULL, - `column_length` int DEFAULT NULL, - `field_name` varchar(100) NOT NULL COMMENT '字段名称', - `field_type` varchar(100) DEFAULT NULL COMMENT '字段类型', - `field_sort` int DEFAULT NULL COMMENT '字段排序', - `field_comment` varchar(255) DEFAULT NULL COMMENT '字段描述', - `max_length` int NULL DEFAULT NULL, - `is_required` tinyint(1) DEFAULT NULL COMMENT '是否必填', - `is_show_in_list` tinyint(1) DEFAULT '0' COMMENT '是否在列表显示', - `is_show_in_form` tinyint(1) DEFAULT '0' COMMENT '是否在表单显示', - `is_show_in_query` tinyint(1) DEFAULT '0' COMMENT '是否在查询条件显示', - `query_type` tinyint DEFAULT NULL COMMENT '查询方式', - `form_type` tinyint DEFAULT NULL COMMENT '表单类型', - `dict_type` varchar(50) NULL DEFAULT NULL COMMENT '字典类型', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `config_id` (`config_id`) -) ENGINE=InnoDB COMMENT='代码生成字段配置表'; - --- ---------------------------- --- Table structure for sys_user_notice --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_notice`; -CREATE TABLE `sys_user_notice` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `notice_id` bigint NOT NULL COMMENT '公共通知id', - `user_id` bigint NOT NULL COMMENT '用户id', - `is_read` bigint NOT NULL DEFAULT 0 COMMENT '读取状态(0未读;1已读)', - `read_time` datetime DEFAULT NULL COMMENT '阅读时间', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除(1-已删除;0-未删除)', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB COMMENT='用户通知公告表'; - --- ---------------------------- --- Table structure for sys_notice --- ---------------------------- -DROP TABLE IF EXISTS `sys_notice`; -CREATE TABLE `sys_notice` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `title` varchar(50) DEFAULT NULL COMMENT '通知标题', - `content` text COMMENT '通知内容', - `type` tinyint NOT NULL COMMENT '通知类型(字典code:notice_type)', - `level` varchar(5) NOT NULL COMMENT '通知等级(字典code:notice_level)', - `target_type` tinyint NOT NULL COMMENT '目标类型(1: 全体, 2: 指定)', - `target_user_ids` varchar(255) DEFAULT NULL COMMENT '目标人ID集合(多个使用英文逗号,分割)', - `publisher_id` bigint DEFAULT NULL COMMENT '发布人ID', - `publish_status` tinyint NOT NULL DEFAULT '0' COMMENT '发布状态(0: 未发布, 1: 已发布, -1: 已撤回)', - `publish_time` datetime DEFAULT NULL COMMENT '发布时间', - `revoke_time` datetime DEFAULT NULL COMMENT '撤回时间', - `create_by` bigint NOT NULL COMMENT '创建人ID', - `create_time` datetime NOT NULL COMMENT '创建时间', - `update_by` bigint DEFAULT NULL COMMENT '更新人ID', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除(0: 未删除, 1: 已删除)', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB COMMENT='通知公告表'; - -SET FOREIGN_KEY_CHECKS = 1; - - -- 提交事务 -COMMIT; From 6b8986162a6dae36ecd4a9429bbc9577978833a5 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Mon, 24 Feb 2025 20:00:34 +0800 Subject: [PATCH 19/39] =?UTF-8?q?docs:=20sql=20=E8=84=9A=E6=9C=AC=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 395da5d1..a227cc70 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ 2. **数据库初始化** - 执行 [youlai_boot.sql](sql/mysql8/youlai_boot.sql) 脚本完成数据库创建、表结构和基础数据的初始化。 + 执行 [youlai_boot.sql](sql/mysql/youlai_boot.sql) 脚本完成数据库创建、表结构和基础数据的初始化。 3. **修改配置** From 5239be55143d58c6a812c80e0b370f93532c92a7 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Mon, 24 Feb 2025 20:01:14 +0800 Subject: [PATCH 20/39] =?UTF-8?q?docs:=20sql=20=E8=84=9A=E6=9C=AC=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index a227cc70..2b516213 100644 --- a/README.md +++ b/README.md @@ -71,8 +71,7 @@ ``` youlai-boot ├── sql # SQL脚本 -│ ├── mysql5 # MySQL5 脚本 -│ └── mysql8 # MySQL8 脚本 +│ ├── mysql # MySQL 脚本 ├── src # 源码目录 │ ├── common # 公共模块 │ │ ├── annotation # 注解定义 From 7f4ec50cefca96ad37936239449d4dd3ef839161 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 00:07:17 +0800 Subject: [PATCH 21/39] =?UTF-8?q?refactor:=20=E5=AE=8C=E5=96=84=E5=9B=A0?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=20Token=20=E8=80=8C=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=93=8D=E5=BA=94=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/MyAuthenticationEntryPoint.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java index 11efd9df..65c50929 100644 --- a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java @@ -3,10 +3,9 @@ package com.youlai.boot.core.security.exception; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.common.util.ResponseUtils; import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -15,26 +14,35 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** - * 未认证异常处理器 + * 统一处理 Spring Security 认证失败响应 * * @author Ray.Hao * @since 2.0.0 */ public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { + + /** + * 认证失败处理入口方法 + * + * @param request 触发异常的请求对象(可用于获取请求头、参数等) + * @param response 响应对象(用于写入错误信息) + * @param authException 认证异常对象(包含具体失败原因) + */ @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - int status = response.getStatus(); - if (status == HttpServletResponse.SC_NOT_FOUND) { - // 资源不存在 - ResponseUtils.writeErrMsg(response, ResultCode.USER_RESOURCE_NOT_FOUND); + if (authException instanceof BadCredentialsException) { + // 用户名或密码错误 + ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); + } else if(authException instanceof InsufficientAuthenticationException){ + // 请求头缺失Authorization、Token格式错误、Token过期、签名验证失败 + ResponseUtils.writeErrMsg(response, ResultCode.ACCESS_TOKEN_INVALID); } else { - if (authException instanceof BadCredentialsException) { - // 用户名或密码错误 - ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); - } else { - // 登录异常 - ResponseUtils.writeErrMsg(response, ResultCode.USER_LOGIN_EXCEPTION, authException.getMessage()); - } + // 其他未明确处理的认证异常(如账户被锁定、账户禁用等) + ResponseUtils.writeErrMsg(response, ResultCode.USER_LOGIN_EXCEPTION, authException.getMessage()); } } } + + + + From 8391f931211f09ed5a9ef34a6678c89bcde46819 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 00:07:39 +0800 Subject: [PATCH 22/39] =?UTF-8?q?chore:=20=E5=AE=8C=E5=96=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/youlai/boot/system/controller/LogController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/system/controller/LogController.java b/src/main/java/com/youlai/boot/system/controller/LogController.java index df7890cd..606ef5db 100644 --- a/src/main/java/com/youlai/boot/system/controller/LogController.java +++ b/src/main/java/com/youlai/boot/system/controller/LogController.java @@ -21,7 +21,7 @@ import java.util.List; /** * 日志控制层 * - * @author Ray + * @author Ray.Hao * @since 2.10.0 */ @Tag(name = "13.日志接口") From 543c5ec0b9d3ed4a67934361f0c837cf0dde7c95 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 18:28:42 +0800 Subject: [PATCH 23/39] =?UTF-8?q?chore:=20=E7=B2=BE=E7=AE=80=20MySQL=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/mysql/conf/my.cnf | 51 ++++++++++++---------------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/docker/mysql/conf/my.cnf b/docker/mysql/conf/my.cnf index b71a794b..73981f81 100644 --- a/docker/mysql/conf/my.cnf +++ b/docker/mysql/conf/my.cnf @@ -1,41 +1,20 @@ -# 服务端参数配置 + + [mysqld] -skip-name-resolve -user=mysql # MySQL启动用户 -default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎 -character-set-server=utf8mb4 # 设置mysql服务端默认字符集 -collation-server = utf8mb4_general_ci # 数据库字符集对应一些排序等规则,注意要和character-set-server对应 +# 字符集与排序规则 +character-set-server = utf8mb4 # 服务端默认字符集 +collation-server = utf8mb4_0900_ai_ci # 服务端默认排序规则 -pid-file = /var/lib/mysql/mysqld.pid # pid文件所在目录 -socket = /var/lib/mysql/mysqld.sock # 用于本地连接的socket套接字 -datadir = /var/lib/mysql # 数据文件存放的目录 -bind-address = 0.0.0.0 # 允许本机及外部网络连接 -expire_logs_days= 7 # 定义清除过期日志的时间(这里设置为7天) +# 网络与路径 +datadir = /var/lib/mysql # 数据文件存放的目录 +bind-address = 0.0.0.0 # 允许远程连接,默认 127.0.0.1 只允许本地连接 +port = 3306 # 显式指定端口(默认3306可不写) -# 设置client连接mysql时的字符集,防止乱码 -init_connect='SET NAMES utf8mb4' - -# 是否对sql语句大小写敏感,1表示不敏感 -lower_case_table_names = 1 - -# 执行sql的模式,规定了sql的安全等级, 暂时屏蔽,my.cnf文件中配置报错 -#sql_mode = STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION - -# 事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能) -transaction_isolation = READ-COMMITTED - -# TIMESTAMP如果没有显示声明NOT NULL,允许NULL值 -explicit_defaults_for_timestamp = true - -#它控制着mysqld进程能使用的最大文件描述(FD)符数量。 -#需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量 -open_files_limit = 65535 - -# 允许最大连接数 -max_connections=200 - -#最大错误连接数 -max_connect_errors = 600 +# 客户端字符集同步(避免乱码) +init_connect = 'SET NAMES utf8mb4' # 连接初始化时设置字符集 [client] -default-character-set=utf8mb4 # 设置mysql客户端默认字符集 \ No newline at end of file +default-character-set = utf8mb4 # 客户端默认字符集 + +[mysql] +default-character-set = utf8mb4 # MySQL 命令行工具字符集 From 509dae345980c996b7e712576c742bda7e7640c7 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 18:30:14 +0800 Subject: [PATCH 24/39] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=20minio=20?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index eade344f..7cb652f9 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -43,7 +43,7 @@ services: command: server /data --console-address ":9090" ports: - 9000:9000 - - 9090:9090 + - 9001:9001 environment: - TZ=Asia/Shanghai - LANG=en_US.UTF-8 From 6adadb9e7738a53c5da386e77b98501984e49605 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 22:59:49 +0800 Subject: [PATCH 25/39] =?UTF-8?q?style:=20=E7=A7=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=A9=BA=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/youlai/boot/system/controller/UserController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/controller/UserController.java b/src/main/java/com/youlai/boot/system/controller/UserController.java index 2e2b626a..0b5e39fa 100644 --- a/src/main/java/com/youlai/boot/system/controller/UserController.java +++ b/src/main/java/com/youlai/boot/system/controller/UserController.java @@ -1,6 +1,5 @@ package com.youlai.boot.system.controller; -import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -64,7 +63,6 @@ public class UserController { @Valid UserPageQuery queryParams ) { IPage result = userService.getUserPage(queryParams); - return PageResult.success(result); } From 2e9faf15232cb9b5f5a15e63755da9334f96d72e Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 23:03:10 +0800 Subject: [PATCH 26/39] =?UTF-8?q?fix:=20=E6=9F=A5=E8=AF=A2=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=88=86=E9=A1=B5=E5=88=97=E8=A1=A8=E6=9C=AC=E4=BA=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/system/mapper/UserMapper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/mapper/UserMapper.java b/src/main/java/com/youlai/boot/system/mapper/UserMapper.java index c087d453..690e74ec 100644 --- a/src/main/java/com/youlai/boot/system/mapper/UserMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/UserMapper.java @@ -25,11 +25,11 @@ public interface UserMapper extends BaseMapper { /** * 获取用户分页列表 * - * @param page 分页参数 + * @param page 分页参数 * @param queryParams 查询参数 * @return 用户分页列表 */ - @DataPermission(deptAlias = "u") + @DataPermission(deptAlias = "u", userAlias = "u") Page getUserPage(Page page, UserPageQuery queryParams); /** @@ -70,7 +70,7 @@ public interface UserMapper extends BaseMapper { * @param queryParams 查询参数 * @return 导出用户列表 */ - @DataPermission(deptAlias = "u") + @DataPermission(deptAlias = "u", userAlias = "u") List listExportUsers(UserPageQuery queryParams); /** From ac61f47d252a4fc36f5cc2e1e6f44c319158e7a3 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 23:05:32 +0800 Subject: [PATCH 27/39] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/model/form/PasswordResetForm.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/main/java/com/youlai/boot/system/model/form/PasswordResetForm.java diff --git a/src/main/java/com/youlai/boot/system/model/form/PasswordResetForm.java b/src/main/java/com/youlai/boot/system/model/form/PasswordResetForm.java deleted file mode 100644 index a1acca63..00000000 --- a/src/main/java/com/youlai/boot/system/model/form/PasswordResetForm.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.youlai.boot.system.model.form; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * 重置密码表单 - * - * @author Ray - * @since 2024/8/13 - */ -@Schema(description = "重置密码表单") -@Data -public class PasswordResetForm { - - @Schema(description = "用户ID") - private Long userId; - - @Schema(description = "密码") - private String password; - - -} From 42cfe6ce20d6f29d45bebfd68f0c17dcf56dc2a2 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 23:06:32 +0800 Subject: [PATCH 28/39] =?UTF-8?q?refactor:=20=E5=85=BC=E5=AE=B9=20MySQL=20?= =?UTF-8?q?5.7=20=E7=89=88=E6=9C=AC=E8=84=9A=E6=9C=AC=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/youlai_boot.sql | 50 +++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/sql/mysql/youlai_boot.sql b/sql/mysql/youlai_boot.sql index 0fd3a84c..4b3e5c30 100644 --- a/sql/mysql/youlai_boot.sql +++ b/sql/mysql/youlai_boot.sql @@ -6,7 +6,7 @@ -- ---------------------------- -- 1. 创建数据库 -- ---------------------------- -CREATE DATABASE IF NOT EXISTS youlai_boot DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; +CREATE DATABASE IF NOT EXISTS youlai_boot CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; -- ---------------------------- @@ -14,11 +14,8 @@ CREATE DATABASE IF NOT EXISTS youlai_boot DEFAULT CHARACTER SET utf8mb4 DEFAULT -- ---------------------------- use youlai_boot; -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - - -- 开启事务 -START TRANSACTION; +SET NAMES utf8mb4; # 设置字符集 +SET FOREIGN_KEY_CHECKS = 0; # 关闭外键检查,加快导入速度 -- ---------------------------- -- Table structure for sys_dept @@ -39,7 +36,7 @@ CREATE TABLE `sys_dept` ( `is_deleted` tinyint DEFAULT 0 COMMENT '逻辑删除标识(1-已删除 0-未删除)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '部门编号唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '部门表'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '部门表'; -- ---------------------------- -- Records of sys_dept @@ -65,7 +62,7 @@ CREATE TABLE `sys_dict` ( `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(1-删除,0-未删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_dict_code` (`dict_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict -- ---------------------------- @@ -92,7 +89,7 @@ CREATE TABLE `sys_dict_data` ( `update_time` datetime COMMENT '更新时间', `update_by` bigint COMMENT '修改人ID', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典数据表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; -- ---------------------------- -- Records of sys_dict_data @@ -132,9 +129,9 @@ CREATE TABLE `sys_menu` ( `redirect` varchar(128) COMMENT '跳转路径', `create_time` datetime NULL COMMENT '创建时间', `update_time` datetime NULL COMMENT '更新时间', - `params` json NULL COMMENT '路由参数', + `params` varchar(255) NULL COMMENT '路由参数', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单管理'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '菜单管理'; -- ---------------------------- -- Records of sys_menu @@ -233,7 +230,7 @@ CREATE TABLE `sys_role` ( PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uk_name`(`name` ASC) USING BTREE COMMENT '角色名称唯一索引', UNIQUE INDEX `uk_code`(`code` ASC) USING BTREE COMMENT '角色编码唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色表'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '角色表'; -- ---------------------------- -- Records of sys_role @@ -259,7 +256,7 @@ CREATE TABLE `sys_role_menu` ( `role_id` bigint NOT NULL COMMENT '角色ID', `menu_id` bigint NOT NULL COMMENT '菜单ID', UNIQUE INDEX `uk_roleid_menuid`(`role_id` ASC, `menu_id` ASC) USING BTREE COMMENT '角色菜单唯一索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '角色和菜单关联表'; -- ---------------------------- -- Records of sys_role_menu @@ -370,7 +367,7 @@ CREATE TABLE `sys_user` ( `openid` char(28) COMMENT '微信 openid', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `login_name`(`username` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '用户信息表'; -- ---------------------------- -- Records of sys_user @@ -387,7 +384,7 @@ CREATE TABLE `sys_user_role` ( `user_id` bigint NOT NULL COMMENT '用户ID', `role_id` bigint NOT NULL COMMENT '角色ID', PRIMARY KEY (`user_id`, `role_id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表'; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '用户和角色关联表'; -- ---------------------------- -- Records of sys_user_role @@ -403,14 +400,14 @@ INSERT INTO `sys_user_role` VALUES (3, 3); DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', - `module` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志模块', + `module` varchar(50) NOT NULL COMMENT '日志模块', `request_method` varchar(64) NOT NULL COMMENT '请求方式', `request_params` text COMMENT '请求参数(批量请求参数可能会超过text)', `response_content` mediumtext COMMENT '返回参数', - `content` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '日志内容', + `content` varchar(255) NOT NULL COMMENT '日志内容', `request_uri` varchar(255) COMMENT '请求路径', - `method` varchar(255) CHARACTER SET utf8mb4 COMMENT '方法名', - `ip` varchar(45) CHARACTER SET utf8mb4 COMMENT 'IP地址', + `method` varchar(255) COMMENT '方法名', + `ip` varchar(45) COMMENT 'IP地址', `province` varchar(100) COMMENT '省份', `city` varchar(100) COMMENT '城市', `execution_time` bigint COMMENT '执行时间(ms)', @@ -422,7 +419,7 @@ CREATE TABLE `sys_log` ( `is_deleted` tinyint DEFAULT '0' COMMENT '逻辑删除标识(1-已删除 0-未删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_create_time` (`create_time`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表'; +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统日志表'; -- ---------------------------- -- Table structure for gen_config @@ -442,7 +439,7 @@ CREATE TABLE `gen_config` ( `is_deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_tablename` (`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码生成基础配置表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成基础配置表'; -- ---------------------------- -- Table structure for gen_field_config @@ -470,7 +467,7 @@ CREATE TABLE `gen_field_config` ( `update_time` datetime COMMENT '更新时间', PRIMARY KEY (`id`), KEY `config_id` (`config_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码生成字段配置表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成字段配置表'; -- ---------------------------- -- 系统配置表 @@ -514,7 +511,7 @@ CREATE TABLE `sys_notice` ( `update_time` datetime COMMENT '更新时间', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除(0: 未删除, 1: 已删除)', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知公告表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知公告表'; INSERT INTO `sys_notice` VALUES (1, 'v2.12.0 新增系统日志,访问趋势统计功能。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 1, 1, now(), now(), 2, now(), 1, now(), 0); INSERT INTO `sys_notice` VALUES (2, 'v2.13.0 新增菜单搜索。', '

1. 消息通知

2. 字典重构

3. 代码生成

', 1, 'L', 1, '2', 1, 1, now(), now(), 2, now(), 1, now(), 0); @@ -541,7 +538,7 @@ CREATE TABLE `sys_user_notice` ( `update_time` datetime COMMENT '更新时间', `is_deleted` tinyint DEFAULT '0' COMMENT '逻辑删除(0: 未删除, 1: 已删除)', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户通知公告表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户通知公告表'; INSERT INTO `sys_user_notice` VALUES (1, 1, 2, 1, NULL, now(), now(), 0); INSERT INTO `sys_user_notice` VALUES (2, 2, 2, 1, NULL, now(), now(), 0); @@ -554,7 +551,4 @@ INSERT INTO `sys_user_notice` VALUES (8, 8, 2, 1, NULL, now(), now(), 0); INSERT INTO `sys_user_notice` VALUES (9, 9, 2, 1, NULL, now(), now(), 0); INSERT INTO `sys_user_notice` VALUES (10, 10, 2, 1, NULL, now(), now(), 0); -SET FOREIGN_KEY_CHECKS = 1; - - -- 提交事务 -COMMIT; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file From 7c7eaf21ea2b5aa43d4cade77e630fdb51217057 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 23:07:21 +0800 Subject: [PATCH 29/39] =?UTF-8?q?docs:=20=E5=AE=8C=E5=96=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/boot/system/service/impl/NoticeServiceImpl.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java index e986f0f0..a05f3051 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java @@ -50,11 +50,8 @@ import java.util.stream.Collectors; public class NoticeServiceImpl extends ServiceImpl implements NoticeService { private final NoticeConverter noticeConverter; - private final UserNoticeService userNoticeService; - private final UserService userService; - private final SimpMessagingTemplate messagingTemplate; private final OnlineUserService onlineUserService; @@ -266,10 +263,9 @@ public class NoticeServiceImpl extends ServiceImpl impleme } /** - * 阅读获取通知公告详情 * * @param id 通知公告ID - * @return + * @return NoticeDetailVO 通知公告详情 */ @Override public NoticeDetailVO getNoticeDetail(Long id) { From 300c35a2baf3f4e0d97d3bdde0227729b334aebc Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 23:08:16 +0800 Subject: [PATCH 30/39] =?UTF-8?q?refactor:=20=E8=B6=85=E7=BA=A7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=9C=A8=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/system/UserMapper.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml index 0940c488..2ce46ee6 100644 --- a/src/main/resources/mapper/system/UserMapper.xml +++ b/src/main/resources/mapper/system/UserMapper.xml @@ -24,7 +24,9 @@ LEFT JOIN sys_user_role sur ON u.id = sur.user_id LEFT JOIN sys_role r ON sur.role_id = r.id - u.is_deleted = 0 AND u.username != 'root' + u.is_deleted = 0 + + AND r.name != '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}' AND ( u.username LIKE CONCAT('%',#{queryParams.keywords},'%') @@ -118,9 +120,9 @@ - + - + @@ -191,7 +193,7 @@ sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.id - u.is_deleted = 0 AND u.username != 'root' + u.is_deleted = 0 AND (u.username LIKE CONCAT('%',#{keywords},'%') OR u.nickname LIKE CONCAT('%',#{keywords},'%') From 7feb5973249965532ad7dd576ab2f56223e9eb17 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Fri, 28 Feb 2025 15:23:21 +0800 Subject: [PATCH 31/39] =?UTF-8?q?refactor(system):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E5=92=8C=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 JwtTokenManager 类中更新 generateToken 方法的注释 - 在 MenuServiceImpl 类中修正菜单类型判断逻辑并优化注释 - 在 MyAuthenticationEntryPoint 类中调整导入顺序和删除未使用的导入 --- .../security/exception/MyAuthenticationEntryPoint.java | 9 +++------ .../boot/core/security/manager/JwtTokenManager.java | 2 +- .../youlai/boot/system/service/impl/MenuServiceImpl.java | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java index 11efd9df..a8768cdf 100644 --- a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java @@ -2,15 +2,12 @@ package com.youlai.boot.core.security.exception; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.common.util.ResponseUtils; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; import java.io.IOException; diff --git a/src/main/java/com/youlai/boot/core/security/manager/JwtTokenManager.java b/src/main/java/com/youlai/boot/core/security/manager/JwtTokenManager.java index 6bb06473..4da6987b 100644 --- a/src/main/java/com/youlai/boot/core/security/manager/JwtTokenManager.java +++ b/src/main/java/com/youlai/boot/core/security/manager/JwtTokenManager.java @@ -188,7 +188,7 @@ public class JwtTokenManager implements TokenManager { * * @param authentication 认证信息 * @param ttl 过期时间 - * @return + * @return JWT Token */ private String generateToken(Authentication authentication, int ttl) { diff --git a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java index fc27d8da..cf71ebeb 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java @@ -241,13 +241,13 @@ public class MenuServiceImpl extends ServiceImpl implements Me MenuTypeEnum menuType = menuForm.getType(); - if (menuType == MenuTypeEnum.CATALOG) { // 如果是外链 + if (menuType == MenuTypeEnum.CATALOG) { // 如果是目录 String path = menuForm.getRoutePath(); if (menuForm.getParentId() == 0 && !path.startsWith("/")) { menuForm.setRoutePath("/" + path); // 一级目录需以 / 开头 } menuForm.setComponent("Layout"); - } else if (menuType == MenuTypeEnum.EXTLINK) { // 如果是目录 + } else if (menuType == MenuTypeEnum.EXTLINK) { // 如果是外链 menuForm.setComponent(null); } From 586aeaa16ba9b54b9f2eb065e09effa192d8650e Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sat, 1 Mar 2025 00:15:26 +0800 Subject: [PATCH 32/39] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85token=E6=9C=89?= =?UTF-8?q?=E6=95=88=E6=9C=9F=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 4 ++-- src/main/resources/application-prod.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d53a2843..8510de9c 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -78,9 +78,9 @@ security: jwt: # JWT 秘钥 key: SecretKey012345678901234567890123456789012345678901234567890123456789 - # 访问令牌 有效期(单位:秒),默认 1 小时 + # 访问令牌 有效期(单位:秒),默认 1 小时,-1 表示永不过期 access-token-time-to-live: 3600 - # 刷新令牌有效期(单位:秒),默认 7 天 + # 刷新令牌有效期(单位:秒),默认 7 天,-1 表示永不过期 refresh-token-time-to-live: 604800 # 无需认证的请求路径 ignore-urls: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index c369e617..0be80dd4 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -76,9 +76,9 @@ security: jwt: # JWT 秘钥 key: SecretKey012345678901234567890123456789012345678901234567890123456789 - # 访问令牌 有效期(单位:秒),默认 1 小时 + # 访问令牌 有效期(单位:秒),默认 1 小时,-1 表示永不过期 access-token-time-to-live: 3600 - # 刷新令牌有效期(单位:秒),默认 7 天 + # 刷新令牌有效期(单位:秒),默认 7 天,-1 表示永不过期 refresh-token-time-to-live: 604800 # 无需认证的请求路径 ignore-urls: From 77adafc20c9aa816c9ebeeba127ddd5ba3d6996d Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sat, 1 Mar 2025 00:41:44 +0800 Subject: [PATCH 33/39] =?UTF-8?q?refactor:=20Spring=20Security=20=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/CaptchaValidationException.java | 15 +++++++++++++++ .../exception/MyAuthenticationEntryPoint.java | 2 +- .../extension/sms/SmsAuthenticationProvider.java | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java diff --git a/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java b/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java new file mode 100644 index 00000000..7b498a1a --- /dev/null +++ b/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java @@ -0,0 +1,15 @@ +package com.youlai.boot.core.security.exception; + +import org.springframework.security.core.AuthenticationException; + +/** + * 验证码校验异常 + * + * @author Ray.Hao + * @since 2025/3/1 + */ +public class CaptchaValidationException extends AuthenticationException { + public CaptchaValidationException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java index 65c50929..ff5f041e 100644 --- a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java @@ -32,7 +32,7 @@ public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { if (authException instanceof BadCredentialsException) { // 用户名或密码错误 - ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); + ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR); } else if(authException instanceof InsufficientAuthenticationException){ // 请求头缺失Authorization、Token格式错误、Token过期、签名验证失败 ResponseUtils.writeErrMsg(response, ResultCode.ACCESS_TOKEN_INVALID); diff --git a/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java b/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java index fc71fe37..bc048794 100644 --- a/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java +++ b/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java @@ -3,13 +3,13 @@ package com.youlai.boot.core.security.extension.sms; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.constant.RedisConstants; +import com.youlai.boot.core.security.exception.CaptchaValidationException; import com.youlai.boot.core.security.model.SysUserDetails; import com.youlai.boot.system.model.dto.UserAuthInfo; import com.youlai.boot.system.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -64,7 +64,7 @@ public class SmsAuthenticationProvider implements AuthenticationProvider { String cachedVerifyCode = (String) redisTemplate.opsForValue().get(RedisConstants.SMS_LOGIN_CODE_PREFIX + mobile); if (!StrUtil.equals(inputVerifyCode, cachedVerifyCode)) { - throw new BadCredentialsException("验证码错误"); + throw new CaptchaValidationException("验证码错误"); } else { // 验证成功后删除验证码 redisTemplate.delete(RedisConstants.SMS_LOGIN_CODE_PREFIX + mobile); From ccd3b3ad2b5a2190cd253037de989cf77437c082 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sun, 2 Mar 2025 20:38:22 +0800 Subject: [PATCH 34/39] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E9=94=99=E8=AF=AF=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/common/result/ResultCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index 026927ef..4f046f6e 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -67,7 +67,7 @@ public enum ResultCode implements IResultCode, Serializable { REFRESH_TOKEN_INVALID("A0231", "刷新令牌无效或已过期"), // 验证码错误 - USER_VERIFICATION_CODE_ERROR("A0240", "用户验证码错误"), + USER_VERIFICATION_CODE_ERROR("A0240", "验证码错误"), USER_VERIFICATION_CODE_ATTEMPT_LIMIT_EXCEEDED("A0241", "用户验证码尝试次数超限"), USER_VERIFICATION_CODE_EXPIRED("A0242", "用户验证码过期"), From b1e55aae0abe2d4cef8215e394c86218aa49e20e Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sun, 2 Mar 2025 20:55:00 +0800 Subject: [PATCH 35/39] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Minio=20?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=8E=A7=E5=88=B6=E5=8F=B0=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E6=98=A0=E5=B0=84=E7=AB=AF=E5=8F=A3=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #IBQ0R0 --- docker/docker-compose.yml | 2 +- docker/run.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7cb652f9..f27b011e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -40,7 +40,7 @@ services: image: minio/minio:latest container_name: minio restart: unless-stopped - command: server /data --console-address ":9090" + command: server /data --console-address ":9001" ports: - 9000:9000 - 9001:9001 diff --git a/docker/run.md b/docker/run.md index 04fb55e4..1ee1fe5e 100644 --- a/docker/run.md +++ b/docker/run.md @@ -4,13 +4,13 @@ ## 安装 ```bash -docker-compose -f docker-compose.yml -p youlai-boot up -d +docker-compose -f ./docker-compose.yml -p youlai-boot up -d ``` - p youlai-boot 指定命名空间,避免与其他容器冲突,这里方便管理,统一管理和卸载 ## 卸载 ```bash -docker-compose -f docker-compose.yml -p youlai-boot down +docker-compose -f ./docker-compose.yml -p youlai-boot down ``` From 422568bc41704acd48e50d82042100ba106d8695 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 3 Mar 2025 14:38:50 +0800 Subject: [PATCH 36/39] =?UTF-8?q?feat(form):=20=E4=B8=BA=20LocalDateTime?= =?UTF-8?q?=20=E7=B1=BB=E5=9E=8B=E7=9A=84=E5=AD=97=E6=AE=B5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20JsonFormat=20=E6=B3=A8=E8=A7=A3-=20=E5=9C=A8?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=20LocalDateTime=20=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=20-=E4=B8=BA=20LocalDateTime=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=B7=BB=E5=8A=A0=E4=BA=86=20@JsonFormat=20?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=20-=20?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20timezone=20=E4=B8=BA=20GMT+8=EF=BC=8Cpatte?= =?UTF-8?q?rn=20=E4=B8=BA=20yyyy-MM-dd=20HH:mm:ss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/codegen/form.java.vm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/templates/codegen/form.java.vm b/src/main/resources/templates/codegen/form.java.vm index e2c07377..f05ce6b8 100644 --- a/src/main/resources/templates/codegen/form.java.vm +++ b/src/main/resources/templates/codegen/form.java.vm @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.Setter; #if(${hasLocalDateTime}) import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; #end #if(${hasBigDecimal}) import java.math.BigDecimal; @@ -46,6 +47,9 @@ public class ${entityName}Form implements Serializable { #if($fieldConfig.maxLength) @Size(max=$fieldConfig.maxLength, message="$fieldConfig.fieldComment长度不能超过${fieldConfig.maxLength}个字符") #end + #if($fieldConfig.fieldType == 'LocalDateTime') + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + #end private ${fieldConfig.fieldType} ${fieldConfig.fieldName}; #end From 5c9523ccbc01fd25a9e14079a99d9344d5199013 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 3 Mar 2025 16:36:11 +0800 Subject: [PATCH 37/39] =?UTF-8?q?feat(file):=20=E4=BC=98=E5=8C=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在上传文件时保留原始文件名 - 优化文件名生成逻辑,使用 UUID 和日期文件夹结构 - 统一处理文件后缀获取方式 -调整文件信息返回结构,返回原始文件名和访问 URL --- .../shared/file/service/impl/AliyunFileService.java | 6 ++++-- .../shared/file/service/impl/LocalFileService.java | 11 +++++++---- .../shared/file/service/impl/MinioFileService.java | 9 +++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/youlai/boot/shared/file/service/impl/AliyunFileService.java b/src/main/java/com/youlai/boot/shared/file/service/impl/AliyunFileService.java index f92fe487..004475fd 100644 --- a/src/main/java/com/youlai/boot/shared/file/service/impl/AliyunFileService.java +++ b/src/main/java/com/youlai/boot/shared/file/service/impl/AliyunFileService.java @@ -62,8 +62,10 @@ public class AliyunFileService implements FileService { @SneakyThrows public FileInfo uploadFile(MultipartFile file) { + // 获取文件名称 + String originalFilename = file.getOriginalFilename(); // 生成文件名(日期文件夹) - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); + String suffix = FileUtil.getSuffix(originalFilename); String uuid = IdUtil.simpleUUID(); String fileName = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + uuid + "." + suffix; // try-with-resource 语法糖自动释放流 @@ -82,7 +84,7 @@ public class AliyunFileService implements FileService { // 获取文件访问路径 String fileUrl = "https://" + bucketName + "." + endpoint + "/" + fileName; FileInfo fileInfo = new FileInfo(); - fileInfo.setName(fileName); + fileInfo.setName(originalFilename); fileInfo.setUrl(fileUrl); return fileInfo; } diff --git a/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java b/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java index 46740dc4..5cd0b97f 100644 --- a/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java +++ b/src/main/java/com/youlai/boot/shared/file/service/impl/LocalFileService.java @@ -44,11 +44,14 @@ public class LocalFileService implements FileService { */ @Override public FileInfo uploadFile(MultipartFile file) { + // 获取文件名 + String originalFilename = file.getOriginalFilename(); + // 获取文件后缀 + String suffix = FileUtil.getSuffix(originalFilename); + // 生成uuid + String fileName = IdUtil.simpleUUID()+ "." + suffix;; // 生成文件名(日期文件夹) - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); - String uuid = IdUtil.simpleUUID(); String folder = DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN); - String fileName = uuid + "." + suffix; String filePrefix = storagePath.endsWith(File.separator) ? storagePath : storagePath + File.separator; // try-with-resource 语法糖自动释放流 try (InputStream inputStream = file.getInputStream()) { @@ -61,7 +64,7 @@ public class LocalFileService implements FileService { // 获取文件访问路径,因为这里是本地存储,所以直接返回文件的相对路径,需要前端自行处理访问前缀 String fileUrl = File.separator + folder + File.separator + fileName; FileInfo fileInfo = new FileInfo(); - fileInfo.setName(fileName); + fileInfo.setName(originalFilename); fileInfo.setUrl(fileUrl); return fileInfo; } diff --git a/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java b/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java index 59c7e576..030ff1aa 100644 --- a/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java +++ b/src/main/java/com/youlai/boot/shared/file/service/impl/MinioFileService.java @@ -7,8 +7,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.result.ResultCode; -import com.youlai.boot.shared.file.service.FileService; import com.youlai.boot.shared.file.model.FileInfo; +import com.youlai.boot.shared.file.service.FileService; import io.minio.*; import io.minio.http.Method; import jakarta.annotation.PostConstruct; @@ -21,7 +21,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import java.io.File; import java.io.InputStream; import java.time.LocalDateTime; @@ -86,8 +85,10 @@ public class MinioFileService implements FileService { // 创建存储桶(存储桶不存在),如果有搭建好的minio服务,建议放在init方法中 createBucketIfAbsent(bucketName); + // 文件原生名称 + String originalFilename = file.getOriginalFilename(); // 文件后缀 - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); + String suffix = FileUtil.getSuffix(originalFilename); // 文件夹名称 String dateFolder = DateUtil.format(LocalDateTime.now(), "yyyyMMdd"); // 文件名称 @@ -123,7 +124,7 @@ public class MinioFileService implements FileService { } FileInfo fileInfo = new FileInfo(); - fileInfo.setName(fileName); + fileInfo.setName(originalFilename); fileInfo.setUrl(fileUrl); return fileInfo; } catch (Exception e) { From 191939596764d8ec4c1089418ec931f3733a9dc0 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Thu, 6 Mar 2025 16:51:42 +0800 Subject: [PATCH 38/39] =?UTF-8?q?fix:=20=E7=94=A8=E6=88=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=B8=AD=E6=8E=92=E9=99=A4=E8=B6=85=E7=BA=A7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=B9=B6=E4=BC=98=E5=8C=96=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/system/UserMapper.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/resources/mapper/system/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml index 2ce46ee6..bb89892c 100644 --- a/src/main/resources/mapper/system/UserMapper.xml +++ b/src/main/resources/mapper/system/UserMapper.xml @@ -26,7 +26,7 @@ u.is_deleted = 0 - AND r.name != '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}' + AND r.code != '${@com.youlai.boot.common.constant.SystemConstants@ROOT_ROLE_CODE}' AND ( u.username LIKE CONCAT('%',#{queryParams.keywords},'%') @@ -40,12 +40,6 @@ AND concat(',',concat(d.tree_path,',',d.id),',') like concat('%,',#{queryParams.deptId},',%') - - AND sur.role_id in - - #{roleId} - - From e503803944c60f510d78d363d9d74a0cd3283daa Mon Sep 17 00:00:00 2001 From: zhangyuanpeng <1016062422@qq.com> Date: Thu, 6 Mar 2025 17:17:52 +0800 Subject: [PATCH 39/39] =?UTF-8?q?fix:=20jackson=E5=A4=84=E7=90=86LocalDate?= =?UTF-8?q?Time=E5=AD=97=E6=AE=B5=E6=A0=BC=E5=BC=8F=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/config/WebMvcConfig.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/youlai/boot/config/WebMvcConfig.java b/src/main/java/com/youlai/boot/config/WebMvcConfig.java index 41fa407b..a8082ea9 100644 --- a/src/main/java/com/youlai/boot/config/WebMvcConfig.java +++ b/src/main/java/com/youlai/boot/config/WebMvcConfig.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -20,6 +22,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.math.BigInteger; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.TimeZone; @@ -33,6 +37,8 @@ import java.util.TimeZone; @Slf4j public class WebMvcConfig implements WebMvcConfigurer { + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + /** * 配置消息转换器 * @@ -45,6 +51,10 @@ public class WebMvcConfig implements WebMvcConfigurer { // 注册 JavaTimeModule(替代手动注册 LocalDateTimeSerializer) JavaTimeModule javaTimeModule = new JavaTimeModule(); + // 返回指定字符串格式 + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATE_TIME_FORMATTER)); + // 反序列化,接受前端传来的格式 + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DATE_TIME_FORMATTER)); objectMapper.registerModule(javaTimeModule); // 配置全局日期格式和时区