疯狂的狮子li
2022-07-08 7f0432762534d1c2e742062d3ca67968a606086f
update 优化 自定义 openapi 处理器 彻底实现零注解无入侵生成文档
已修改40个文件
已添加1个文件
355 ■■■■ 文件已修改
pom.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/controller.java.vm 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -21,7 +21,7 @@
        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
        <spring-boot.mybatis>2.2.2</spring-boot.mybatis>
        <druid.version>1.2.11</druid.version>
        <knife4j.version>3.0.3</knife4j.version>
        <springdoc.version>1.6.9</springdoc.version>
        <swagger-annotations.version>1.5.22</swagger-annotations.version>
        <poi.version>5.2.2</poi.version>
        <easyexcel.version>3.1.1</easyexcel.version>
@@ -37,6 +37,7 @@
        <dynamic-ds.version>3.5.1</dynamic-ds.version>
        <tlog.version>1.4.3</tlog.version>
        <xxl-job.version>2.3.1</xxl-job.version>
        <lombok.version>1.18.24</lombok.version>
        <!-- ç»Ÿä¸€ guava ç‰ˆæœ¬ è§£å†³éšå¼æ¼æ´žé—®é¢˜ -->
        <guava.version>30.0-jre</guava.version>
@@ -87,13 +88,19 @@
            <dependency>
                <groupId>org.springdoc</groupId>
                <artifactId>springdoc-openapi-ui</artifactId>
                <version>1.6.9</version>
                <version>${springdoc.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springdoc</groupId>
                <artifactId>springdoc-openapi-javadoc</artifactId>
                <version>1.6.9</version>
                <version>${springdoc.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
@@ -341,7 +348,7 @@
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.24</version>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.springframework.boot</groupId>
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
@@ -19,7 +19,6 @@
import com.ruoyi.sms.core.SmsTemplate;
import com.ruoyi.sms.entity.SmsResult;
import com.ruoyi.system.service.ISysConfigService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
@@ -39,7 +38,6 @@
@Anonymous
@Slf4j
@Validated
@Tag(name = "验证码操作处理", description = "验证码管理")
@RequiredArgsConstructor
@RestController
public class CaptchaController {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
@@ -19,7 +19,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "缓存监控", description = "缓存监控管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/monitor/cache")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
@@ -24,7 +24,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "系统访问记录", description = "系统访问记录管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/monitor/logininfor")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
@@ -24,7 +24,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "操作日志记录", description = "操作日志记录管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/monitor/operlog")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
@@ -28,7 +28,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "在线用户监控", description = "在线用户监控管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/monitor/online")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
@@ -25,7 +25,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "参数配置控制器", description = "参数配置管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/config")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -26,7 +26,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "部门控制器", description = "部门管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/dept")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
@@ -12,7 +12,6 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -27,7 +26,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "数据字典信息控制器", description = "数据字典信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/dict/data")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -25,7 +25,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "数据字典信息控制器", description = "数据字典信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/dict/type")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
@@ -12,7 +12,6 @@
 *
 * @author Lion Li
 */
@Tag(name ="首页控制器", description = "首页管理")
@RequiredArgsConstructor
@RestController
public class SysIndexController {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -33,7 +33,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "登录验证控制器", description = "登录验证管理")
@RequiredArgsConstructor
@RestController
public class SysLoginController {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
@@ -25,7 +25,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "菜单信息控制器", description = "菜单信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/menu")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
@@ -20,7 +20,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "公告信息控制器", description = "公告信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/notice")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
@@ -31,7 +31,6 @@
 * @date 2021-08-13
 */
@Validated
@Tag(name = "对象存储配置控制器", description = "对象存储配置管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/oss/config")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java
@@ -40,7 +40,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "对象存储控制器", description = "对象存储管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/oss")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
@@ -11,7 +11,6 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -25,7 +24,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name ="岗位信息控制器", description = "岗位信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/post")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
@@ -31,7 +31,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "个人信息控制器", description = "个人信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user/profile")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
@@ -19,7 +19,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "注册验证控制器", description = "注册验证管理")
@RequiredArgsConstructor
@RestController
public class SysRegisterController extends BaseController {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -32,7 +32,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "角色信息控制器", description = "角色信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/role")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -45,7 +45,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "用户信息控制器", description = "用户信息管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
@@ -18,7 +18,6 @@
 * @author Michelle.Chung
 */
@Validated
@Tag(name = "邮件发送案例", description = "邮件发送案例")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/mail")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java
@@ -20,7 +20,6 @@
 */
// ç±»çº§åˆ« ç¼“存统一配置
//@CacheConfig(cacheNames = "redissonCacheMap")
@Tag(name = "spring-cache æ¼”示案例", description = "spring-cache æ¼”示案例")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/cache")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
@@ -20,7 +20,6 @@
 *
 * @author shenxinquan
 */
@Tag(name = "测试分布式锁的样例", description = "测试分布式锁的样例")
@Slf4j
@RestController
@RequestMapping("/demo/redisLock")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java
@@ -13,7 +13,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "Redis发布订阅 æ¼”示案例", description = "Redis发布订阅")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/redis/pubsub")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java
@@ -15,7 +15,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "测试分布式限流样例", description = "测试分布式限流样例")
@Slf4j
@RestController
@RequestMapping("/demo/rateLimiter")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java
@@ -22,7 +22,6 @@
 * @version 4.2.0
 */
@Validated
@Tag(name = "短信演示案例", description = "短信演示案例")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/sms")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java
@@ -14,7 +14,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "演示swagger3控制器", description = "演示swagger3接口")
@RestController
@RequestMapping("/swagger/demo")
public class Swagger3DemoController {
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java
@@ -5,7 +5,6 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.demo.domain.TestDemo;
import com.ruoyi.demo.mapper.TestDemoMapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -21,7 +20,6 @@
 * @author Lion Li
 * @date 2021-05-30
 */
@Tag(name = "测试批量方法", description = "测试批量方法")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/batch")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java
@@ -41,7 +41,6 @@
 * @date 2021-07-26
 */
@Validated
@Tag(name = "测试单表控制器", description = "测试单表管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/demo")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java
@@ -20,7 +20,6 @@
 *
 * @author Lion Li
 */
@Tag(name = "测试Excel功能", description = "测试Excel功能")
@RestController
@RequestMapping("/demo/excel")
public class TestExcelController {
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java
@@ -20,7 +20,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "测试国际化控制器", description = "测试国际化管理")
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
@@ -4,7 +4,6 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.SensitiveStrategy;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,7 +19,6 @@
 * @version 3.6.0
 * @see com.ruoyi.common.core.service.SensitiveService
 */
@Tag(name = "测试数据脱敏控制器", description = "测试数据脱敏管理")
@RestController
@RequestMapping("/demo/sensitive")
public class TestSensitiveController extends BaseController {
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java
@@ -31,7 +31,6 @@
 * @date 2021-07-26
 */
@Validated
@Tag(name = "测试树表控制器", description = "测试树表管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/tree")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java
@@ -21,7 +21,6 @@
 * @version 3.6.0
 */
@Slf4j
@Tag(name = "有界队列 æ¼”示案例", description = "有界队列")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/bounded")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java
@@ -2,7 +2,6 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.redis.QueueUtils;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
@@ -24,7 +23,6 @@
 * @version 3.6.0
 */
@Slf4j
@Tag(name = "延迟队列 æ¼”示案例", description = "延迟队列")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/delayed")
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java
@@ -3,7 +3,6 @@
import cn.hutool.core.util.RandomUtil;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.redis.QueueUtils;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,7 +21,6 @@
 * @version 3.6.0
 */
@Slf4j
@Tag(name = "优先队列 æ¼”示案例", description = "优先队列")
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/priority")
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
@@ -1,11 +1,15 @@
package com.ruoyi.framework.config;
import com.ruoyi.framework.config.properties.SwaggerProperties;
import com.ruoyi.framework.handler.OpenApiHandler;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.SpringDocConfiguration;
import org.springdoc.core.*;
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
import org.springdoc.core.providers.JavadocProvider;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -14,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
 * Swagger æ–‡æ¡£é…ç½®
@@ -57,4 +62,17 @@
        info.setVersion(infoProperties.getVersion());
        return info;
    }
    /**
     * è‡ªå®šä¹‰ openapi å¤„理器
     */
    @Bean
    public OpenAPIService openApiBuilder(Optional<OpenAPI> openAPI,
                                         SecurityService securityParser,
                                         SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
                                         Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers,
                                         Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomisers, Optional<JavadocProvider> javadocProvider) {
        return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider);
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,272 @@
package com.ruoyi.framework.handler;
import cn.hutool.core.io.IoUtil;
import io.swagger.v3.core.jackson.TypeNameResolver;
import io.swagger.v3.core.util.AnnotationsUtils;
import io.swagger.v3.oas.annotations.tags.Tags;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.oas.models.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springdoc.core.OpenAPIService;
import org.springdoc.core.PropertyResolverUtils;
import org.springdoc.core.SecurityService;
import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
import org.springdoc.core.providers.JavadocProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.method.HandlerMethod;
import java.io.StringReader;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * è‡ªå®šä¹‰ openapi å¤„理器
 * å¯¹æºç åŠŸèƒ½è¿›è¡Œä¿®æ”¹ å¢žå¼ºä½¿ç”¨
 */
@SuppressWarnings("all")
public class OpenApiHandler extends OpenAPIService {
    /**
     * The constant LOGGER.
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(OpenAPIService.class);
    /**
     * The Context.
     */
    private ApplicationContext context;
    /**
     * The Security parser.
     */
    private final SecurityService securityParser;
    /**
     * The Mappings map.
     */
    private final Map<String, Object> mappingsMap = new HashMap<>();
    /**
     * The Springdoc tags.
     */
    private final Map<HandlerMethod, io.swagger.v3.oas.models.tags.Tag> springdocTags = new HashMap<>();
    /**
     * The Open api builder customisers.
     */
    private final Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers;
    /**
     * The server base URL customisers.
     */
    private final Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers;
    /**
     * The Spring doc config properties.
     */
    private final SpringDocConfigProperties springDocConfigProperties;
    /**
     * The Open api.
     */
    private OpenAPI openAPI;
    /**
     * The Cached open api map.
     */
    private final Map<String, OpenAPI> cachedOpenAPI = new HashMap<>();
    /**
     * The Is servers present.
     */
    private boolean isServersPresent;
    /**
     * The Server base url.
     */
    private String serverBaseUrl;
    /**
     * The Property resolver utils.
     */
    private final PropertyResolverUtils propertyResolverUtils;
    /**
     * The javadoc provider.
     */
    private final Optional<JavadocProvider> javadocProvider;
    /**
     * The Basic error controller.
     */
    private static Class<?> basicErrorController;
    static {
        try {
            //spring-boot 2
            basicErrorController = Class.forName("org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController");
        } catch (ClassNotFoundException e) {
            //spring-boot 1
            try {
                basicErrorController = Class.forName("org.springframework.boot.autoconfigure.web.BasicErrorController");
            } catch (ClassNotFoundException classNotFoundException) {
                //Basic error controller class not found
                LOGGER.trace(classNotFoundException.getMessage());
            }
        }
    }
    /**
     * Instantiates a new Open api builder.
     *
     * @param openAPI                   the open api
     * @param securityParser            the security parser
     * @param springDocConfigProperties the spring doc config properties
     * @param propertyResolverUtils     the property resolver utils
     * @param openApiBuilderCustomizers the open api builder customisers
     * @param serverBaseUrlCustomizers  the server base url customizers
     * @param javadocProvider           the javadoc provider
     */
    public OpenApiHandler(Optional<OpenAPI> openAPI, SecurityService securityParser,
                          SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
                          Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
                          Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
                          Optional<JavadocProvider> javadocProvider) {
        super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);
        if (openAPI.isPresent()) {
            this.openAPI = openAPI.get();
            if (this.openAPI.getComponents() == null)
                this.openAPI.setComponents(new Components());
            if (this.openAPI.getPaths() == null)
                this.openAPI.setPaths(new Paths());
            if (!CollectionUtils.isEmpty(this.openAPI.getServers()))
                this.isServersPresent = true;
        }
        this.propertyResolverUtils = propertyResolverUtils;
        this.securityParser = securityParser;
        this.springDocConfigProperties = springDocConfigProperties;
        this.openApiBuilderCustomisers = openApiBuilderCustomizers;
        this.serverBaseUrlCustomizers = serverBaseUrlCustomizers;
        this.javadocProvider = javadocProvider;
        if (springDocConfigProperties.isUseFqn())
            TypeNameResolver.std.setUseFqn(true);
    }
    @Override
    public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI, Locale locale) {
        Set<Tag> tags = new HashSet<>();
        Set<String> tagsStr = new HashSet<>();
        buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr, locale);
        buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr, locale);
        if (!CollectionUtils.isEmpty(tagsStr))
            tagsStr = tagsStr.stream()
                .map(str -> propertyResolverUtils.resolve(str, locale))
                .collect(Collectors.toSet());
        if (springdocTags.containsKey(handlerMethod)) {
            io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod);
            tagsStr.add(tag.getName());
            if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
                openAPI.addTagsItem(tag);
            }
        }
        if (!CollectionUtils.isEmpty(tagsStr)) {
            if (CollectionUtils.isEmpty(operation.getTags()))
                operation.setTags(new ArrayList<>(tagsStr));
            else {
                Set<String> operationTagsSet = new HashSet<>(operation.getTags());
                operationTagsSet.addAll(tagsStr);
                operation.getTags().clear();
                operation.getTags().addAll(operationTagsSet);
            }
        }
        if (isAutoTagClasses(operation)) {
            if (javadocProvider.isPresent()) {
                String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType());
                if (StringUtils.isNotBlank(description)) {
                    io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag();
                    // è‡ªå®šä¹‰éƒ¨åˆ† ä¿®æ”¹ä½¿ç”¨java注释当tag名
                    List<String> list = IoUtil.readLines(new StringReader(description), new ArrayList<>());
                    // tag.setName(tagAutoName);
                    tag.setName(list.get(0));
                    operation.addTagsItem(list.get(0));
                    tag.setDescription(description);
                    if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
                        openAPI.addTagsItem(tag);
                    }
                }
            } else {
                String tagAutoName = splitCamelCase(handlerMethod.getBeanType().getSimpleName());
                operation.addTagsItem(tagAutoName);
            }
        }
        if (!CollectionUtils.isEmpty(tags)) {
            // Existing tags
            List<io.swagger.v3.oas.models.tags.Tag> openApiTags = openAPI.getTags();
            if (!CollectionUtils.isEmpty(openApiTags))
                tags.addAll(openApiTags);
            openAPI.setTags(new ArrayList<>(tags));
        }
        // Handle SecurityRequirement at operation level
        io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser
            .getSecurityRequirements(handlerMethod);
        if (securityRequirements != null) {
            if (securityRequirements.length == 0)
                operation.setSecurity(Collections.emptyList());
            else
                securityParser.buildSecurityRequirement(securityRequirements, operation);
        }
        return operation;
    }
    private void buildTagsFromMethod(Method method, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr, Locale locale) {
        // method tags
        Set<Tags> tagsSet = AnnotatedElementUtils
            .findAllMergedAnnotations(method, Tags.class);
        Set<io.swagger.v3.oas.annotations.tags.Tag> methodTags = tagsSet.stream()
            .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
        methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class));
        if (!CollectionUtils.isEmpty(methodTags)) {
            tagsStr.addAll(methodTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet()));
            List<io.swagger.v3.oas.annotations.tags.Tag> allTags = new ArrayList<>(methodTags);
            addTags(allTags, tags, locale);
        }
    }
    private void addTags(List<io.swagger.v3.oas.annotations.tags.Tag> sourceTags, Set<io.swagger.v3.oas.models.tags.Tag> tags, Locale locale) {
        Optional<Set<io.swagger.v3.oas.models.tags.Tag>> optionalTagSet = AnnotationsUtils
            .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true);
        optionalTagSet.ifPresent(tagsSet -> {
            tagsSet.forEach(tag -> {
                tag.name(propertyResolverUtils.resolve(tag.getName(), locale));
                tag.description(propertyResolverUtils.resolve(tag.getDescription(), locale));
                if (tags.stream().noneMatch(t -> t.getName().equals(tag.getName())))
                    tags.add(tag);
            });
        });
    }
}
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
@@ -29,7 +29,6 @@
 * @author Lion Li
 */
@Validated
@Tag(name = "代码生成", description = "代码生成管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/tool/gen")
ruoyi-generator/src/main/resources/vm/java/controller.java.vm
@@ -27,16 +27,14 @@
import com.ruoyi.common.core.page.TableDataInfo;
#elseif($table.tree)
#end
import io.swagger.v3.oas.annotations.tags.Tag;
/**
 * ${functionName}Controller
 * ${functionName}
 *
 * @author ${author}
 * @date ${datetime}
 */
@Validated
@Tag(name ="${functionName}控制器", description = "${functionName}管理")
@RequiredArgsConstructor
@RestController
@RequestMapping("/${moduleName}/${businessName}")