From af8b5c847d66c9ad1a665b7dfeef8db39c5c5fab Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Wed, 11 Jun 2025 20:47:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=8D=87=E7=BA=A7=20SpringBoot=203?= =?UTF-8?q?.5.0=20=E7=89=88=E6=9C=AC=E5=92=8C=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- pom.xml | 13 +- .../auth/controller/AuthController.java | 90 ++++++----- .../auth/enums/CaptchaTypeEnum.java | 2 +- .../{shared => }/auth/model/CaptchaInfo.java | 2 +- .../auth/model/dto/WxMiniAppCodeLoginDTO.java | 2 +- .../model/dto/WxMiniAppPhoneLoginDTO.java | 2 +- .../auth/service/AuthService.java | 8 +- .../auth/service/impl/AuthServiceImpl.java | 12 +- .../com/youlai/boot/config/MybatisConfig.java | 4 +- .../member/controller/MemberController.java | 2 +- .../member/mapper/MemberMapper.java | 2 +- .../member/model/Member.java | 2 +- .../member/service/MemberService.java | 2 +- .../order/controller/OrderController.java | 2 +- .../order/mapper/OrderMapper.java | 2 +- .../order/model/Order.java | 2 +- .../order/service/OrderService.java | 2 +- .../product/controller/ProductController.java | 2 +- .../product/mapper/ProductMapper.java | 2 +- .../product/model/Product.java | 2 +- .../product/service/ProductService.java | 2 +- .../knife4j/Knife4jOpenApiCustomizer.java | 150 ++++++++++++++++++ .../mybatis}/MyDataPermissionHandler.java | 2 +- .../mybatis}/MyMetaObjectHandler.java | 2 +- src/main/resources/application-dev.yml | 2 +- src/main/resources/application-prod.yml | 2 +- 27 files changed, 246 insertions(+), 80 deletions(-) rename src/main/java/com/youlai/boot/{shared => }/auth/controller/AuthController.java (84%) rename src/main/java/com/youlai/boot/{shared => }/auth/enums/CaptchaTypeEnum.java (88%) rename src/main/java/com/youlai/boot/{shared => }/auth/model/CaptchaInfo.java (90%) rename src/main/java/com/youlai/boot/{shared => }/auth/model/dto/WxMiniAppCodeLoginDTO.java (91%) rename src/main/java/com/youlai/boot/{shared => }/auth/model/dto/WxMiniAppPhoneLoginDTO.java (93%) rename src/main/java/com/youlai/boot/{shared => }/auth/service/AuthService.java (87%) rename src/main/java/com/youlai/boot/{shared => }/auth/service/impl/AuthServiceImpl.java (96%) rename src/main/java/com/youlai/boot/{modules => module}/member/controller/MemberController.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/member/mapper/MemberMapper.java (72%) rename src/main/java/com/youlai/boot/{modules => module}/member/model/Member.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/member/service/MemberService.java (72%) rename src/main/java/com/youlai/boot/{modules => module}/order/controller/OrderController.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/order/mapper/OrderMapper.java (72%) rename src/main/java/com/youlai/boot/{modules => module}/order/model/Order.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/order/service/OrderService.java (72%) rename src/main/java/com/youlai/boot/{modules => module}/product/controller/ProductController.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/product/mapper/ProductMapper.java (72%) rename src/main/java/com/youlai/boot/{modules => module}/product/model/Product.java (70%) rename src/main/java/com/youlai/boot/{modules => module}/product/service/ProductService.java (72%) create mode 100644 src/main/java/com/youlai/boot/pulgin/knife4j/Knife4jOpenApiCustomizer.java rename src/main/java/com/youlai/boot/{core/handler => pulgin/mybatis}/MyDataPermissionHandler.java (99%) rename src/main/java/com/youlai/boot/{core/handler => pulgin/mybatis}/MyMetaObjectHandler.java (96%) diff --git a/README.md b/README.md index c649f243..6ee30e03 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ logo

youlai-boot

有来技术 - 有来技术 + 有来技术 有来技术 @@ -70,6 +70,7 @@ youlai-boot ├── sql # SQL脚本 │ ├── mysql # MySQL 脚本 ├── src # 源码目录 +│ ├── auth # 登录认证 │ ├── common # 公共模块 │ │ ├── annotation # 注解定义 │ │ ├── base # 基础类 @@ -86,12 +87,14 @@ youlai-boot │ │ ├── filter # 过滤器(请求日志、限流) │ │ ├── handler # 处理器(数据权限、数据填充) │ │ └── security # Spring Security 安全模块 -│ ├── modules # 业务模块 +│ ├── module # 业务模块 │ │ ├── member # 会员模块【业务模块演示】 │ │ ├── order # 订单模块【业务模块演示】 │ │ ├── product # 商品模块【业务模块演示】 +│ ├── module # 插件扩展 +│ │ ├── knife4j # Knife4j 扩展 +│ │ ├── mybatis # Mybatis 扩展 │ ├── shared # 共享模块 -│ │ ├── auth # 认证模块 │ │ ├── file # 文件模块 │ │ ├── codegen # 代码生成模块 │ │ ├── mail # 邮件模块 diff --git a/pom.xml b/pom.xml index cdae3095..18be05a8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.6 + 3.5.0 @@ -152,6 +152,17 @@ com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter ${knife4j.version} + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.8.9 diff --git a/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java b/src/main/java/com/youlai/boot/auth/controller/AuthController.java similarity index 84% rename from src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java rename to src/main/java/com/youlai/boot/auth/controller/AuthController.java index 327cb8b9..c1f22dad 100644 --- a/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java +++ b/src/main/java/com/youlai/boot/auth/controller/AuthController.java @@ -1,11 +1,11 @@ -package com.youlai.boot.shared.auth.controller; +package com.youlai.boot.auth.controller; +import com.youlai.boot.auth.model.CaptchaInfo; +import com.youlai.boot.auth.model.dto.WxMiniAppPhoneLoginDTO; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; -import com.youlai.boot.shared.auth.service.AuthService; -import com.youlai.boot.shared.auth.model.CaptchaInfo; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppCodeLoginDTO; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppPhoneLoginDTO; +import com.youlai.boot.auth.service.AuthService; +import com.youlai.boot.auth.model.dto.WxMiniAppCodeLoginDTO; import com.youlai.boot.core.security.model.AuthenticationToken; import com.youlai.boot.common.annotation.Log; import io.swagger.v3.oas.annotations.Operation; @@ -32,7 +32,7 @@ public class AuthController { private final AuthService authService; - @Operation(summary = "获取登录验证码") + @Operation(summary = "获取验证码") @GetMapping("/captcha") public Result getCaptcha() { CaptchaInfo captcha = authService.getCaptcha(); @@ -50,42 +50,6 @@ public class AuthController { return Result.success(authenticationToken); } - @Operation(summary = "注销登录") - @DeleteMapping("/logout") - @Log(value = "注销", module = LogModuleEnum.LOGIN) - public Result logout() { - authService.logout(); - return Result.success(); - } - - @Operation(summary = "刷新访问令牌") - @PostMapping("/refresh-token") - public Result refreshToken( - @Parameter(description = "刷新令牌", example = "xxx.xxx.xxx") @RequestParam String refreshToken - ) { - AuthenticationToken authenticationToken = authService.refreshToken(refreshToken); - return Result.success(authenticationToken); - } - - @Operation(summary = "微信授权登录") - @PostMapping("/login/wechat") - @Log(value = "微信登录", module = LogModuleEnum.LOGIN) - public Result loginByWechat( - @Parameter(description = "微信授权码", example = "code") @RequestParam String code - ) { - AuthenticationToken loginResult = authService.loginByWechat(code); - return Result.success(loginResult); - } - - @Operation(summary = "发送登录短信验证码") - @PostMapping("/login/sms/code") - public Result sendLoginVerifyCode( - @Parameter(description = "手机号", example = "18812345678") @RequestParam String mobile - ) { - authService.sendSmsLoginCode(mobile); - return Result.success(); - } - @Operation(summary = "短信验证码登录") @PostMapping("/login/sms") @Log(value = "短信验证码登录", module = LogModuleEnum.LOGIN) @@ -97,17 +61,55 @@ public class AuthController { return Result.success(loginResult); } - @Operation(summary = "微信小程序Code登录") + @Operation(summary = "发送登录短信验证码") + @PostMapping("/sms/code") + public Result sendLoginVerifyCode( + @Parameter(description = "手机号", example = "18812345678") @RequestParam String mobile + ) { + authService.sendSmsLoginCode(mobile); + return Result.success(); + } + + @Operation(summary = "微信授权登录(Web)") + @PostMapping("/login/wechat") + @Log(value = "微信登录", module = LogModuleEnum.LOGIN) + public Result loginByWechat( + @Parameter(description = "微信授权码", example = "code") @RequestParam String code + ) { + AuthenticationToken loginResult = authService.loginByWechat(code); + return Result.success(loginResult); + } + + @Operation(summary = "微信小程序登录(Code)") @PostMapping("/wx/miniapp/code-login") public Result loginByWxMiniAppCode(@RequestBody @Valid WxMiniAppCodeLoginDTO loginDTO) { AuthenticationToken token = authService.loginByWxMiniAppCode(loginDTO); return Result.success(token); } - @Operation(summary = "微信小程序手机号登录") + @Operation(summary = "微信小程序登录(手机号)") @PostMapping("/wx/miniapp/phone-login") public Result loginByWxMiniAppPhone(@RequestBody @Valid WxMiniAppPhoneLoginDTO loginDTO) { AuthenticationToken token = authService.loginByWxMiniAppPhone(loginDTO); return Result.success(token); } + + + @Operation(summary = "退出登录") + @DeleteMapping("/logout") + @Log(value = "退出登录", module = LogModuleEnum.LOGIN) + public Result logout() { + authService.logout(); + return Result.success(); + } + + @Operation(summary = "刷新令牌") + @PostMapping("/refresh-token") + public Result refreshToken( + @Parameter(description = "刷新令牌", example = "xxx.xxx.xxx") @RequestParam String refreshToken + ) { + AuthenticationToken authenticationToken = authService.refreshToken(refreshToken); + return Result.success(authenticationToken); + } + } diff --git a/src/main/java/com/youlai/boot/shared/auth/enums/CaptchaTypeEnum.java b/src/main/java/com/youlai/boot/auth/enums/CaptchaTypeEnum.java similarity index 88% rename from src/main/java/com/youlai/boot/shared/auth/enums/CaptchaTypeEnum.java rename to src/main/java/com/youlai/boot/auth/enums/CaptchaTypeEnum.java index b2f1dd4e..c0ac69b4 100644 --- a/src/main/java/com/youlai/boot/shared/auth/enums/CaptchaTypeEnum.java +++ b/src/main/java/com/youlai/boot/auth/enums/CaptchaTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.shared.auth.enums; +package com.youlai.boot.auth.enums; /** * EasyCaptcha 验证码类型枚举 diff --git a/src/main/java/com/youlai/boot/shared/auth/model/CaptchaInfo.java b/src/main/java/com/youlai/boot/auth/model/CaptchaInfo.java similarity index 90% rename from src/main/java/com/youlai/boot/shared/auth/model/CaptchaInfo.java rename to src/main/java/com/youlai/boot/auth/model/CaptchaInfo.java index b290cc50..e4095850 100644 --- a/src/main/java/com/youlai/boot/shared/auth/model/CaptchaInfo.java +++ b/src/main/java/com/youlai/boot/auth/model/CaptchaInfo.java @@ -1,4 +1,4 @@ -package com.youlai.boot.shared.auth.model; +package com.youlai.boot.auth.model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; diff --git a/src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppCodeLoginDTO.java b/src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppCodeLoginDTO.java similarity index 91% rename from src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppCodeLoginDTO.java rename to src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppCodeLoginDTO.java index dcb516e4..69c653fb 100644 --- a/src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppCodeLoginDTO.java +++ b/src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppCodeLoginDTO.java @@ -1,4 +1,4 @@ -package com.youlai.boot.shared.auth.model.dto; +package com.youlai.boot.auth.model.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppPhoneLoginDTO.java b/src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppPhoneLoginDTO.java similarity index 93% rename from src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppPhoneLoginDTO.java rename to src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppPhoneLoginDTO.java index 8b8d052e..5a3e4c69 100644 --- a/src/main/java/com/youlai/boot/shared/auth/model/dto/WxMiniAppPhoneLoginDTO.java +++ b/src/main/java/com/youlai/boot/auth/model/dto/WxMiniAppPhoneLoginDTO.java @@ -1,4 +1,4 @@ -package com.youlai.boot.shared.auth.model.dto; +package com.youlai.boot.auth.model.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java b/src/main/java/com/youlai/boot/auth/service/AuthService.java similarity index 87% rename from src/main/java/com/youlai/boot/shared/auth/service/AuthService.java rename to src/main/java/com/youlai/boot/auth/service/AuthService.java index 2d183079..4bcb411c 100644 --- a/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java +++ b/src/main/java/com/youlai/boot/auth/service/AuthService.java @@ -1,9 +1,9 @@ -package com.youlai.boot.shared.auth.service; +package com.youlai.boot.auth.service; -import com.youlai.boot.shared.auth.model.CaptchaInfo; +import com.youlai.boot.auth.model.CaptchaInfo; +import com.youlai.boot.auth.model.dto.WxMiniAppPhoneLoginDTO; import com.youlai.boot.core.security.model.AuthenticationToken; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppCodeLoginDTO; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppPhoneLoginDTO; +import com.youlai.boot.auth.model.dto.WxMiniAppCodeLoginDTO; /** * 认证服务接口 diff --git a/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/boot/auth/service/impl/AuthServiceImpl.java similarity index 96% rename from src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java rename to src/main/java/com/youlai/boot/auth/service/impl/AuthServiceImpl.java index 3db473d9..a1bd7740 100644 --- a/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/youlai/boot/auth/service/impl/AuthServiceImpl.java @@ -1,10 +1,13 @@ -package com.youlai.boot.shared.auth.service.impl; +package com.youlai.boot.auth.service.impl; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import com.youlai.boot.auth.enums.CaptchaTypeEnum; +import com.youlai.boot.auth.model.CaptchaInfo; +import com.youlai.boot.auth.model.dto.WxMiniAppPhoneLoginDTO; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SecurityConstants; import com.youlai.boot.common.exception.BusinessException; @@ -12,12 +15,9 @@ import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.config.property.CaptchaProperties; import com.youlai.boot.core.security.extension.sms.SmsAuthenticationToken; import com.youlai.boot.core.security.util.SecurityUtils; -import com.youlai.boot.shared.auth.enums.CaptchaTypeEnum; import com.youlai.boot.core.security.model.AuthenticationToken; -import com.youlai.boot.shared.auth.model.CaptchaInfo; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppCodeLoginDTO; -import com.youlai.boot.shared.auth.model.dto.WxMiniAppPhoneLoginDTO; -import com.youlai.boot.shared.auth.service.AuthService; +import com.youlai.boot.auth.model.dto.WxMiniAppCodeLoginDTO; +import com.youlai.boot.auth.service.AuthService; import com.youlai.boot.core.security.token.TokenManager; import com.youlai.boot.shared.sms.enums.SmsTypeEnum; import com.youlai.boot.shared.sms.service.SmsService; diff --git a/src/main/java/com/youlai/boot/config/MybatisConfig.java b/src/main/java/com/youlai/boot/config/MybatisConfig.java index 233792be..b21ae27d 100644 --- a/src/main/java/com/youlai/boot/config/MybatisConfig.java +++ b/src/main/java/com/youlai/boot/config/MybatisConfig.java @@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.youlai.boot.core.handler.MyDataPermissionHandler; -import com.youlai.boot.core.handler.MyMetaObjectHandler; +import com.youlai.boot.pulgin.mybatis.MyDataPermissionHandler; +import com.youlai.boot.pulgin.mybatis.MyMetaObjectHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; diff --git a/src/main/java/com/youlai/boot/modules/member/controller/MemberController.java b/src/main/java/com/youlai/boot/module/member/controller/MemberController.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/member/controller/MemberController.java rename to src/main/java/com/youlai/boot/module/member/controller/MemberController.java index 1512905e..63644a5c 100644 --- a/src/main/java/com/youlai/boot/modules/member/controller/MemberController.java +++ b/src/main/java/com/youlai/boot/module/member/controller/MemberController.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.member.controller; +package com.youlai.boot.module.member.controller; /** * 会员控制层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/member/mapper/MemberMapper.java b/src/main/java/com/youlai/boot/module/member/mapper/MemberMapper.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/member/mapper/MemberMapper.java rename to src/main/java/com/youlai/boot/module/member/mapper/MemberMapper.java index 59be608e..f1b4f548 100644 --- a/src/main/java/com/youlai/boot/modules/member/mapper/MemberMapper.java +++ b/src/main/java/com/youlai/boot/module/member/mapper/MemberMapper.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.member.mapper; +package com.youlai.boot.module.member.mapper; /** * 会员数据访问层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/member/model/Member.java b/src/main/java/com/youlai/boot/module/member/model/Member.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/member/model/Member.java rename to src/main/java/com/youlai/boot/module/member/model/Member.java index c75fda6f..da5ac12c 100644 --- a/src/main/java/com/youlai/boot/modules/member/model/Member.java +++ b/src/main/java/com/youlai/boot/module/member/model/Member.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.member.model; +package com.youlai.boot.module.member.model; /** * 会员实体-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/member/service/MemberService.java b/src/main/java/com/youlai/boot/module/member/service/MemberService.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/member/service/MemberService.java rename to src/main/java/com/youlai/boot/module/member/service/MemberService.java index 49a8a733..304602cb 100644 --- a/src/main/java/com/youlai/boot/modules/member/service/MemberService.java +++ b/src/main/java/com/youlai/boot/module/member/service/MemberService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.member.service; +package com.youlai.boot.module.member.service; /** * 会员管理服务类-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/order/controller/OrderController.java b/src/main/java/com/youlai/boot/module/order/controller/OrderController.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/order/controller/OrderController.java rename to src/main/java/com/youlai/boot/module/order/controller/OrderController.java index 4c009b67..fee9c91c 100644 --- a/src/main/java/com/youlai/boot/modules/order/controller/OrderController.java +++ b/src/main/java/com/youlai/boot/module/order/controller/OrderController.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.order.controller; +package com.youlai.boot.module.order.controller; /** * 订单控制层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/order/mapper/OrderMapper.java b/src/main/java/com/youlai/boot/module/order/mapper/OrderMapper.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/order/mapper/OrderMapper.java rename to src/main/java/com/youlai/boot/module/order/mapper/OrderMapper.java index c6f0c108..c23001f4 100644 --- a/src/main/java/com/youlai/boot/modules/order/mapper/OrderMapper.java +++ b/src/main/java/com/youlai/boot/module/order/mapper/OrderMapper.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.order.mapper; +package com.youlai.boot.module.order.mapper; /** * 订单数据访问层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/order/model/Order.java b/src/main/java/com/youlai/boot/module/order/model/Order.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/order/model/Order.java rename to src/main/java/com/youlai/boot/module/order/model/Order.java index cd1b00ac..603d2cf8 100644 --- a/src/main/java/com/youlai/boot/modules/order/model/Order.java +++ b/src/main/java/com/youlai/boot/module/order/model/Order.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.order.model; +package com.youlai.boot.module.order.model; /** * 订单实体-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/order/service/OrderService.java b/src/main/java/com/youlai/boot/module/order/service/OrderService.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/order/service/OrderService.java rename to src/main/java/com/youlai/boot/module/order/service/OrderService.java index 0341bce7..18bc2987 100644 --- a/src/main/java/com/youlai/boot/modules/order/service/OrderService.java +++ b/src/main/java/com/youlai/boot/module/order/service/OrderService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.order.service; +package com.youlai.boot.module.order.service; /** * 订单管理服务类-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/product/controller/ProductController.java b/src/main/java/com/youlai/boot/module/product/controller/ProductController.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/product/controller/ProductController.java rename to src/main/java/com/youlai/boot/module/product/controller/ProductController.java index 480b993c..b94b35dc 100644 --- a/src/main/java/com/youlai/boot/modules/product/controller/ProductController.java +++ b/src/main/java/com/youlai/boot/module/product/controller/ProductController.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.product.controller; +package com.youlai.boot.module.product.controller; /** * 商品控制层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/product/mapper/ProductMapper.java b/src/main/java/com/youlai/boot/module/product/mapper/ProductMapper.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/product/mapper/ProductMapper.java rename to src/main/java/com/youlai/boot/module/product/mapper/ProductMapper.java index 52068175..db214a5b 100644 --- a/src/main/java/com/youlai/boot/modules/product/mapper/ProductMapper.java +++ b/src/main/java/com/youlai/boot/module/product/mapper/ProductMapper.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.product.mapper; +package com.youlai.boot.module.product.mapper; /** * 商品数据访问层-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/product/model/Product.java b/src/main/java/com/youlai/boot/module/product/model/Product.java similarity index 70% rename from src/main/java/com/youlai/boot/modules/product/model/Product.java rename to src/main/java/com/youlai/boot/module/product/model/Product.java index 6b746889..a40cb566 100644 --- a/src/main/java/com/youlai/boot/modules/product/model/Product.java +++ b/src/main/java/com/youlai/boot/module/product/model/Product.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.product.model; +package com.youlai.boot.module.product.model; /** * 商品实体-业务模块演示 diff --git a/src/main/java/com/youlai/boot/modules/product/service/ProductService.java b/src/main/java/com/youlai/boot/module/product/service/ProductService.java similarity index 72% rename from src/main/java/com/youlai/boot/modules/product/service/ProductService.java rename to src/main/java/com/youlai/boot/module/product/service/ProductService.java index 27929770..032225c2 100644 --- a/src/main/java/com/youlai/boot/modules/product/service/ProductService.java +++ b/src/main/java/com/youlai/boot/module/product/service/ProductService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.modules.product.service; +package com.youlai.boot.module.product.service; /** * 会员管理服务类-业务模块演示 diff --git a/src/main/java/com/youlai/boot/pulgin/knife4j/Knife4jOpenApiCustomizer.java b/src/main/java/com/youlai/boot/pulgin/knife4j/Knife4jOpenApiCustomizer.java new file mode 100644 index 00000000..abfe74be --- /dev/null +++ b/src/main/java/com/youlai/boot/pulgin/knife4j/Knife4jOpenApiCustomizer.java @@ -0,0 +1,150 @@ +package com.youlai.boot.pulgin.knife4j; + + +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import com.github.xiaoymin.knife4j.core.conf.ExtensionsConstants; +import com.github.xiaoymin.knife4j.core.conf.GlobalConstants; +import com.github.xiaoymin.knife4j.spring.configuration.Knife4jProperties; +import com.github.xiaoymin.knife4j.spring.configuration.Knife4jSetting; +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.models.OpenAPI; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.springdoc.core.customizers.GlobalOpenApiCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RestController; + +import java.lang.annotation.Annotation; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 增强扩展属性支持 + * @since 4.1.0 + * @author xiaoymin@foxmail.com + * 2022/12/11 22:40 + */ +@Primary +@Configuration +@Slf4j +public class Knife4jOpenApiCustomizer extends com.github.xiaoymin.knife4j.spring.extension.Knife4jOpenApiCustomizer implements GlobalOpenApiCustomizer { + final Knife4jProperties knife4jProperties; + final SpringDocConfigProperties properties; + public Knife4jOpenApiCustomizer(Knife4jProperties knife4jProperties, SpringDocConfigProperties properties) { + super(knife4jProperties,properties); + this.knife4jProperties = knife4jProperties; + this.properties = properties; + } + + @Override + public void customise(OpenAPI openApi) { + log.debug("Knife4j OpenApiCustomizer"); + if (knife4jProperties.isEnable()) { + Knife4jSetting setting = knife4jProperties.getSetting(); + OpenApiExtensionResolver openApiExtensionResolver = new OpenApiExtensionResolver(setting, knife4jProperties.getDocuments()); + // 解析初始化 + openApiExtensionResolver.start(); + Map objectMap = new HashMap<>(); + objectMap.put(GlobalConstants.EXTENSION_OPEN_SETTING_NAME, setting); + objectMap.put(GlobalConstants.EXTENSION_OPEN_MARKDOWN_NAME, openApiExtensionResolver.getMarkdownFiles()); + openApi.addExtension(GlobalConstants.EXTENSION_OPEN_API_NAME, objectMap); + addOrderExtension(openApi); + } + } + + /** + * 往OpenAPI内tags字段添加x-order属性 + * + * @param openApi openApi + */ + + private void addOrderExtension(OpenAPI openApi) { + if (CollectionUtils.isEmpty(properties.getGroupConfigs())) { + return; + } + // 获取包扫描路径 + Set packagesToScan = + properties.getGroupConfigs().stream() + .map(SpringDocConfigProperties.GroupConfig::getPackagesToScan) + .filter(toScan -> !CollectionUtils.isEmpty(toScan)) + .flatMap(List::stream) + .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(packagesToScan)) { + return; + } + // 扫描包下被ApiSupport注解的RestController Class + Set> classes = + packagesToScan.stream() + .map(packageToScan -> scanPackageByAnnotation(packageToScan, RestController.class)) + .flatMap(Set::stream) + .filter(clazz -> clazz.isAnnotationPresent(ApiSupport.class)) + .collect(Collectors.toSet()); + if (!CollectionUtils.isEmpty(classes)) { + // ApiSupport oder值存入tagSortMap + Map tagOrderMap = new HashMap<>(); + classes.forEach( + clazz -> { + Tag tag = getTag(clazz); + if (Objects.nonNull(tag)) { + ApiSupport apiSupport = clazz.getAnnotation(ApiSupport.class); + tagOrderMap.putIfAbsent(tag.name(), apiSupport.order()); + } + }); + // 往openApi tags字段添加x-order增强属性 + if (openApi.getTags() != null) { + openApi + .getTags() + .forEach( + tag -> { + if (tagOrderMap.containsKey(tag.getName())) { + tag.addExtension( + ExtensionsConstants.EXTENSION_ORDER, tagOrderMap.get(tag.getName())); + } + }); + } + } + } + + private Tag getTag(Class clazz) { + // 从类上获取 + Tag tag = clazz.getAnnotation(Tag.class); + if (Objects.isNull(tag)) { + // 从接口上获取 + Class[] interfaces = clazz.getInterfaces(); + if (ArrayUtils.isNotEmpty(interfaces)) { + for (Class interfaceClazz : interfaces) { + Tag anno = interfaceClazz.getAnnotation(Tag.class); + if (Objects.nonNull(anno)) { + tag = anno; + break; + } + } + } + } + return tag; + } + + private Set> scanPackageByAnnotation( + String packageName, final Class annotationClass) { + ClassPathScanningCandidateComponentProvider scanner = + new ClassPathScanningCandidateComponentProvider(false); + scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass)); + Set> classes = new HashSet<>(); + for (BeanDefinition beanDefinition : scanner.findCandidateComponents(packageName)) { + try { + Class clazz = Class.forName(beanDefinition.getBeanClassName()); + classes.add(clazz); + } catch (ClassNotFoundException ignore) { + + } + } + return classes; + } +} \ No newline at end of file diff --git a/src/main/java/com/youlai/boot/core/handler/MyDataPermissionHandler.java b/src/main/java/com/youlai/boot/pulgin/mybatis/MyDataPermissionHandler.java similarity index 99% rename from src/main/java/com/youlai/boot/core/handler/MyDataPermissionHandler.java rename to src/main/java/com/youlai/boot/pulgin/mybatis/MyDataPermissionHandler.java index b9703448..aa98f34e 100644 --- a/src/main/java/com/youlai/boot/core/handler/MyDataPermissionHandler.java +++ b/src/main/java/com/youlai/boot/pulgin/mybatis/MyDataPermissionHandler.java @@ -1,4 +1,4 @@ -package com.youlai.boot.core.handler; +package com.youlai.boot.pulgin.mybatis; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.StringPool; diff --git a/src/main/java/com/youlai/boot/core/handler/MyMetaObjectHandler.java b/src/main/java/com/youlai/boot/pulgin/mybatis/MyMetaObjectHandler.java similarity index 96% rename from src/main/java/com/youlai/boot/core/handler/MyMetaObjectHandler.java rename to src/main/java/com/youlai/boot/pulgin/mybatis/MyMetaObjectHandler.java index 22973a52..f4116517 100644 --- a/src/main/java/com/youlai/boot/core/handler/MyMetaObjectHandler.java +++ b/src/main/java/com/youlai/boot/pulgin/mybatis/MyMetaObjectHandler.java @@ -1,4 +1,4 @@ -package com.youlai.boot.core.handler; +package com.youlai.boot.pulgin.mybatis; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 125adea9..034a4159 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -155,8 +155,8 @@ springdoc: - group: '系统管理' paths-to-match: "/**" packages-to-scan: + - com.youlai.boot.auth.controller - com.youlai.boot.system.controller - - com.youlai.boot.shared.auth.controller - com.youlai.boot.shared.file.controller - com.youlai.boot.shared.codegen.controller default-flat-param-object: true diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index c43b5e7f..7a439faa 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -152,8 +152,8 @@ springdoc: - group: '系统管理' paths-to-match: "/**" packages-to-scan: + - com.youlai.boot.auth.controller - com.youlai.boot.system.controller - - com.youlai.boot.shared.auth.controller - com.youlai.boot.shared.file.controller - com.youlai.boot.shared.codegen.controller default-flat-param-object: true