diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index c22cf4b7..2cfdc939 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -396,7 +396,7 @@ INSERT INTO `sys_user_role` VALUES (3, 3); -- ---------------------------- --- Table structure for sys_user_role +-- Table structure for sys_log -- ---------------------------- DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( diff --git a/src/main/java/com/youlai/boot/common/base/BasePageQuery.java b/src/main/java/com/youlai/boot/common/base/BasePageQuery.java index ab8deac4..edb32fd3 100644 --- a/src/main/java/com/youlai/boot/common/base/BasePageQuery.java +++ b/src/main/java/com/youlai/boot/common/base/BasePageQuery.java @@ -1,9 +1,11 @@ package com.youlai.boot.common.base; - import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; + /** * 基础分页请求对象 * @@ -12,7 +14,11 @@ import lombok.Data; */ @Data @Schema -public class BasePageQuery { +public class BasePageQuery implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "页码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private int pageNum = 1; diff --git a/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java index 89aa25a0..7e54dc91 100644 --- a/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java @@ -273,7 +273,8 @@ public class CodegenServiceImpl implements CodegenService { for (String tableName : tableNames) { generateAndZipCode(tableName, zip); } - + // 确保所有压缩数据写入输出流,避免数据残留在内存缓冲区引发的数据不完整 + zip.finish(); return outputStream.toByteArray(); } catch (IOException e) { diff --git a/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java index c13712cc..5bf9b089 100644 --- a/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java +++ b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java @@ -51,9 +51,10 @@ public class WebsocketController { */ @MessageMapping("/sendToUser/{username}") public void sendToUser(Principal principal, @DestinationVariable String username, String message) { - - String sender = principal.getName(); // 发送人 - String receiver = username; // 接收人 + // 发送人 + String sender = principal.getName(); + // 接收人 + String receiver = username; log.info("发送人:{}; 接收人:{}", sender, receiver); // 发送消息给指定用户,拼接后路径 /user/{receiver}/queue/greeting diff --git a/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java b/src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java similarity index 100% rename from src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java rename to src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java diff --git a/src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java b/src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java deleted file mode 100644 index 4cfe70d1..00000000 --- a/src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.youlai.boot.module.websocket.service; - -public interface WebsocketService { - - void addUser(String username); - - void removeUser(String username) ; - -} 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 f829a981..3170e6e8 100644 --- a/src/main/java/com/youlai/boot/system/controller/LogController.java +++ b/src/main/java/com/youlai/boot/system/controller/LogController.java @@ -34,10 +34,10 @@ public class LogController { @Operation(summary = "日志分页列表") @GetMapping("/page") - public PageResult listPagedLogs( + public PageResult getLogPage( LogPageQuery queryParams ) { - Page result = logService.listPagedLogs(queryParams); + Page result = logService.getLogPage(queryParams); return PageResult.success(result); } 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 0f2d2427..bac8aa85 100644 --- a/src/main/java/com/youlai/boot/system/controller/UserController.java +++ b/src/main/java/com/youlai/boot/system/controller/UserController.java @@ -99,7 +99,7 @@ public class UserController { @Operation(summary = "删除用户") @DeleteMapping("/{ids}") @PreAuthorize("@ss.hasPerm('sys:user:delete')") - public Result deleteUsers( + public Result deleteUsers( @Parameter(description = "用户ID,多个以英文逗号(,)分割") @PathVariable String ids ) { boolean result = userService.deleteUsers(ids); @@ -108,7 +108,7 @@ public class UserController { @Operation(summary = "修改用户状态") @PatchMapping(value = "/{userId}/status") - public Result updateUserStatus( + public Result updateUserStatus( @Parameter(description = "用户ID") @PathVariable Long userId, @Parameter(description = "用户状态(1:启用;0:禁用)") @RequestParam Integer status ) { @@ -144,7 +144,7 @@ public class UserController { @Operation(summary = "导入用户") @PostMapping("/import") - public Result importUsers(MultipartFile file) throws IOException { + public Result importUsers(MultipartFile file) throws IOException { UserImportListener listener = new UserImportListener(); String msg = ExcelUtils.importExcel(file.getInputStream(), UserImportDTO.class, listener); return Result.success(msg); diff --git a/src/main/java/com/youlai/boot/system/event/UserConnectionEvent.java b/src/main/java/com/youlai/boot/system/event/UserConnectionEvent.java index 8033a2c8..dadea814 100644 --- a/src/main/java/com/youlai/boot/system/event/UserConnectionEvent.java +++ b/src/main/java/com/youlai/boot/system/event/UserConnectionEvent.java @@ -3,11 +3,33 @@ package com.youlai.boot.system.event; import lombok.Getter; import org.springframework.context.ApplicationEvent; + +/** + * 用户连接事件 + * + * @author Ray + * @since 2.3.0 + */ @Getter public class UserConnectionEvent extends ApplicationEvent { + + /** + * 用户名 + */ private final String username; + + /** + * 是否连接 + */ private final boolean connected; + /** + * 用户连接事件 + * + * @param source 事件源 + * @param username 用户名 + * @param connected 是否连接 + */ public UserConnectionEvent(Object source, String username, boolean connected) { super(source); this.username = username; diff --git a/src/main/java/com/youlai/boot/system/mapper/LogMapper.java b/src/main/java/com/youlai/boot/system/mapper/LogMapper.java index a29bc6a8..68bcefe7 100644 --- a/src/main/java/com/youlai/boot/system/mapper/LogMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/LogMapper.java @@ -28,7 +28,7 @@ public interface LogMapper extends BaseMapper { * @param queryParams * @return */ - Page listPagedLogs(Page page, LogPageQuery queryParams); + Page getLogPage(Page page, LogPageQuery queryParams); /** * 统计浏览数(PV) 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 07cb686f..0a47b0a1 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 @@ -7,6 +7,12 @@ import lombok.Setter; import java.util.List; +/** + * 访问趋势VO + * + * @author Ray + * @since 2.3.0 + */ @Schema(description = "访问趋势VO") @Getter @Setter diff --git a/src/main/java/com/youlai/boot/system/service/LogService.java b/src/main/java/com/youlai/boot/system/service/LogService.java index ccfece2c..5d80fc3d 100644 --- a/src/main/java/com/youlai/boot/system/service/LogService.java +++ b/src/main/java/com/youlai/boot/system/service/LogService.java @@ -25,7 +25,7 @@ public interface LogService extends IService { * @param queryParams 查询参数 * @return */ - Page listPagedLogs(LogPageQuery queryParams); + Page getLogPage(LogPageQuery queryParams); /** diff --git a/src/main/java/com/youlai/boot/system/service/impl/LogServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/LogServiceImpl.java index c8887e14..b6befa4d 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/LogServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/LogServiceImpl.java @@ -36,8 +36,8 @@ public class LogServiceImpl extends ServiceImpl * @return */ @Override - public Page listPagedLogs(LogPageQuery queryParams) { - return this.baseMapper.listPagedLogs(new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), + public Page getLogPage(LogPageQuery queryParams) { + return this.baseMapper.getLogPage(new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryParams); } 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 ef13a2cc..c65ad416 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 @@ -268,9 +268,32 @@ public class MenuServiceImpl extends ServiceImpl implements Me roleMenuService.refreshRolePermsCache(); } } + // 修改菜单如果有子菜单,则更新子菜单的树路径 + updateChildrenTreePath(entity.getId(), treePath); return result; } + /** + * 更新子菜单树路径 + * @param id 当前菜单ID + * @param treePath 当前菜单树路径 + */ + private void updateChildrenTreePath(Long id, String treePath) { + List children = this.list(new LambdaQueryWrapper().eq(Menu::getParentId, id)); + if (CollectionUtil.isNotEmpty(children)) { + // 子菜单的树路径等于父菜单的树路径加上父菜单ID + String childTreePath = treePath + "," + id; + this.update(new LambdaUpdateWrapper() + .eq(Menu::getParentId, id) + .set(Menu::getTreePath, childTreePath) + ); + for (Menu child : children) { + // 递归更新子菜单 + updateChildrenTreePath(child.getId(), childTreePath); + } + } + } + /** * 部门路径生成 * diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8fc2b4f8..398bb917 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -20,7 +20,6 @@ spring: port: 6379 # 如果Redis 服务未设置密码,需要将password删掉或注释,而不是设置为空字符串 password: 123456 - timeout: 10s lettuce: pool: @@ -152,7 +151,7 @@ springdoc: - com.youlai.boot.system.controller - com.youlai.boot.module.auth.controller - com.youlai.boot.module.file.controller - - com.youlai.boot.module.generator.controller + - com.youlai.boot.module.codegen.controller default-flat-param-object: true # knife4j 接口文档配置 diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 92953031..09ccde44 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -56,7 +56,6 @@ mybatis-plus: # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - # 安全配置 security: # JWT 配置 @@ -136,7 +135,7 @@ springdoc: - com.youlai.boot.system.controller - com.youlai.boot.module.auth.controller - com.youlai.boot.module.file.controller - - com.youlai.boot.module.generator.controller + - com.youlai.boot.module.codegen.controller default-flat-param-object: true # knife4j 接口文档配置 diff --git a/src/main/resources/mapper/LogMapper.xml b/src/main/resources/mapper/LogMapper.xml index ca84f4b2..6d7de53b 100644 --- a/src/main/resources/mapper/LogMapper.xml +++ b/src/main/resources/mapper/LogMapper.xml @@ -5,7 +5,7 @@ - SELECT t1.id, t1.module, diff --git a/src/main/resources/templates/codegen/controller.java.vm b/src/main/resources/templates/codegen/controller.java.vm index e0272aaa..792db37a 100644 --- a/src/main/resources/templates/codegen/controller.java.vm +++ b/src/main/resources/templates/codegen/controller.java.vm @@ -43,7 +43,7 @@ public class ${entityName}Controller { @Operation(summary = "新增${businessName}") @PostMapping @PreAuthorize("@ss.hasPerm('${moduleName}:${lowerFirstEntityName}:add')") - public Result save${entityName}(@RequestBody @Valid ${entityName}Form formData ) { + public Result save${entityName}(@RequestBody @Valid ${entityName}Form formData ) { boolean result = ${lowerFirstEntityName}Service.save${entityName}(formData); return Result.judge(result); } @@ -61,7 +61,7 @@ public class ${entityName}Controller { @Operation(summary = "修改${businessName}") @PutMapping(value = "/{id}") @PreAuthorize("@ss.hasPerm('${moduleName}:${lowerFirstEntityName}:edit')") - public Result update${entityName}( + public Result update${entityName}( @Parameter(description = "$!{businessName}ID") @PathVariable Long id, @RequestBody @Validated ${entityName}Form formData ) { @@ -72,7 +72,7 @@ public class ${entityName}Controller { @Operation(summary = "删除${businessName}") @DeleteMapping("/{ids}") @PreAuthorize("@ss.hasPerm('${moduleName}:${lowerFirstEntityName}:delete')") - public Result delete${entityName}s( + public Result delete${entityName}s( @Parameter(description = "$!{businessName}ID,多个以英文逗号(,)分割") @PathVariable String ids ) { boolean result = ${lowerFirstEntityName}Service.delete${entityName}s(ids); diff --git a/src/main/resources/templates/codegen/index.vue.vm b/src/main/resources/templates/codegen/index.vue.vm index cc369d0f..c73f6240 100644 --- a/src/main/resources/templates/codegen/index.vue.vm +++ b/src/main/resources/templates/codegen/index.vue.vm @@ -177,8 +177,6 @@ #elseif($fieldConfig.formType == "SELECT") #if($fieldConfig.dictType != "") diff --git a/src/main/resources/templates/codegen/query.java.vm b/src/main/resources/templates/codegen/query.java.vm index 137cc29f..d9716036 100644 --- a/src/main/resources/templates/codegen/query.java.vm +++ b/src/main/resources/templates/codegen/query.java.vm @@ -1,6 +1,6 @@ package ${packageName}.${moduleName}.${subpackageName}; -import com.youlai.boot.common.base.BasePageQuery; +import ${packageName}.common.base.BasePageQuery; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -23,8 +23,6 @@ import java.math.BigDecimal; @Setter public class ${entityName}Query extends BasePageQuery { - private static final long serialVersionUID = 1L; - #if($fieldConfigs) #foreach($fieldConfig in ${fieldConfigs}) #if($fieldConfig.isShowInQuery)