Explorar el Código

由于之前对 springboot 的升级, 原有的 springfox 不再支持某些功能(比如 spring-boot-starter-actuator), 故更换为 springdoc

reghao hace 11 meses
padre
commit
4ba3c322b9
Se han modificado 75 ficheros con 521 adiciones y 743 borrados
  1. 3 3
      account/account-service/pom.xml
  2. 30 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/config/SpringDocConfig.java
  3. 0 43
      account/account-service/src/main/java/cn/reghao/tnb/account/app/config/SwaggerConfig.java
  4. 7 7
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountAuthController.java
  5. 6 6
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java
  6. 8 8
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountOAuthController.java
  7. 7 7
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountProfileController.java
  8. 5 5
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRecordController.java
  9. 5 5
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRegistryController.java
  10. 5 5
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountResourceController.java
  11. 3 3
      content/content-service/pom.xml
  12. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatDialogController.java
  13. 12 12
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatMessageController.java
  14. 3 3
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatMsgController.java
  15. 4 4
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatRecordController.java
  16. 2 2
      content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/EmoticonController.java
  17. 0 54
      content/content-service/src/main/java/cn/reghao/tnb/content/app/config/BeansConfig.java
  18. 30 0
      content/content-service/src/main/java/cn/reghao/tnb/content/app/config/SpringDocConfig.java
  19. 0 93
      content/content-service/src/main/java/cn/reghao/tnb/content/app/config/SwaggerConfig.java
  20. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ArticleController.java
  21. 9 9
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ArticlePostController.java
  22. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/AudioController.java
  23. 8 8
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/AudioPostController.java
  24. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ImagePostController.java
  25. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ImageQueryController.java
  26. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamController.java
  27. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamResultController.java
  28. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamStatisticController.java
  29. 8 8
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/PaperController.java
  30. 8 8
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/QuestionController.java
  31. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/SubjectController.java
  32. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/controller/MapController.java
  33. 9 9
      content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/controller/PhotoMapController.java
  34. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/CartController.java
  35. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/DeliveryController.java
  36. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/LogisticsController.java
  37. 8 8
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/ProductController.java
  38. 4 4
      content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/controller/AndroidController.java
  39. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/AlbumPostController.java
  40. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/AlbumQueryController.java
  41. 4 4
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CategoryController.java
  42. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CommentController.java
  43. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/ContentController.java
  44. 9 9
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CrawledDataController.java
  45. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/DanmakuController.java
  46. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/RecommendController.java
  47. 6 6
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/SearchController.java
  48. 7 7
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoController.java
  49. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoPlayController.java
  50. 13 13
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoPostController.java
  51. 12 12
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoQueryController.java
  52. 5 5
      content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/WatchAnalysisController.java
  53. 3 3
      file/file-service/pom.xml
  54. 30 0
      file/file-service/src/main/java/cn/reghao/tnb/file/app/config/SpringDocConfig.java
  55. 0 47
      file/file-service/src/main/java/cn/reghao/tnb/file/app/config/SwaggerConfig.java
  56. 5 5
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/AliyunController.java
  57. 4 4
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/AvatarController.java
  58. 8 8
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OrderController.java
  59. 7 7
      file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OssController.java
  60. 0 6
      message/message-service/pom.xml
  61. 0 43
      message/message-service/src/main/java/cn/reghao/tnb/message/app/config/SwaggerConfig.java
  62. 0 4
      message/message-service/src/main/java/cn/reghao/tnb/message/app/controller/MessageController.java
  63. 0 6
      search/search-service/pom.xml
  64. 2 5
      search/search-service/src/main/java/cn/reghao/tnb/search/app/controller/SearchController.java
  65. 3 3
      user/user-service/pom.xml
  66. 30 0
      user/user-service/src/main/java/cn/reghao/tnb/user/app/config/SpringDocConfig.java
  67. 0 43
      user/user-service/src/main/java/cn/reghao/tnb/user/app/config/SwaggerConfig.java
  68. 5 5
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/CrawledUserController.java
  69. 14 14
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/GroupController.java
  70. 15 15
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserContactController.java
  71. 6 6
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserMessageController.java
  72. 6 6
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserProfileController.java
  73. 8 8
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserRelationController.java
  74. 6 6
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserVipController.java
  75. 7 7
      user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserWalletController.java

+ 3 - 3
account/account-service/pom.xml

@@ -114,9 +114,9 @@
         </dependency>
 
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.7.0</version>
         </dependency>
 
         <dependency>

+ 30 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/config/SpringDocConfig.java

@@ -0,0 +1,30 @@
+package cn.reghao.tnb.account.app.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * SpringDoc API 文档相关配置
+ *
+ * @author reghao
+ * @date 2025-06-09 19:01:07
+ */
+@Configuration
+public class SpringDocConfig {
+    @Bean
+    public OpenAPI springOpenAPI() {
+        return new OpenAPI()
+                .info(new Info()
+                        .title("account api")
+                        .description("account api")
+                        .version("v0.0.1")
+                        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
+                .externalDocs(new ExternalDocumentation()
+                        .description("account api")
+                        .url("https://git.reghao.cn/reghao/tnb"));
+    }
+}

+ 0 - 43
account/account-service/src/main/java/cn/reghao/tnb/account/app/config/SwaggerConfig.java

@@ -1,43 +0,0 @@
-package cn.reghao.tnb.account.app.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * 配置 Swagger
- * Swagger 仅在 dev 环境生效
- *
- * @author reghao
- * @date 2019-05-14 17:01:07
- */
-@Profile({"dev"})
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-    @Bean
-    public Docket createRestApi() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .select()
-                .apis(RequestHandlerSelectors.basePackage("cn.reghao.tnb.account.app.controller"))
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    private ApiInfo apiInfo() {
-        return new ApiInfoBuilder()
-                .title("account APIs")
-                .description("")
-                .termsOfServiceUrl("")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 7 - 7
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountAuthController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import cn.reghao.tnb.account.app.model.dto.AccountToken;
 import cn.reghao.tnb.account.app.service.AccountTokenService;
 import com.google.gson.JsonObject;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-10-19 14:38:03
  */
-@Api(tags = "帐号认证页面")
+@Tag(name = "帐号认证页面")
 @Controller
 public class AccountAuthController {
     private final AccountTokenService accountTokenService;
@@ -24,19 +24,19 @@ public class AccountAuthController {
         this.accountTokenService = accountTokenService;
     }
 
-    @ApiOperation(value = "帐号首页", notes = "N")
+    @Operation(summary = "帐号首页", description = "N")
     @GetMapping("/")
     public String indexPage() {
         return "/index";
     }
 
-    @ApiOperation(value = "帐号认证页面", notes = "N")
+    @Operation(summary = "帐号认证页面", description = "N")
     @GetMapping("/login")
     public String loginPage() {
         return "/auth/login";
     }
 
-    @ApiOperation(value = "帐号登出接口", notes = "N")
+    @Operation(summary = "帐号登出接口", description = "N")
     @GetMapping("/logout")
     public String logoutPage() {
         // 注销当前登录的设备
@@ -44,7 +44,7 @@ public class AccountAuthController {
         return "redirect:/login";
     }
 
-    @ApiOperation(value = "刷新 jwt 令牌", notes = "N")
+    @Operation(summary = "刷新 jwt 令牌", description = "N")
     @PostMapping(value = "/api/auth/token/refresh", produces = MediaType.APPLICATION_JSON_VALUE)
     @ResponseBody
     public String refreshToken(@RequestBody String refreshToken) throws Exception {

+ 6 - 6
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.account.api.dto.VerifyCode;
 import cn.reghao.tnb.account.api.dto.RsaPubkey;
 import cn.reghao.tnb.account.app.service.CodeService;
 import cn.reghao.tnb.account.app.service.PubkeyService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -22,7 +22,7 @@ import java.util.Base64;
  * @author reghao
  * @date 2022-02-18 16:05:30
  */
-@Api(tags = "验证码接口")
+@Tag(name = "验证码接口")
 @RestController
 @RequestMapping("/api/auth/code")
 public class AccountCodeController {
@@ -34,14 +34,14 @@ public class AccountCodeController {
         this.pubkeyService = pubkeyService;
     }
 
-    @ApiOperation(value = "获取加密需要的公钥", notes = "N")
+    @Operation(summary = "获取加密需要的公钥", description = "N")
     @GetMapping(value = "/pubkey", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPubkey(@RequestParam("channel") Integer channel) throws NoSuchAlgorithmException {
         RsaPubkey rsaPubkey = pubkeyService.getPubkey();
         return WebResult.success(rsaPubkey);
     }
 
-    @ApiOperation(value = "获取图形验证码", notes = "N")
+    @Operation(summary = "获取图形验证码", description = "N")
     @GetMapping(value = "/captcha", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getCaptcha() throws IOException {
         InputStream in = codeService.generateCaptcha();
@@ -51,7 +51,7 @@ public class AccountCodeController {
         return WebResult.success(imageStr);
     }
 
-    @ApiOperation(value = "获取短信/邮件验证码", notes = "N")
+    @Operation(summary = "获取短信/邮件验证码", description = "N")
     @PostMapping(value = "/verify", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVerifyCode(@RequestBody @Validated VerifyCode verifyCode) {
         Result result = codeService.sendVerifyCode(verifyCode);

+ 8 - 8
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountOAuthController.java

@@ -4,15 +4,15 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.account.app.model.dto.OAuthAppDto;
 import cn.reghao.tnb.account.app.model.po.oauth.ClientDetails;
 import cn.reghao.tnb.account.app.service.OAuthAppService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@Api(tags = "OAuth 应用接口")
+@Tag(name = "OAuth 应用接口")
 @RestController
 @RequestMapping("/api/account/oauth")
 public class AccountOAuthController {
@@ -22,35 +22,35 @@ public class AccountOAuthController {
 		this.oAuthAppService = oAuthAppService;
 	}
 
-	@ApiOperation(value = "创建 OAuth 应用", notes = "N")
+	@Operation(summary = "创建 OAuth 应用", description = "N")
 	@PostMapping(value = "/create")
 	public String createOAuthApp(@RequestBody @Validated OAuthAppDto oAuthAppDto) {
 		oAuthAppService.create(oAuthAppDto);
 		return WebResult.success();
 	}
 
-	@ApiOperation(value = "更新 OAuth 应用", notes = "N")
+	@Operation(summary = "更新 OAuth 应用", description = "N")
 	@PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
 	public String updateOAuthApp(@RequestBody @Validated OAuthAppDto oAuthAppDto) {
 		oAuthAppService.create(oAuthAppDto);
 		return WebResult.success();
 	}
 
-	@ApiOperation(value = "删除 OAuth 应用", notes = "N")
+	@Operation(summary = "删除 OAuth 应用", description = "N")
 	@PostMapping("/delete/{appId}")
 	public String delete(@PathVariable String appId) {
 		oAuthAppService.delete(appId);
 		return WebResult.success();
 	}
 
-	@ApiOperation(value = "OAuth 应用列表", notes = "N")
+	@Operation(summary = "OAuth 应用列表", description = "N")
 	@GetMapping("/list")
 	public String getOAuthApps() {
 		List<ClientDetails> list = oAuthAppService.getAll();
 		return WebResult.success(list);
 	}
 
-	@ApiOperation(value = "OAuth 应用详情", notes = "N")
+	@Operation(summary = "OAuth 应用详情", description = "N")
 	@GetMapping(value = "/view/{appName}")
 	public String getOAuthApp(@PathVariable("appName") String appName) {
 		ClientDetails clientDetails = oAuthAppService.get(appName);

+ 7 - 7
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountProfileController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.account.app.model.dto.PasswordUpdateDto;
 import cn.reghao.tnb.account.app.model.dto.UserEmailUpdate;
 import cn.reghao.tnb.account.app.service.AccountProfileService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -17,7 +17,7 @@ import javax.validation.constraints.NotBlank;
  * @author reghao
  * @date 2023-10-28 22:34:47
  */
-@Api(tags = "帐号管理接口")
+@Tag(name = "帐号管理接口")
 @RestController
 @RequestMapping("/api/account")
 public class AccountProfileController {
@@ -27,28 +27,28 @@ public class AccountProfileController {
         this.accountProfileService = accountProfileService;
     }
 
-    @ApiOperation(value = "修改用户名", notes = "N")
+    @Operation(summary = "修改用户名", description = "N")
     @PostMapping(value = "/screenname", produces = MediaType.APPLICATION_JSON_VALUE)
     public String updateUserScreenName(@NotBlank(message = "用户名不能为空") String screenName) {
         Result result = accountProfileService.updateUserScreenName(screenName);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "修改手机号/邮箱", notes = "N")
+    @Operation(summary = "修改手机号/邮箱", description = "N")
     @PostMapping(value = "/email", produces = MediaType.APPLICATION_JSON_VALUE)
     public String updateUserEmail(@RequestBody @Validated UserEmailUpdate userEmailUpdate) throws Exception {
         Result result = accountProfileService.updateUserEmail(userEmailUpdate);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "修改密码(已登录)", notes = "N")
+    @Operation(summary = "修改密码(已登录)", description = "N")
     @PostMapping(value = "/password", produces = MediaType.APPLICATION_JSON_VALUE)
     public String updateUserPassword(@RequestBody @Validated PasswordUpdateDto passwordUpdateDto) {
         Result result = accountProfileService.updatePassword(passwordUpdateDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "删除账号", notes = "N")
+    @Operation(summary = "删除账号", description = "N")
     @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteAccount() {
         return WebResult.success();

+ 5 - 5
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRecordController.java

@@ -5,8 +5,8 @@ import cn.reghao.tnb.account.app.model.vo.LoginRecordVo;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
 import cn.reghao.tnb.account.app.service.AccountTokenService;
 import cn.reghao.tnb.account.app.service.LoginAttemptService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
@@ -19,7 +19,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-07-31 10:34:41
  */
-@Api(tags = "帐号登录日志接口")
+@Tag(name = "帐号登录日志接口")
 @RestController
 @RequestMapping("/api/account")
 public class AccountRecordController {
@@ -32,14 +32,14 @@ public class AccountRecordController {
 		this.accountTokenService = accountTokenService;
 	}
 
-	@ApiOperation(value = "获取登录日志列表", notes = "N")
+	@Operation(summary = "获取登录日志列表", description = "N")
 	@GetMapping("/record/list")
 	public String list(ModelMap model) {
 		List<LoginRecordVo> list = loginAttemptService.getActiveLogin();
 		return WebResult.success(list);
 	}
 
-	@ApiOperation(value = "注销某次登录", notes = "N")
+	@Operation(summary = "注销某次登录", description = "N")
 	@PostMapping(value = "/deactivate/{loginId}", produces = MediaType.APPLICATION_JSON_VALUE)
 	public String deactivateLogin(@PathVariable("loginId") String loginId) {
 		AccountAuthToken authToken = accountTokenService.getAuthedToken();

+ 5 - 5
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRegistryController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.account.app.model.dto.UserRegisterDto;
 import cn.reghao.tnb.account.app.model.dto.PasswordResetDto;
 import cn.reghao.tnb.account.app.service.AccountRegistryService;
 import cn.reghao.tnb.account.app.service.AccountProfileService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2022-04-13 10:04:41
  */
-@Api(tags = "账号注册接口")
+@Tag(name = "账号注册接口")
 @RestController
 @RequestMapping("/api/auth")
 public class AccountRegistryController {
@@ -31,14 +31,14 @@ public class AccountRegistryController {
         this.accountProfileService = accountProfileService;
     }
 
-    @ApiOperation(value = "注册用户", notes = "N")
+    @Operation(summary = "注册用户", description = "N")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String signup(@RequestBody @Validated UserRegisterDto userRegisterDto) {
         Result result = accountRegistryService.createAccount(userRegisterDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "重置密码", notes = "N")
+    @Operation(summary = "重置密码", description = "N")
     @PostMapping(value = "/forgot", produces = MediaType.APPLICATION_JSON_VALUE)
     public String forgotPassword(@RequestBody @Validated PasswordResetDto passwordResetDto) {
         Result result = accountProfileService.resetPassword(passwordResetDto);

+ 5 - 5
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountResourceController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.account.api.dto.AccountInfo;
 import cn.reghao.tnb.account.api.dto.OAuthAccountInfo;
 import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.account.app.db.mapper.UserAccountMapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
  * @date 2023-07-31 11:31:04
  */
 @Slf4j
-@Api(tags = "OAuth2 资源服务器接口")
+@Tag(name = "OAuth2 资源服务器接口")
 @RestController
 @RequestMapping("/api/account/resource")
 public class AccountResourceController {
@@ -31,7 +31,7 @@ public class AccountResourceController {
         this.accountQuery = accountQuery;
     }
 
-    @ApiOperation(value = "OAuth2 认证访问", notes = "N")
+    @Operation(summary = "OAuth2 认证访问", description = "N")
     @GetMapping("/my/1")
     public String getUserInfo() {
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
@@ -66,7 +66,7 @@ public class AccountResourceController {
         return accountInfo;
     }
 
-    @ApiOperation(value = "OAuth2 认证访问", notes = "N")
+    @Operation(summary = "OAuth2 认证访问", description = "N")
     @PostMapping("/user/2")
     public String getUserInfo1() {
         log.info("get user info by oauth");

+ 3 - 3
content/content-service/pom.xml

@@ -171,9 +171,9 @@
         </dependency>
 
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.7.0</version>
         </dependency>
 
         <!--<dependency>

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatDialogController.java

@@ -3,7 +3,7 @@ package cn.reghao.tnb.content.app.chat.controller;
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.tnb.content.app.chat.model.dto.chat.*;
 import cn.reghao.tnb.content.app.chat.service.ChatDialogService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,42 +22,42 @@ public class ChatDialogController {
         this.chatDialogService = chatDialogService;
     }
 
-    @ApiOperation(value = "创建聊天窗口")
+    @Operation(summary = "创建聊天窗口")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkCreate(@RequestBody ChatInitial chatInitial) {
         ChatInitialRet chatInitialRet = chatDialogService.createChatDialog(chatInitial);
         return WebResult.success(chatInitialRet);
     }
 
-    @ApiOperation(value = "获取聊天窗口列表")
+    @Operation(summary = "获取聊天窗口列表")
     @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkList() {
         List<ChatInitialRet> list = chatDialogService.getChatDialogs();
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "删除聊天窗口")
+    @Operation(summary = "删除聊天窗口")
     @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkDelete(@RequestBody ChatDelete chatDelete) {
         chatDialogService.deleteChatDialog(chatDelete.getListId());
         return WebResult.success();
     }
 
-    @ApiOperation(value = "对话框置顶/取消置顶")
+    @Operation(summary = "对话框置顶/取消置顶")
     @PostMapping(value = "/topping", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkTopping(@RequestBody ChatTop chatTop) {
         chatDialogService.setChatDialogTop(chatTop);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "设置/取消聊天消息免打扰")
+    @Operation(summary = "设置/取消聊天消息免打扰")
     @PostMapping(value = "/disturb", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkDisturb(@RequestBody ChatDisturb chatDisturb) {
         chatDialogService.setChatDialogDisturb(chatDisturb);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "清空聊天窗口的未读消息")
+    @Operation(summary = "清空聊天窗口的未读消息")
     @PostMapping(value = "/unread/clear", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkUnreadClear(@RequestBody ChatUnreadClear chatUnreadClear) {
         chatDialogService.clearUnread(chatUnreadClear.getReceiverId());

+ 12 - 12
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatMessageController.java

@@ -5,7 +5,7 @@ import cn.reghao.tnb.content.app.chat.model.dto.chat.ChatRecordDelete;
 import cn.reghao.tnb.content.app.chat.model.dto.chat.ChatRecordRevoke;
 import cn.reghao.tnb.content.app.chat.model.dto.message.*;
 import cn.reghao.tnb.content.app.chat.service.ChatMessageService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -24,54 +24,54 @@ public class ChatMessageController {
         this.chatMessageService = chatMessageService;
     }
 
-    @ApiOperation(value = "发送文本消息")
+    @Operation(summary = "发送文本消息")
     @PostMapping(value = "/message/text", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageText(@RequestBody TextMsg textMsg) throws IOException {
         chatMessageService.sendTextMessage(textMsg);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "发送表情包消息")
+    @Operation(summary = "发送表情包消息")
     @PostMapping(value = "/message/emoticon", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageEmoticon(@RequestBody EmoticonMsg emoticonMsg) {
         chatMessageService.sendEmoticonMessage(emoticonMsg);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "发送图片消息")
+    @Operation(summary = "发送图片消息")
     @PostMapping(value = "/message/image", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageImage(ImageMsg imageMsg) throws IOException {
         chatMessageService.sendImageMessage(imageMsg);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "发送文件消息")
+    @Operation(summary = "发送文件消息")
     @PostMapping(value = "/message/file", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageFile(@RequestBody FileMsg fileMsg) throws IOException {
         chatMessageService.sendFileMessage(fileMsg);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "转发聊天记录消息")
+    @Operation(summary = "转发聊天记录消息")
     @PostMapping(value = "/message/forward", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageForward(@RequestBody ForwardMsg forwardMsg) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "发送代码块消息")
+    @Operation(summary = "发送代码块消息")
     @PostMapping(value = "/message/code", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageCode(@RequestBody CodeBlockMsg codeBlockMsg) throws IOException {
         chatMessageService.sendCodeBlockMessage(codeBlockMsg);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "(群组中)发送投票消息")
+    @Operation(summary = "(群组中)发送投票消息")
     @PostMapping(value = "/message/vote", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageVote(@RequestBody VoteMsg voteMsg) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "(群组中)进行投票")
+    @Operation(summary = "(群组中)进行投票")
     @PostMapping(value = "/message/vote/handle", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageVoteHandle(@RequestParam("record_id") int recordId,
                                         @RequestParam("options") String options) {
@@ -79,7 +79,7 @@ public class ChatMessageController {
         return WebResult.success(voteMsgResult);
     }
 
-    @ApiOperation(value = "撤回消息")
+    @Operation(summary = "撤回消息")
     @PostMapping(value = "/message/revoke", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageRevoke(@RequestBody ChatRecordRevoke chatRecordRevoke) throws IOException {
         long recordId = chatRecordRevoke.getRecordId();
@@ -87,13 +87,13 @@ public class ChatMessageController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "删除消息")
+    @Operation(summary = "删除消息")
     @PostMapping(value = "/message/delete", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageDelete(@RequestBody ChatRecordDelete chatRecordDelete) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "收藏(表情包)消息")
+    @Operation(summary = "收藏(表情包)消息")
     @PostMapping(value = "/message/collect", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageCollect(@RequestParam("record_id") int recordId) {
         return WebResult.success();

+ 3 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatMsgController.java

@@ -3,7 +3,7 @@ package cn.reghao.tnb.content.app.chat.controller;
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.tnb.content.app.chat.model.dto.message.*;
 import cn.reghao.tnb.content.app.chat.service.ChatMessageService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -21,7 +21,7 @@ public class ChatMsgController {
         this.chatMessageService = chatMessageService;
     }
 
-    @ApiOperation(value = "发送图片消息")
+    @Operation(summary = "发送图片消息")
     @PostMapping(value = "/message/image", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkMessageImage(@RequestBody @Validated ImageMessage imageMessage) throws Exception {
         String url = chatMessageService.putImageMessage(imageMessage);
@@ -32,7 +32,7 @@ public class ChatMsgController {
         return WebResult.failWithMsg("not get signed url");
     }
 
-    @ApiOperation(value = "heatmap")
+    @Operation(summary = "heatmap")
     @GetMapping(value = "/heatmap", produces = MediaType.APPLICATION_JSON_VALUE)
     public String heatMap() {
         return WebResult.success(chatMessageService.getDateList());

+ 4 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/ChatRecordController.java

@@ -4,7 +4,7 @@ import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.tnb.content.app.chat.model.dto.chat.ChatRecordGet;
 import cn.reghao.tnb.content.app.chat.model.dto.chat.ChatRecordGetRetList;
 import cn.reghao.tnb.content.app.chat.service.ChatRecordService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,7 +23,7 @@ public class ChatRecordController {
         this.chatRecordService = chatRecordService;
     }
 
-    @ApiOperation(value = "获取与联系人的聊天记录")
+    @Operation(summary = "获取与联系人的聊天记录")
     @GetMapping(value = "/records", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkRecords(ChatRecordGet chatRecordGet) {
         long receiverId = chatRecordGet.getReceiverId();
@@ -34,7 +34,7 @@ public class ChatRecordController {
         return WebResult.success(chatRecordGetRetList);
     }
 
-    @ApiOperation(value = "获取与联系人的历史聊天记录")
+    @Operation(summary = "获取与联系人的历史聊天记录")
     @GetMapping(value = "/records/history", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkRecordsHistory(ChatRecordGet chatRecordGet) {
         long receiverId = chatRecordGet.getReceiverId();
@@ -51,7 +51,7 @@ public class ChatRecordController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "转发聊天记录")
+    @Operation(summary = "转发聊天记录")
     @GetMapping(value = "/records/forward", produces = MediaType.APPLICATION_JSON_VALUE)
     public String talkRecordsForward() {
         return WebResult.success();

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/chat/controller/EmoticonController.java

@@ -3,7 +3,7 @@ package cn.reghao.tnb.content.app.chat.controller;
 import cn.reghao.tnb.content.app.chat.model.dto.emoticon.EmoticonInfo;
 import cn.reghao.tnb.content.app.chat.model.dto.emoticon.EmoticonList;
 import cn.reghao.jutil.web.WebResult;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -20,7 +20,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/api/chat/v1/emoticon")
 public class EmoticonController {
-    @ApiOperation(value = "获取颜文字图标列表")
+    @Operation(summary = "获取颜文字图标列表")
     @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String emoticonList() {
         EmoticonList emoticonList = new EmoticonList();

+ 0 - 54
content/content-service/src/main/java/cn/reghao/tnb/content/app/config/BeansConfig.java

@@ -1,54 +0,0 @@
-package cn.reghao.tnb.content.app.config;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.util.ReflectionUtils;
-import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
-import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
-import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
-
-import java.lang.reflect.Field;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2025-03-29 21:58:56
- */
-@Configuration
-public class BeansConfig {
-    @Bean
-    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
-        return new BeanPostProcessor() {
-
-            @Override
-            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
-                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
-                }
-                return bean;
-            }
-
-            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
-                List<T> copy = mappings.stream()
-                        .filter(mapping -> mapping.getPatternParser() == null)
-                        .collect(Collectors.toList());
-                mappings.clear();
-                mappings.addAll(copy);
-            }
-
-            @SuppressWarnings("unchecked")
-            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
-                try {
-                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
-                    field.setAccessible(true);
-                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
-                } catch (IllegalArgumentException | IllegalAccessException e) {
-                    throw new IllegalStateException(e);
-                }
-            }
-        };
-    }
-}

+ 30 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/config/SpringDocConfig.java

@@ -0,0 +1,30 @@
+package cn.reghao.tnb.content.app.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * SpringDoc API 文档相关配置
+ *
+ * @author reghao
+ * @date 2025-06-09 19:01:07
+ */
+@Configuration
+public class SpringDocConfig {
+    @Bean
+    public OpenAPI springOpenAPI() {
+        return new OpenAPI()
+                .info(new Info()
+                        .title("content api")
+                        .description("content api")
+                        .version("v0.0.1")
+                        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
+                .externalDocs(new ExternalDocumentation()
+                        .description("content api")
+                        .url("https://git.reghao.cn/reghao/tnb"));
+    }
+}

+ 0 - 93
content/content-service/src/main/java/cn/reghao/tnb/content/app/config/SwaggerConfig.java

@@ -1,93 +0,0 @@
-package cn.reghao.tnb.content.app.config;
-
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import springfox.documentation.RequestHandler;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * 配置 Swagger
- * Swagger 仅在 dev 环境生效
- *
- * @author reghao
- * @date 2019-05-14 17:01:07
- */
-@Profile({"dev"})
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-    private static final String splitter = ";";
-
-    @Bean
-    public Docket createRestApi() {
-        StringBuilder sb = new StringBuilder();
-        sb
-//                .append("cn.reghao.tnb.content.app.geo.controller").append(splitter)
-//                .append("cn.reghao.tnb.content.app.exam.controller").append(splitter)
-                .append("cn.reghao.tnb.content.app.vod.controller");
-
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .select()
-                .apis(basePackage(sb.toString()))
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    /**
-     * 声明基础包
-     *
-     * @param basePackage 基础包路径
-     * @return
-     */
-    public static Predicate<RequestHandler> basePackage(final String basePackage) {
-        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
-    }
-
-    /**
-     * 校验基础包
-     *
-     * @param basePackage 基础包路径
-     * @return
-     */
-    private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
-        return input -> {
-            for (String strPackage : basePackage.split(splitter)) {
-                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
-                if (isMatch) {
-                    return true;
-                }
-            }
-            return false;
-        };
-    }
-
-    /**
-     * 检验基础包实例
-     *
-     * @param requestHandler 请求处理类
-     * @return
-     */
-    @SuppressWarnings("deprecation")
-    private static Optional<? extends Class<?>> declaringClass(RequestHandler requestHandler) {
-        return Optional.fromNullable(requestHandler.declaringClass());
-    }
-
-    private ApiInfo apiInfo() {
-        return new ApiInfoBuilder()
-                .title("content APIs")
-                .description("")
-                .termsOfServiceUrl("")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ArticleController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.data.model.po.ArticlePost;
 import cn.reghao.tnb.content.app.data.model.vo.AnswerCard;
 import cn.reghao.tnb.content.app.data.model.vo.ArticleHeader;
 import cn.reghao.tnb.content.app.data.service.ArticlePostService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-10-13 09:24:04
  */
-@Api(tags = "文章接口")
+@Tag(name = "文章接口")
 @RestController
 @RequestMapping("/api/content/article")
 public class ArticleController {
@@ -28,7 +28,7 @@ public class ArticleController {
         this.articleService = articleService;
     }
 
-    @ApiOperation("获取文章列表")
+    @Operation(summary = "获取文章列表")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getArticles(@RequestParam("page") int page) {
         long userId = UserContext.getUser();
@@ -36,14 +36,14 @@ public class ArticleController {
         return WebResult.success(pageList);
     }
 
-    @ApiOperation("获取用户文章列表")
+    @Operation(summary = "获取用户文章列表")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserArticles(@RequestParam("userId") long userId, @RequestParam("page") int page) {
         PageList<AnswerCard> pageList = articleService.getAnswerCards(userId, page);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation("获取文章")
+    @Operation(summary = "获取文章")
     @GetMapping(value = "/{articleId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getArticleInfo(@PathVariable("articleId") String articleId) {
         ArticlePost articlePost = articleService.getArticleInfo(articleId);
@@ -53,7 +53,7 @@ public class ArticleController {
         return WebResult.success(articlePost);
     }
 
-    @ApiOperation("添加文章贴")
+    @Operation(summary = "添加文章贴")
     @PostMapping("/put")
     public String submitArticlePost(@RequestBody @Validated ArticlePublishSbt articlePublishSbt) {
         String content = articlePublishSbt.getContent();

+ 9 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ArticlePostController.java

@@ -9,8 +9,8 @@ import cn.reghao.tnb.content.app.data.model.dto.UpdateArticleContent;
 import cn.reghao.tnb.content.app.data.model.dto.UpdateArticleScope;
 import cn.reghao.tnb.content.app.data.model.po.ArticlePost;
 import cn.reghao.tnb.content.app.data.service.ArticlePostService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-02-02 11:36:06
  */
-@Api(tags = "文章贴接口")
+@Tag(name = "文章贴接口")
 @RestController
 @RequestMapping("/api/content/post/article")
 public class ArticlePostController {
@@ -30,7 +30,7 @@ public class ArticlePostController {
     }
 
     @AuthUser
-    @ApiOperation("添加文章贴")
+    @Operation(summary = "添加文章贴")
     @PostMapping("")
     public String submitArticlePost(@RequestBody @Validated ArticlePublishSbt articlePublishSbt) {
         articleService.submitArticle(articlePublishSbt);
@@ -38,7 +38,7 @@ public class ArticlePostController {
     }
 
     @AuthUser
-    @ApiOperation("修改文章可见范围")
+    @Operation(summary = "修改文章可见范围")
     @PostMapping("/update/scope")
     public String updateArticleScope(@RequestBody @Validated UpdateArticleScope updateArticleScope) {
         articleService.updateArticleScope(updateArticleScope);
@@ -46,7 +46,7 @@ public class ArticlePostController {
     }
 
     @AuthUser
-    @ApiOperation("修改文章内容")
+    @Operation(summary = "修改文章内容")
     @PostMapping("/update/content")
     public String updateArticleContent(@RequestBody @Validated UpdateArticleContent updateArticleContent) {
         articleService.updateArticleContent(updateArticleContent);
@@ -54,14 +54,14 @@ public class ArticlePostController {
     }
 
     @AuthUser
-    @ApiOperation("删除文章贴")
+    @Operation(summary = "删除文章贴")
     @DeleteMapping("/{articleId}")
     public String deleteArticlePost(@PathVariable("articleId") String articleId) {
         return WebResult.success();
     }
 
     @AuthUser
-    @ApiOperation("获取文章贴列表")
+    @Operation(summary = "获取文章贴列表")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getArticlePosts(@RequestParam("page") int page) {
         long userId = UserContext.getUser();
@@ -70,7 +70,7 @@ public class ArticlePostController {
     }
 
     @AuthUser
-    @ApiOperation("获取文章贴")
+    @Operation(summary = "获取文章贴")
     @GetMapping(value = "/{articleId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getArticleInfo(@PathVariable("articleId") String articleId) {
         ArticlePost articlePost = articleService.getArticleInfo(articleId);

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/AudioController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.content.app.data.model.vo.AudioInfo;
 import cn.reghao.tnb.content.app.data.model.vo.UserAudioCard;
 import cn.reghao.tnb.content.app.data.service.AudioService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-10-12 13:49:11
  */
-@Api(tags = "音频接口")
+@Tag(name = "音频接口")
 @RestController
 @RequestMapping("/api/content/audio")
 public class AudioController {
@@ -24,21 +24,21 @@ public class AudioController {
         this.audioService = audioService;
     }
     
-    @ApiOperation("获取音频列表")
+    @Operation(summary = "获取音频列表")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getAudios(@RequestParam("page") int page) {
         PageList<UserAudioCard> pageList = audioService.getAudios(page);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation("获取用户音频列表")
+    @Operation(summary = "获取用户音频列表")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserAudios(@RequestParam("page") int page, @RequestParam("userId") long userId) {
         PageList<UserAudioCard> pageList = audioService.getPageByUserId(userId, page);
         return WebResult.success(pageList);
     }
     
-    @ApiOperation("获取音频详细信息")
+    @Operation(summary = "获取音频详细信息")
     @GetMapping(value = "/{audioId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getAudioInfo(@PathVariable("audioId") String audioId) {
         AudioInfo audioInfo = audioService.getAudioInfo(audioId);

+ 8 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/AudioPostController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.content.app.data.model.dto.AudioPublishSbt;
 import cn.reghao.tnb.content.app.data.model.dto.AudioScopeUpdate;
 import cn.reghao.tnb.content.app.data.model.vo.UserAudioCard;
 import cn.reghao.tnb.content.app.data.service.AudioPostService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-01-29 10:12:06
  */
-@Api(tags = "音频贴接口")
+@Tag(name = "音频贴接口")
 @RestController
 @RequestMapping("/api/content/post/audio")
 public class AudioPostController {
@@ -27,7 +27,7 @@ public class AudioPostController {
     }
 
     @AuthUser
-    @ApiOperation("添加音频贴")
+    @Operation(summary = "添加音频贴")
     @PostMapping("")
     public String submitAudioPost(@RequestBody @Validated AudioPublishSbt audioPublishSbt) {
         audioPostService.submit(audioPublishSbt);
@@ -35,7 +35,7 @@ public class AudioPostController {
     }
 
     @AuthUser
-    @ApiOperation("更新音频贴可见范围")
+    @Operation(summary = "更新音频贴可见范围")
     @PostMapping("/update/scope")
     public String updateAudioScope(@RequestBody @Validated AudioScopeUpdate audioScopeUpdate) {
         audioPostService.updateAudioScope(audioScopeUpdate);
@@ -43,7 +43,7 @@ public class AudioPostController {
     }
 
     @AuthUser
-    @ApiOperation("删除音频贴")
+    @Operation(summary = "删除音频贴")
     @DeleteMapping("/{audioId}")
     public String deleteAudioPost(@PathVariable("audioId") String audioId) {
         audioPostService.deleteAudio(audioId);
@@ -51,7 +51,7 @@ public class AudioPostController {
     }
 
     @AuthUser
-    @ApiOperation("获取音频贴")
+    @Operation(summary = "获取音频贴")
     @GetMapping("/{audioId}")
     public String getAudioPost(@PathVariable("audioId") String audioId) {
         UserAudioCard userAudioCard = audioPostService.getAudioInfo(audioId);
@@ -59,7 +59,7 @@ public class AudioPostController {
     }
 
     @AuthUser
-    @ApiOperation("获取音频贴列表")
+    @Operation(summary = "获取音频贴列表")
     @GetMapping("")
     public String getAudioPosts(@RequestParam("page") int page) {
         PageList<UserAudioCard> pageList = audioPostService.getPageByUserId(page);

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ImagePostController.java

@@ -10,8 +10,8 @@ import cn.reghao.tnb.content.app.data.model.dto.AlbumImageData;
 import cn.reghao.tnb.content.app.data.model.po.ImagePost;
 import cn.reghao.tnb.content.app.data.model.vo.AlbumCard;
 import cn.reghao.tnb.content.app.data.service.ImagePostService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-10-07 09:55:50
  */
-@Api(tags = "图片稿件接口")
+@Tag(name = "图片稿件接口")
 @RestController
 @RequestMapping("/api/content/post/image")
 public class ImagePostController {
@@ -31,7 +31,7 @@ public class ImagePostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "创建图片稿件", notes = "N")
+    @Operation(summary = "创建图片稿件", description = "N")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String createImagePost(@RequestBody @Validated ImagePublishSbt imagePublishSbt) {
         Result result = imagePostService.create(imagePublishSbt);
@@ -39,7 +39,7 @@ public class ImagePostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "添加图片到图片稿件", notes = "N")
+    @Operation(summary = "添加图片到图片稿件", description = "N")
     @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addImage(@RequestBody @Validated AlbumImageData albumImageData) {
         Result result = imagePostService.add(albumImageData);
@@ -47,7 +47,7 @@ public class ImagePostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取用户发布的图片稿件列表", notes = "N")
+    @Operation(summary = "获取用户发布的图片稿件列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserImageAlbum(@RequestParam("page") int page) {
         long userId = UserContext.getUser();
@@ -56,7 +56,7 @@ public class ImagePostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取已发布图片稿件中的图片", notes = "N")
+    @Operation(summary = "获取已发布图片稿件中的图片", description = "N")
     @GetMapping(value = "/{albumId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getImageAlbum(@PathVariable("albumId") long albumId, @RequestParam("page") int page) {
         String result = imagePostService.getImageAlbum(albumId, page);

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/data/controller/ImageQueryController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.content.app.data.model.vo.AlbumCard;
 import cn.reghao.tnb.content.app.data.service.ImagePostService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.http.MediaType;
@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*;
  * @date 2023-08-19 02:33:11
  */
 @Slf4j
-@Api(tags = "图片稿件查询接口")
+@Tag(name = "图片稿件查询接口")
 @RestController
 @RequestMapping("/api/content/image")
 public class ImageQueryController {
@@ -29,7 +29,7 @@ public class ImageQueryController {
         this.imagePostService = imagePostService;
     }
 
-    @ApiOperation(value = "获取用户的图片稿件列表", notes = "N")
+    @Operation(summary = "获取用户的图片稿件列表", description = "N")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserImageAlbum(@RequestParam("userId") String userId, @RequestParam("page") int page) {
         long userId1 = accountQuery.getUserIdLong(userId);
@@ -37,7 +37,7 @@ public class ImageQueryController {
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取图片稿件中的图片", notes = "N")
+    @Operation(summary = "获取图片稿件中的图片", description = "N")
     @GetMapping(value = "/{albumId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getImageAlbum(@PathVariable("albumId") long albumId, @RequestParam("page") int page) {
         String result = imagePostService.getImageAlbum(albumId, page);

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.content.app.exam.model.query.PaperQuery;
 import cn.reghao.tnb.content.app.exam.model.vo.*;
 import cn.reghao.tnb.content.app.exam.service.ExamService;
 import cn.reghao.tnb.content.app.exam.service.PaperService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -18,7 +18,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-24 13:29:10
  */
-@Api(tags = "考试接口")
+@Tag(name = "考试接口")
 @RestController
 @RequestMapping("/api/content/exam")
 public class ExamController {
@@ -30,7 +30,7 @@ public class ExamController {
         this.paperService = paperService;
     }
 
-    @ApiOperation(value = "获取考试列表", notes = "N")
+    @Operation(summary = "获取考试列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated
     public String getExams(PaperQuery paperQuery) {
@@ -38,14 +38,14 @@ public class ExamController {
         return WebResult.success(pageList1);
     }
 
-    @ApiOperation(value = "获取考试使用的试卷", notes = "N")
+    @Operation(summary = "获取考试使用的试卷", description = "N")
     @GetMapping(value = "/start/{paperId}", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated
     public String startExam(@PathVariable("paperId") int paperId) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取试卷中的试题", notes = "N")
+    @Operation(summary = "获取试卷中的试题", description = "N")
     @GetMapping(value = "/paper/{paperId}/question", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated
     public String getExamQuestions1(@PathVariable("paperId") Integer paperId) {
@@ -53,7 +53,7 @@ public class ExamController {
         return WebResult.success(list1);
     }
 
-    @ApiOperation(value = "用户提交考试答案", notes = "N")
+    @Operation(summary = "用户提交考试答案", description = "N")
     @PostMapping(value = "/submit", produces = MediaType.APPLICATION_JSON_VALUE)
     public String submitExamPaper1(@RequestBody UserResult userResult) {
         int resultId = examService.submitExamPaper(userResult);

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamResultController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.exam.model.vo.ExamMark;
 import cn.reghao.tnb.content.app.exam.model.vo.ExamResult;
 import cn.reghao.tnb.content.app.exam.model.vo.ExamScore;
 import cn.reghao.tnb.content.app.exam.service.ExamResultService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2024-08-29 09:54:34
  */
-@Api(tags = "考试结果接口")
+@Tag(name = "考试结果接口")
 @RestController
 @RequestMapping("/api/content/exam/result")
 public class ExamResultController {
@@ -28,28 +28,28 @@ public class ExamResultController {
         this.examResultService = examResultService;
     }
 
-    @ApiOperation(value = "获取试卷结果", notes = "N")
+    @Operation(summary = "获取试卷结果", description = "N")
     @GetMapping(value = "/mark", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamMark(ExamQuery examQuery) {
         PageList<ExamMark> pageList = examResultService.getExamReviewList(examQuery);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "提交评卷结果", notes = "N")
+    @Operation(summary = "提交评卷结果", description = "N")
     @PostMapping(value = "/mark", produces = MediaType.APPLICATION_JSON_VALUE)
     public String submitExamMark(@RequestBody @Validated ExamMarkForm examMarkForm) {
         examResultService.markExamResult(examMarkForm);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取用户的考试成绩", notes = "N")
+    @Operation(summary = "获取用户的考试成绩", description = "N")
     @GetMapping(value = "/score", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamScore() {
         PageList<ExamScore> pageList = examResultService.getExamScoreList();
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取用户的考试结果", notes = "N")
+    @Operation(summary = "获取用户的考试结果", description = "N")
     @GetMapping(value = "/view/{resultId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamResult(@PathVariable("resultId") int resultId) {
         ExamResult examResult = examResultService.getExamResult(resultId);

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/ExamStatisticController.java

@@ -1,8 +1,8 @@
 package cn.reghao.tnb.content.app.exam.controller;
 
 import cn.reghao.jutil.web.WebResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,11 +15,11 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-29 09:47:56
  */
-@Api(tags = "考试数据统计接口")
+@Tag(name = "考试数据统计接口")
 @RestController
 @RequestMapping("/api/content/exam/statistic")
 public class ExamStatisticController {
-    @ApiOperation(value = "获取用户考试结果的统计数据", notes = "N")
+    @Operation(summary = "获取用户考试结果的统计数据", description = "N")
     @GetMapping(value = "/count", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamCount() {
         List<String> list = new ArrayList<>();
@@ -28,7 +28,7 @@ public class ExamStatisticController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取用户的考试通过率", notes = "N")
+    @Operation(summary = "获取用户的考试通过率", description = "N")
     @GetMapping(value = "/rate", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamPassRate() {
         List<String> list = new ArrayList<>();

+ 8 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/PaperController.java

@@ -9,8 +9,8 @@ import cn.reghao.tnb.content.app.exam.model.query.PaperQuery;
 import cn.reghao.tnb.content.app.exam.model.vo.PaperDetail;
 import cn.reghao.tnb.content.app.exam.model.vo.PaperView;
 import cn.reghao.tnb.content.app.exam.service.PaperService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -21,7 +21,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-27 17:20:34
  */
-@Api(tags = "试卷接口")
+@Tag(name = "试卷接口")
 @RestController
 @RequestMapping("/api/content/exam/paper")
 public class PaperController {
@@ -31,35 +31,35 @@ public class PaperController {
         this.paperService = paperService;
     }
 
-    @ApiOperation(value = "创建试卷", notes = "N")
+    @Operation(summary = "创建试卷", description = "N")
     @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addPaper(@RequestBody @Valid PaperAddDto paperAddDto) {
         Result result = paperService.createExamPaper(paperAddDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "删除试卷", notes = "N")
+    @Operation(summary = "删除试卷", description = "N")
     @DeleteMapping(value = "/{paperId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deletePaper(@PathVariable("paperId") Integer paperId) {
         Result result = paperService.deleteExamPaper(paperId);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "获取试卷列表", notes = "N")
+    @Operation(summary = "获取试卷列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPapers(PaperQuery paperQuery) {
         PageList<PaperView> pageList = paperService.getExamPapers(paperQuery);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取试卷详情", notes = "N")
+    @Operation(summary = "获取试卷详情", description = "N")
     @GetMapping(value = "/{paperId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPaper(@PathVariable("paperId") Integer paperId) {
         PaperDetail paperDetail = paperService.getPaperDetail(paperId);
         return WebResult.success(paperDetail);
     }
 
-    @ApiOperation(value = "获取试卷 KV 列表", notes = "N")
+    @Operation(summary = "获取试卷 KV 列表", description = "N")
     @GetMapping(value = "/kv", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPaperKeyValue() {
         List<KeyValue> list = paperService.getKeyValues();

+ 8 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/QuestionController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.exam.model.dto.QuestionAddDto;
 import cn.reghao.tnb.content.app.exam.model.query.QuestionQuery;
 import cn.reghao.tnb.content.app.exam.model.vo.*;
 import cn.reghao.tnb.content.app.exam.service.QuestionService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -20,7 +20,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-24 23:57:42
  */
-@Api(tags = "试题接口")
+@Tag(name = "试题接口")
 @RestController
 @RequestMapping("/api/content/exam/question")
 public class QuestionController {
@@ -30,35 +30,35 @@ public class QuestionController {
         this.questionService = questionService;
     }
 
-    @ApiOperation(value = "添加试题", notes = "N")
+    @Operation(summary = "添加试题", description = "N")
     @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addQuestion(@RequestBody @Valid QuestionAddDto questionAddDto) {
         Result result = questionService.addQuestion(questionAddDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "删除试题", notes = "N")
+    @Operation(summary = "删除试题", description = "N")
     @DeleteMapping(value = "/{questionId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteQuestion(@PathVariable("questionId") Integer questionId) {
         Result result = questionService.deleteQuestion(questionId);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "获取试题列表", notes = "N")
+    @Operation(summary = "获取试题列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getQuestions(QuestionQuery questionQuery) {
         PageList<QuestionView> pageList = questionService.getQuestions(questionQuery);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取试题详情", notes = "N")
+    @Operation(summary = "获取试题详情", description = "N")
     @GetMapping(value = "/{questionId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getQuestion(@PathVariable("questionId") Integer questionId) {
         QuestionDetail questionDetail = questionService.getQuestionDetail(questionId);
         return WebResult.success(questionDetail);
     }
 
-    @ApiOperation(value = "获取试题类型 KV 列表", notes = "N")
+    @Operation(summary = "获取试题类型 KV 列表", description = "N")
     @GetMapping(value = "/type", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getQuestionType() {
         List<KeyValue> list = questionService.getKeyValues();

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/exam/controller/SubjectController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.db.KeyValue;
 import cn.reghao.tnb.content.app.exam.model.vo.SubjectInfo;
 import cn.reghao.tnb.content.app.exam.service.SubjectService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,7 +19,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-08-24 23:23:28
  */
-@Api(tags = "科目接口")
+@Tag(name = "科目接口")
 @RestController
 @RequestMapping("/api/content/exam/subject")
 public class SubjectController {
@@ -29,7 +29,7 @@ public class SubjectController {
         this.subjectService = subjectService;
     }
 
-    @ApiOperation(value = "获取科目列表", notes = "N")
+    @Operation(summary = "获取科目列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getSubjects(@RequestParam(value = "pn", required = false) Integer pageNumber,
                               @RequestParam(value = "pz", required = false) Integer pageSize) {
@@ -39,7 +39,7 @@ public class SubjectController {
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取科目 KV 列表", notes = "N")
+    @Operation(summary = "获取科目 KV 列表", description = "N")
     @GetMapping(value = "/kv", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getSubjectKeyValue() {
         List<KeyValue> list = subjectService.getKeyValues();

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/controller/MapController.java

@@ -4,8 +4,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.content.app.geo.model.vo.MapMarker;
 import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
 import cn.reghao.tnb.content.app.geo.service.MapService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -16,7 +16,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-08-31 10:32:28
  */
-@Api(tags = "地图接口")
+@Tag(name = "地图接口")
 @RestController
 @RequestMapping("/api/geo/map")
 public class MapController {
@@ -26,21 +26,21 @@ public class MapController {
         this.mapService = mapService;
     }
 
-    @ApiOperation(value = "添加一个经纬度坐标", notes = "N")
+    @Operation(summary = "添加一个经纬度坐标", description = "N")
     @PostMapping(value = "/position", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addGeoPoint(@RequestBody @Validated MapPoint mapPoint) {
         mapService.addGeoPoint(mapPoint);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取坐标列表构成的路径", notes = "N")
+    @Operation(summary = "获取坐标列表构成的路径", description = "N")
     @GetMapping(value = "/trail", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getTrailPath() {
         List list = mapService.getTrailPath();
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取地图标记", notes = "N")
+    @Operation(summary = "获取地图标记", description = "N")
     @GetMapping(value = "/marks", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getTrailMarks() {
         List<MapMarker> list = mapService.getTrailMarks();

+ 9 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/controller/PhotoMapController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.content.api.dto.geo.MallReplyPhotoDto;
 import cn.reghao.tnb.content.app.geo.model.vo.MapMarker;
 import cn.reghao.tnb.content.app.geo.model.vo.MarkerInfo;
 import cn.reghao.tnb.content.app.geo.service.PhotoMapService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -19,7 +19,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-08-31 10:32:28
  */
-@Api(tags = "照片地图接口")
+@Tag(name = "照片地图接口")
 @RestController
 @RequestMapping("/api/geo/photo")
 public class PhotoMapController {
@@ -29,42 +29,42 @@ public class PhotoMapController {
         this.photoMapService = photoMapService;
     }
 
-    @ApiOperation(value = "检查淘宝商品评论是否存在", notes = "N")
+    @Operation(summary = "检查淘宝商品评论是否存在", description = "N")
     @GetMapping(value = "/reply/{replyId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String checkReply(@PathVariable("replyId") String replyId) {
         boolean exist = photoMapService.checkReplyId(replyId);
         return WebResult.success(exist);
     }
 
-    @ApiOperation(value = "添加淘宝商品评论", notes = "N")
+    @Operation(summary = "添加淘宝商品评论", description = "N")
     @PostMapping(value = "/reply", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addReply(@RequestBody @Validated MallReplyDto mallReplyDto) {
         photoMapService.addTmallReply(mallReplyDto);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "添加淘宝商品评论中的照片", notes = "N")
+    @Operation(summary = "添加淘宝商品评论中的照片", description = "N")
     @PostMapping(value = "/photo", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addPhoto(@RequestBody List<MallReplyPhotoDto> list) {
         photoMapService.addCameraPhotos(list);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取照片分类", notes = "N")
+    @Operation(summary = "获取照片分类", description = "N")
     @GetMapping(value = "/item", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getGeoItems() {
         List<SelectOption> selectOptions = photoMapService.getGeoItems();
         return WebResult.success(selectOptions);
     }
 
-    @ApiOperation(value = "获取照片地图中标记", notes = "N")
+    @Operation(summary = "获取照片地图中标记", description = "N")
     @GetMapping(value = "/marks", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPhotoMarks(@RequestParam("type") Integer type) {
         List<MapMarker> list = photoMapService.getPhotoMarks(type);
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取地图中标记点的详情", notes = "N")
+    @Operation(summary = "获取地图中标记点的详情", description = "N")
     @GetMapping(value = "/mark/info", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getMarkerInfo(@RequestParam("id") int id) {
         MarkerInfo markerInfo = photoMapService.getMarkerInfo(id);

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/CartController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.mall.model.dto.BuyProductDto;
 import cn.reghao.tnb.content.app.mall.model.vo.CartCard;
 import cn.reghao.tnb.content.app.mall.service.BuyService;
 import cn.reghao.tnb.content.app.mall.service.CartService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -20,7 +20,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-04-16 10:54:44
  */
-@Api(tags = "购物车接口")
+@Tag(name = "购物车接口")
 @RestController
 @RequestMapping("/api/mall/cart")
 public class CartController {
@@ -32,7 +32,7 @@ public class CartController {
         this.buyService = buyService;
     }
 
-    @ApiOperation(value = "将商品加入购物车", notes = "N")
+    @Operation(summary = "将商品加入购物车", description = "N")
     @AuthUser
     @PostMapping("")
     public String addCart(@RequestBody @Validated CartDto cartDto) {
@@ -43,7 +43,7 @@ public class CartController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "从购物车中删除商品", notes = "N")
+    @Operation(summary = "从购物车中删除商品", description = "N")
     @AuthUser
     @DeleteMapping("/{itemId}")
     public String deleteItem(@PathVariable("itemId") Long itemId) {
@@ -52,7 +52,7 @@ public class CartController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取购物车中的商品", notes = "N")
+    @Operation(summary = "获取购物车中的商品", description = "N")
     @AuthUser
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getCartItems() {
@@ -61,7 +61,7 @@ public class CartController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "购买购物车商品", notes = "N")
+    @Operation(summary = "购买购物车商品", description = "N")
     @PostMapping("/buy")
     public String buyCartItems(@RequestBody @Validated BuyProductDto buyProductDto) {
         long orderId = buyService.buyCartItems(buyProductDto);

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/DeliveryController.java

@@ -5,8 +5,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.mall.model.po.Delivery;
 import cn.reghao.tnb.content.app.mall.service.DeliveryService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -16,7 +16,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-04-26 11:45:14
  */
-@Api(tags = "收货地址接口")
+@Tag(name = "收货地址接口")
 @RestController
 @RequestMapping("/api/mall/delivery")
 public class DeliveryController {
@@ -26,21 +26,21 @@ public class DeliveryController {
         this.deliveryService = deliveryService;
     }
 
-    @ApiOperation(value = "添加收获地址", notes = "N")
+    @Operation(summary = "添加收获地址", description = "N")
     @AuthUser
     @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addDeliveryAddress() {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "删除收获地址", notes = "N")
+    @Operation(summary = "删除收获地址", description = "N")
     @AuthUser
     @DeleteMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteDeliveryAddress() {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取用户的收获地址列表", notes = "N")
+    @Operation(summary = "获取用户的收获地址列表", description = "N")
     @AuthUser
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getDeliveryAddress() {

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/LogisticsController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.mall.model.po.Logistics;
 import cn.reghao.tnb.content.app.mall.model.po.LogisticsProgress;
 import cn.reghao.tnb.content.app.mall.service.LogisticsService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-09-19 09:06:30
  */
-@Api(tags = "订单物流接口")
+@Tag(name = "订单物流接口")
 @RestController
 @RequestMapping("/api/mall/logistics")
 public class LogisticsController {
@@ -28,7 +28,7 @@ public class LogisticsController {
         this.logisticsService = logisticsService;
     }
 
-    @ApiOperation(value = "添加订单物流", notes = "N")
+    @Operation(summary = "添加订单物流", description = "N")
     @AuthUser
     @PostMapping(value = "/order", produces = MediaType.APPLICATION_JSON_VALUE)
     public String putOrderLogistics(@RequestBody @Validated Logistics logistics) {
@@ -36,7 +36,7 @@ public class LogisticsController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "更新订单物流进度", notes = "N")
+    @Operation(summary = "更新订单物流进度", description = "N")
     @AuthUser
     @PostMapping(value = "/progress", produces = MediaType.APPLICATION_JSON_VALUE)
     public String putOrderLogisticsProgress(@RequestBody @Validated LogisticsProgress logisticsProgress) {
@@ -44,7 +44,7 @@ public class LogisticsController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取订单物流进度", notes = "N")
+    @Operation(summary = "获取订单物流进度", description = "N")
     @AuthUser
     @GetMapping(value = "/order/{orderId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getOrderLogistics(@PathVariable("orderId") Long orderId) {

+ 8 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/mall/controller/ProductController.java

@@ -9,8 +9,8 @@ import cn.reghao.tnb.content.app.mall.model.dto.ProductAddDto;
 import cn.reghao.tnb.content.app.mall.model.po.Product;
 import cn.reghao.tnb.content.app.mall.service.BuyService;
 import cn.reghao.tnb.content.app.mall.service.ProductService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2024-04-16 10:53:54
  */
-@Api(tags = "商品接口")
+@Tag(name = "商品接口")
 @RestController
 @RequestMapping("/api/mall/product")
 public class ProductController {
@@ -31,35 +31,35 @@ public class ProductController {
         this.buyService = buyService;
     }
 
-    @ApiOperation(value = "添加淘宝商品", notes = "N")
+    @Operation(summary = "添加淘宝商品", description = "N")
     @PostMapping("/taobao")
     public String addCam(@RequestBody @Validated TaobaoItem taobaoItem) {
         productService.add(taobaoItem);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "发布商品", notes = "N")
+    @Operation(summary = "发布商品", description = "N")
     @PostMapping("")
     public String addProduct(@RequestBody @Validated ProductAddDto productAddDto) throws Exception {
         Result result = productService.addProduct(productAddDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "获取商品列表", notes = "N")
+    @Operation(summary = "获取商品列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserCams(@RequestParam("page") int page) {
         PageList<Product> pageList = productService.getPage(page);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取商品详情", notes = "N")
+    @Operation(summary = "获取商品详情", description = "N")
     @GetMapping(value = "/{itemId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getProduct(@PathVariable("itemId") Long itemId) {
         Product product = productService.getProduct(itemId);
         return WebResult.success(product);
     }
 
-    @ApiOperation(value = "购买商品", notes = "N")
+    @Operation(summary = "购买商品", description = "N")
     @PostMapping("/buy")
     public String buyProduct(@RequestBody @Validated BuyProductDto buyProductDto) {
         long orderId = buyService.buyProduct(buyProductDto);

+ 4 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/mobile/controller/AndroidController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.mobile.model.VideoDetailsResult;
 import cn.reghao.tnb.content.app.mobile.model.VideoRegionResult;
 import cn.reghao.tnb.content.app.mobile.model.play.HDVideoInfo;
 import cn.reghao.tnb.content.app.mobile.model.search.*;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -19,7 +19,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-09-02 01:03:06
  */
-@Api(tags = "移动端内容接口")
+@Tag(name = "移动端内容接口")
 @RestController
 @RequestMapping("/api/content/m")
 public class AndroidController {
@@ -68,7 +68,7 @@ public class AndroidController {
         return JsonConverter.objectToJson(videoBeanResult);
     }
 
-    @ApiOperation("用户内容数据")
+    @Operation(summary = "用户内容数据")
     @GetMapping(value = "/recommend", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserContentData(@RequestParam("platform") String platform,
                                      @RequestParam("device") String device,

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/AlbumPostController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.content.app.vod.model.dto.*;
 import cn.reghao.tnb.content.app.vod.model.query.AlbumQuery;
 import cn.reghao.tnb.content.app.vod.model.vo.AlbumItem;
 import cn.reghao.tnb.content.app.vod.service.AlbumService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2024-10-31 14:02:40
  */
-@Api(tags = "稿件合集接口")
+@Tag(name = "稿件合集接口")
 @RestController
 @RequestMapping("/api/content/post/album")
 public class AlbumPostController {
@@ -28,7 +28,7 @@ public class AlbumPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "创建稿件合集", notes = "N")
+    @Operation(summary = "创建稿件合集", description = "N")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String createAlbum(@RequestBody @Validated AlbumCreateDto albumCreateDto){
         albumService.createAlbum(albumCreateDto);
@@ -36,7 +36,7 @@ public class AlbumPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "添加(删除)到稿件合集", notes = "N")
+    @Operation(summary = "添加(删除)到稿件合集", description = "N")
     @PostMapping("/action")
     public String doAlbumAction(@RequestBody @Validated AlbumActionDto albumActionDto) {
         Result result = albumService.doAlbumAction(albumActionDto);
@@ -44,14 +44,14 @@ public class AlbumPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取用户稿件合集的 select-list", notes = "N")
+    @Operation(summary = "获取用户稿件合集的 select-list", description = "N")
     @GetMapping(value = "/kv", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getSelectOptions() {
         return WebResult.success(albumService.getSelectOptions());
     }
 
     @AuthUser
-    @ApiOperation(value = "获取稿件合集中的内容", notes = "N")
+    @Operation(summary = "获取稿件合集中的内容", description = "N")
     @GetMapping(value = "/item", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getAlbumItems(@RequestParam(value = "albumId", required = false) Long albumId,
                                 @RequestParam("pn") Integer pn) {

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/AlbumQueryController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.app.vod.model.po.PostAlbum;
 import cn.reghao.tnb.content.app.vod.model.vo.AlbumInfo;
 import cn.reghao.tnb.content.app.vod.service.AlbumService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-11-06 16:13:01
  */
-@Api(tags = "稿件合集接口")
+@Tag(name = "稿件合集接口")
 @RestController
 @RequestMapping("/api/content/album")
 public class AlbumQueryController {
@@ -29,21 +29,21 @@ public class AlbumQueryController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取用户稿件合集列表", notes = "N")
+    @Operation(summary = "获取用户稿件合集列表", description = "N")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserAlbums(@RequestParam("userId") long userId, @Param("pn") int pn) {
         PageList<AlbumInfo> pageList = albumService.getUserAlbums(userId, pn);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取播放列表", notes = "N")
+    @Operation(summary = "获取播放列表", description = "N")
     @GetMapping(value = "/playlist", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPlaylist(@RequestParam("pn") int pn) {
         PageList<PostAlbum> pageList = albumService.getPlaylist(pn);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取播放列表内容", notes = "N")
+    @Operation(summary = "获取播放列表内容", description = "N")
     @GetMapping(value = "/playlist/{albumId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPlaylistItems(@PathVariable("albumId") long albumId) {
         String webResult = albumService.getPlaylistItems(albumId);

+ 4 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CategoryController.java

@@ -5,8 +5,8 @@ import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.api.dto.VideoRegion;
 import cn.reghao.tnb.content.app.vod.service.CategoryService;
 import cn.reghao.tnb.user.api.iface.UserService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -19,7 +19,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-11-20 21:38:01
  */
-@Api(tags = "视频分区接口")
+@Tag(name = "视频分区接口")
 @RestController
 @RequestMapping("/api/content/video")
 public class CategoryController {
@@ -31,7 +31,7 @@ public class CategoryController {
         this.categoryService = categoryService;
     }
 
-    @ApiOperation(value = "获取视频分区", notes = "N")
+    @Operation(summary = "获取视频分区", description = "N")
     @GetMapping(value = "/categories", produces = MediaType.APPLICATION_JSON_VALUE)
     public String videoCategories() {
         long loginUser = UserContext.getUser();

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CommentController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.api.dto.comment.CommentSbtDto;
 import cn.reghao.tnb.content.api.dto.comment.UserReply;
 import cn.reghao.tnb.content.app.vod.service.CommentService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*;
  * @date 2022-03-06 21:25:44
  */
 @Slf4j
-@Api(tags = "评论接口")
+@Tag(name = "评论接口")
 @RestController
 @RequestMapping("/api/comment")
 public class CommentController {
@@ -28,21 +28,21 @@ public class CommentController {
     }
 
     @AuthUser
-    @ApiOperation(value = "发送视频评论", notes = "N")
+    @Operation(summary = "发送视频评论", description = "N")
     @PostMapping("/video")
     public String submitComment(@RequestBody CommentSbtDto commentSbtDto) {
         commentService.saveComment(commentSbtDto);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取视频评论", notes = "N")
+    @Operation(summary = "获取视频评论", description = "N")
     @GetMapping(value = "/video", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserComment(@RequestParam("videoId") String videoId, @RequestParam("pageNumber") int pageNumber) {
         PageList<UserReply> pageList = commentService.getUserComment(videoId, pageNumber);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取评论的子评论", notes = "N")
+    @Operation(summary = "获取评论的子评论", description = "N")
     @GetMapping(value = "/video/child", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getChildComment(@RequestParam("commentId") long commentId, @RequestParam("pageNumber") int pageNumber) {
         PageList<UserReply> pageList = commentService.getChildComment(commentId, pageNumber);

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/ContentController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.content.api.iface.AdminSiteService;
 import cn.reghao.tnb.content.app.vod.model.vo.UserContentData;
 import cn.reghao.tnb.content.app.vod.service.ContentService;
 import cn.reghao.tnb.content.app.vod.service.LogService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
  * @date 2023-08-20 00:51:11
  */
 @Slf4j
-@Api(tags = "内容接口")
+@Tag(name = "内容接口")
 @RestController
 @RequestMapping("/api/content")
 public class ContentController {
@@ -33,14 +33,14 @@ public class ContentController {
         this.contentService = contentService;
     }
 
-    @ApiOperation(value = "获取站点公告", notes = "N")
+    @Operation(summary = "获取站点公告", description = "N")
     @GetMapping("/site/notice")
     public String getSiteNotice() {
         String notice = siteService.getSiteNotice();
         return WebResult.success(notice);
     }
 
-    @ApiOperation(value = "获取用户内容数据", notes = "N")
+    @Operation(summary = "获取用户内容数据", description = "N")
     @GetMapping(value = "/userdata", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserContentData(@RequestParam("userId") String userId) {
         long userId1 = accountQuery.getUserIdLong(userId);

+ 9 - 9
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/CrawledDataController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.api.dto.spider.CrawledVideo;
 import cn.reghao.tnb.content.app.vod.service.CrawledDataService;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.app.vod.service.CommentService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -20,7 +20,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-11-25 14:50:15
  */
-@Api(tags = "爬取数据提交接口")
+@Tag(name = "爬取数据提交接口")
 @RestController
 @RequestMapping("/api/content/post/video")
 public class CrawledDataController {
@@ -32,35 +32,35 @@ public class CrawledDataController {
         this.commentService = commentService;
     }
 
-    @ApiOperation(value = "添加 bili 视频稿件", notes = "N")
+    @Operation(summary = "添加 bili 视频稿件", description = "N")
     @PostMapping("/bili")
     public String addBiliVideoPost(@RequestBody @Validated CrawledVideo crawledVideo) {
         crawledDataService.publishVideo(crawledVideo);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "添加 bili 视频评论", notes = "N")
+    @Operation(summary = "添加 bili 视频评论", description = "N")
     @PostMapping("/bili/comment")
     public String addBiliVideoComment(@RequestBody CommentSbtDto commentSbtDto) {
         commentService.saveBiliComment(commentSbtDto);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "添加 bili 视频数据", notes = "N")
+    @Operation(summary = "添加 bili 视频数据", description = "N")
     @PostMapping("/bili/statistic")
     public String addBiliVideoStatistic(@RequestBody @Validated CrawledVideo crawledVideo) {
         crawledDataService.updateVideoStatistic(crawledVideo);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "添加 bili 视频资源", notes = "N")
+    @Operation(summary = "添加 bili 视频资源", description = "N")
     @PostMapping("/bili/update")
     public String updateVideoFile(@RequestBody @Validated VideoFileUpdate videoFileUpdate) {
         crawledDataService.updateVideoFile(videoFileUpdate);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "查询 bili 视频稿件", notes = "N")
+    @Operation(summary = "查询 bili 视频稿件", description = "N")
     @GetMapping("/bili")
     public String getBiliVideoPost(@RequestParam("videoId") String videoId) {
         VideoPost videoPost = crawledDataService.videoExist(videoId);
@@ -71,7 +71,7 @@ public class CrawledDataController {
         return WebResult.success(false);
     }
 
-    @ApiOperation(value = "获取 bili 视频分区", notes = "N")
+    @Operation(summary = "获取 bili 视频分区", description = "N")
     @GetMapping(value = "/categories/bili", produces = MediaType.APPLICATION_JSON_VALUE)
     public String videoCategories() {
         List<BiliRegion> list = crawledDataService.getCategories();

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/DanmakuController.java

@@ -4,8 +4,8 @@ import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.content.api.dto.DanmakuSbtDto;
 import cn.reghao.tnb.content.app.vod.service.DanmakuService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,7 +15,7 @@ import java.util.List;
  * @author reghao
  * @date 2021-12-06 19:12:13
  */
-@Api(tags = "弹幕接口")
+@Tag(name = "弹幕接口")
 @RestController
 @RequestMapping("/api/comment/danmaku")
 public class DanmakuController {
@@ -25,14 +25,14 @@ public class DanmakuController {
         this.danmakuService = danmakuService;
     }
 
-    @ApiOperation(value = "发送视频弹幕", notes = "N")
+    @Operation(summary = "发送视频弹幕", description = "N")
     @PostMapping("/v3")
     public String submitDanmaku(@RequestBody DanmakuSbtDto danmakuSbtDto) {
         Result result = danmakuService.submit(danmakuSbtDto);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "获取视频弹幕", notes = "N")
+    @Operation(summary = "获取视频弹幕", description = "N")
     @GetMapping(value = "/v3", produces = MediaType.APPLICATION_JSON_VALUE)
     public String danmakuList(@RequestParam("id") String videoId, @RequestParam("max") int max) {
         List<List<Object>> lists = danmakuService.getByVideoIdAndSize(videoId, 1000);

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/RecommendController.java

@@ -8,8 +8,8 @@ import cn.reghao.tnb.content.app.vod.model.dto.UserRcmd;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoRcmd;
 import cn.reghao.tnb.content.app.vod.service.RecommendService;
 import cn.reghao.tnb.user.api.iface.UserService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
@@ -22,7 +22,7 @@ import java.util.List;
  * @author reghao
  * @date 2025-03-31 14:44:11
  */
-@Api(tags = "推荐内容接口")
+@Tag(name = "推荐内容接口")
 @RestController
 @RequestMapping("/api/content/rcmd")
 public class RecommendController {
@@ -35,7 +35,7 @@ public class RecommendController {
         this.recommendService = recommendService;
     }
 
-    @ApiOperation(value = "获取推荐视频", notes = "N")
+    @Operation(summary = "获取推荐视频", description = "N")
     @GetMapping(value = "/video", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getRecommendVideos(@RequestParam(value = "nextId", required = false) String nextId) {
         if (Integer.parseInt(nextId) > 100) {
@@ -48,7 +48,7 @@ public class RecommendController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取用户推荐模式", notes = "N")
+    @Operation(summary = "获取用户推荐模式", description = "N")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserRcmd() {
         long userId1 = UserContext.getUserId();
@@ -57,7 +57,7 @@ public class RecommendController {
     }
 
     @AuthUser
-    @ApiOperation(value = "设置用户推荐模式", notes = "N")
+    @Operation(summary = "设置用户推荐模式", description = "N")
     @PostMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String setUserRcmd(@RequestBody @Validated UserRcmd userRcmd) {
         long userId1 = UserContext.getUserId();
@@ -71,7 +71,7 @@ public class RecommendController {
     }
 
     @AuthUser
-    @ApiOperation(value = "设置用户不喜欢的视频", notes = "N")
+    @Operation(summary = "设置用户不喜欢的视频", description = "N")
     @PostMapping(value = "/dislike/{videoId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String dislikeVideo(@PathVariable("videoId") String videoId) {
         long userId1 = UserContext.getUserId();

+ 6 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/SearchController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.content.app.vod.model.vo.HotSearch;
 import cn.reghao.tnb.content.app.vod.model.vo.SuggestKeyword;
 import cn.reghao.tnb.content.api.dto.VideoCard;
 import cn.reghao.tnb.content.app.vod.service.SearchService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,7 +20,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-08-26 21:27:07
  */
-@Api(tags = "搜索接口")
+@Tag(name = "搜索接口")
 @RestController
 @RequestMapping("/api/search")
 public class SearchController {
@@ -30,14 +30,14 @@ public class SearchController {
         this.searchService = searchService;
     }
 
-    @ApiOperation(value = "获取推荐的搜索关键词", notes = "N")
+    @Operation(summary = "获取推荐的搜索关键词", description = "N")
     @GetMapping(value = "/suggest", produces = MediaType.APPLICATION_JSON_VALUE)
     public String keywordSuggest(@RequestParam("keyword") String keyword) {
         List<SuggestKeyword> list = searchService.suggestKeyword(keyword);
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "查询关键词", notes = "N")
+    @Operation(summary = "查询关键词", description = "N")
     @GetMapping(value = "/query", produces = MediaType.APPLICATION_JSON_VALUE)
     public String similarVideoPostList(@RequestParam("keyword") String keyword,
                                        @RequestParam("pageNumber") int pageNumber,
@@ -46,7 +46,7 @@ public class SearchController {
         return WebResult.success(pageScroll);
     }
 
-    @ApiOperation(value = "获取热门搜索关键词", notes = "N")
+    @Operation(summary = "获取热门搜索关键词", description = "N")
     @GetMapping(value = "/hot", produces = MediaType.APPLICATION_JSON_VALUE)
     public String hotSearch() {
         List<HotSearch> list = searchService.getHotSearch();

+ 7 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.app.vod.model.dto.VideoErrorReport;
 import cn.reghao.tnb.content.app.vod.model.vo.DownloadUrl;
 import cn.reghao.tnb.content.app.vod.service.VideoService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2022-02-08 15:26:14
  */
-@Api(tags = "视频数据接口")
+@Tag(name = "视频数据接口")
 @RestController
 @RequestMapping("/api/content/video")
 public class VideoController {
@@ -25,14 +25,14 @@ public class VideoController {
         this.videoService = videoService;
     }
 
-    @ApiOperation(value = "点赞视频", notes = "N")
+    @Operation(summary = "点赞视频", description = "N")
     @PostMapping("/thumb/{videoId}")
     public String thumbUpVideo(@PathVariable("videoId") String videoId) {
         videoService.thumbVideo(videoId);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "分享视频", notes = "N")
+    @Operation(summary = "分享视频", description = "N")
     @PostMapping("/share/{videoId}")
     public String shareVideo(@PathVariable("videoId") String videoId) {
         String shortUrl = videoService.getShareLink(videoId);
@@ -40,7 +40,7 @@ public class VideoController {
     }
 
     @AuthUser
-    @ApiOperation(value = "下载视频", notes = "N")
+    @Operation(summary = "下载视频", description = "N")
     @GetMapping("/download/{videoId}")
     public String getDownloadUrl(@PathVariable("videoId") String videoId) {
         DownloadUrl downloadUrl = videoService.downloadVideo(videoId);
@@ -51,7 +51,7 @@ public class VideoController {
         }
     }
 
-    @ApiOperation(value = "视频报错", notes = "N")
+    @Operation(summary = "视频报错", description = "N")
     @PostMapping("/report")
     public String errorReport(@RequestBody @Validated VideoErrorReport videoErrorReport) {
         Result result = videoService.errorReport(videoErrorReport);

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoPlayController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.common.db.PageScroll;
 import cn.reghao.tnb.content.api.dto.VideoUrls;
 import cn.reghao.tnb.content.api.dto.VideoRecordCard;
 import cn.reghao.tnb.content.app.vod.service.VideoPlayService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
  * @date 2021-12-30 10:12:13
  */
 @Slf4j
-@Api(tags = "视频播放接口")
+@Tag(name = "视频播放接口")
 @RestController
 @RequestMapping("/api/content/video")
 public class VideoPlayController {
@@ -28,7 +28,7 @@ public class VideoPlayController {
         this.videoPlayService = videoPlayService;
     }
 
-    @ApiOperation(value = "获取视频播放的 URL", notes = "N")
+    @Operation(summary = "获取视频播放的 URL", description = "N")
     @GetMapping(value = "/url/{videoId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String videoUrl1(@PathVariable("videoId") String videoId) {
         VideoUrls videoUrls = videoPlayService.getVideoPlayData(videoId);
@@ -36,7 +36,7 @@ public class VideoPlayController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取某个用户的视频播放记录", notes = "N")
+    @Operation(summary = "获取某个用户的视频播放记录", description = "N")
     @GetMapping(value = "/visit", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVisitedVideo(@RequestParam("nextId") long nextId) {
         long userId = UserContext.getUser();

+ 13 - 13
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoPostController.java

@@ -12,8 +12,8 @@ import cn.reghao.tnb.content.api.dto.UserVideoPost;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
 import cn.reghao.tnb.content.app.vod.service.VideoPostService;
 import cn.reghao.oss.sdk.model.dto.media.VideoInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -24,7 +24,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-10-08 15:34:48
  */
-@Api(tags = "视频稿件接口")
+@Tag(name = "视频稿件接口")
 @RestController
 @RequestMapping("/api/content/post/video")
 public class VideoPostController {
@@ -37,7 +37,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "发布视频文件", notes = "N")
+    @Operation(summary = "发布视频文件", description = "N")
     @PostMapping("/file")
     public String addVideoFile(@RequestBody @Validated VideoFilePublish videoFilePublish) {
         String videoId = videoPostService.publishVideoFile(videoFilePublish);
@@ -45,7 +45,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "发布视频稿件", notes = "N")
+    @Operation(summary = "发布视频稿件", description = "N")
     @PostMapping("")
     public String addVideoPost(@RequestBody @Validated VideoPublishSbt videoPublishSbt) {
         Result result = videoPostService.publishVideo(videoPublishSbt);
@@ -53,7 +53,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "修改视频可见范围", notes = "N")
+    @Operation(summary = "修改视频可见范围", description = "N")
     @PostMapping("/update/scope")
     public String updateVideoScope(@RequestBody @Validated VideoScopeUpdate videoScopeUpdate) {
         videoPostService.updateVideoScope(videoScopeUpdate);
@@ -61,7 +61,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "修改视频稿件信息", notes = "N")
+    @Operation(summary = "修改视频稿件信息", description = "N")
     @PostMapping("/update/info")
     public String updateVideoPost(@RequestBody @Validated VideoInfoUpdate videoInfoUpdate) {
         videoPostService.updateVideoInfo(videoInfoUpdate);
@@ -69,7 +69,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "修改视频稿件封面", notes = "N")
+    @Operation(summary = "修改视频稿件封面", description = "N")
     @PostMapping("/update/cover")
     public String updateVideoCover(@RequestBody @Validated VideoCoverUpdate videoCoverUpdate) {
         videoPostService.updateVideoCover(videoCoverUpdate);
@@ -77,7 +77,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "修改视频稿件文件", notes = "N")
+    @Operation(summary = "修改视频稿件文件", description = "N")
     @PostMapping("/update/file")
     public String updateVideoFile(@RequestBody @Validated VideoFileUpdate videoFileUpdate) {
         videoPostService.updateVideoFile(videoFileUpdate);
@@ -85,21 +85,21 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "删除视频稿件", notes = "N")
+    @Operation(summary = "删除视频稿件", description = "N")
     @DeleteMapping("/{videoId}")
     public String deleteVideoPost(@PathVariable("videoId") String videoId) {
         videoPostService.deleteVideo(videoId);
         return WebResult.success();
     }
     
-    @ApiOperation(value = "获取视频稿件列表", notes = "N")
+    @Operation(summary = "获取视频稿件列表", description = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoPosts(@RequestParam("page") int page) {
         PageList<UserVideoPost> pageList = videoPostQuery.getUserVideoPost(page);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取视频稿件详情", notes = "N")
+    @Operation(summary = "获取视频稿件详情", description = "N")
     @GetMapping(value = "/{videoId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoPost(@PathVariable("videoId") String videoId) {
         UserVideoPost userVideoPost = videoPostQuery.getUserVideoDetail(videoId);
@@ -107,7 +107,7 @@ public class VideoPostController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取视频稿件的文件资源", notes = "N")
+    @Operation(summary = "获取视频稿件的文件资源", description = "N")
     @GetMapping("/resource/{videoId}")
     public String getVideoResource(@PathVariable("videoId") String videoId) {
         List<VideoInfo> list = videoPostQuery.getVideoResource(videoId);

+ 12 - 12
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/VideoQueryController.java

@@ -13,8 +13,8 @@ import cn.reghao.tnb.content.app.vod.model.vo.VideoDetail;
 import cn.reghao.tnb.content.app.vod.service.RecommendService;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
 import cn.reghao.tnb.content.app.vod.service.VideoQueryService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.http.MediaType;
@@ -28,7 +28,7 @@ import java.util.List;
  * @date 2023-01-30 13:51:11
  */
 @Slf4j
-@Api(tags = "视频查询接口")
+@Tag(name = "视频查询接口")
 @RestController
 @RequestMapping("/api/content/video")
 public class VideoQueryController {
@@ -46,7 +46,7 @@ public class VideoQueryController {
     }
 
     @TimeConsumed
-    @ApiOperation(value = "获取分区视频", notes = "N")
+    @Operation(summary = "获取分区视频", description = "N")
     @GetMapping(value = "/category", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getCategoryVideos(@RequestParam("categoryId") int categoryId, @RequestParam("page") int page) {
         PageList<VideoCard> pageList = videoPostQuery.getCategoryVideos(categoryId, page);
@@ -54,14 +54,14 @@ public class VideoQueryController {
     }
 
     @TimeConsumed
-    @ApiOperation(value = "获取分区短视频", notes = "N")
+    @Operation(summary = "获取分区短视频", description = "N")
     @GetMapping(value = "/short", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getCategoryShortVideos() {
         VideoDetail videoDetail = videoPostQuery.getShortVideo();
         return WebResult.success(videoDetail);
     }
 
-    @ApiOperation(value = "获取某个用户发布的视频", notes = "N")
+    @Operation(summary = "获取某个用户发布的视频", description = "N")
     @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserVideos(@RequestParam("userId") String userId, @RequestParam("page") int page) {
         long userId1 = accountQuery.getUserIdLong(userId);
@@ -69,28 +69,28 @@ public class VideoQueryController {
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取某个标签下的视频", notes = "N")
+    @Operation(summary = "获取某个标签下的视频", description = "N")
     @GetMapping(value = "/tag", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getTagVideos(@RequestParam("tag") String tag, @RequestParam("page") int page) {
         PageList<VideoCard> pageList = videoPostQuery.getTagVideos(tag, page);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取视频详情", notes = "N")
+    @Operation(summary = "获取视频详情", description = "N")
     @GetMapping(value = "/detail/{videoId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoPost(@PathVariable("videoId") String videoId) {
         String jsonResult = videoPostQuery.getVideoPostData(videoId);
         return jsonResult;
     }
 
-    @ApiOperation(value = "获取和某个视频类似的视频", notes = "N")
+    @Operation(summary = "获取和某个视频类似的视频", description = "N")
     @GetMapping(value = "/similar", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getSimilarVideos(@RequestParam("videoId") String videoId) {
         String jsonResult = videoQueryService.getSimilarVideos(videoId);
         return jsonResult;
     }
 
-    @ApiOperation(value = "获取热门视频", notes = "N")
+    @Operation(summary = "获取热门视频", description = "N")
     @GetMapping(value = "/hot", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getHotList() {
         List<BannerVideoVO> list = videoQueryService.getBannerVideos();
@@ -99,7 +99,7 @@ public class VideoQueryController {
 
     @TimeConsumed
     @AuthUser
-    @ApiOperation(value = "获取用户的视频时间线", notes = "N")
+    @Operation(summary = "获取用户的视频时间线", description = "N")
     @GetMapping(value = "/timeline", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoTimeline(@RequestParam("nextId") String nextId) {
         long userId = UserContext.getUser();
@@ -107,7 +107,7 @@ public class VideoQueryController {
         return WebResult.success(pageScroll);
     }
 
-    @ApiOperation(value = "获取推荐视频", notes = "N")
+    @Operation(summary = "获取推荐视频", description = "N")
     @GetMapping(value = "/recommend", produces = MediaType.APPLICATION_JSON_VALUE)
     @Deprecated
     public String getRecommendVideos(@RequestParam(value = "nextId", required = false) String nextId) {

+ 5 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/controller/WatchAnalysisController.java

@@ -3,8 +3,8 @@ package cn.reghao.tnb.content.app.vod.controller;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.app.vod.service.WatchAnalysisService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -14,7 +14,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-08-27 19:12:45
  */
-@Api(tags = "用户观看视频分析接口")
+@Tag(name = "用户观看视频分析接口")
 @RestController
 @RequestMapping("/api/content/video/analysis")
 public class WatchAnalysisController {
@@ -25,7 +25,7 @@ public class WatchAnalysisController {
     }
 
     @AuthUser
-    @ApiOperation(value = "用户最近一周观看视频时长统计", notes = "N")
+    @Operation(summary = "用户最近一周观看视频时长统计", description = "N")
     @GetMapping(value = "/watch", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamCount() {
         List<String> list = watchAnalysisService.getLineChartData();
@@ -33,7 +33,7 @@ public class WatchAnalysisController {
     }
 
     @AuthUser
-    @ApiOperation(value = "用户最近一周观看视频分区统计", notes = "N")
+    @Operation(summary = "用户最近一周观看视频分区统计", description = "N")
     @GetMapping(value = "/watch/region", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getExamPassRate() {
         List<String> list = watchAnalysisService.getPieChartData();

+ 3 - 3
file/file-service/pom.xml

@@ -132,9 +132,9 @@
         </dependency>
 
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.7.0</version>
         </dependency>
     </dependencies>
 

+ 30 - 0
file/file-service/src/main/java/cn/reghao/tnb/file/app/config/SpringDocConfig.java

@@ -0,0 +1,30 @@
+package cn.reghao.tnb.file.app.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * SpringDoc API 文档相关配置
+ *
+ * @author reghao
+ * @date 2025-06-09 19:01:07
+ */
+@Configuration
+public class SpringDocConfig {
+    @Bean
+    public OpenAPI springOpenAPI() {
+        return new OpenAPI()
+                .info(new Info()
+                        .title("file api")
+                        .description("file api")
+                        .version("v0.0.1")
+                        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
+                .externalDocs(new ExternalDocumentation()
+                        .description("file api")
+                        .url("https://git.reghao.cn/reghao/tnb"));
+    }
+}

+ 0 - 47
file/file-service/src/main/java/cn/reghao/tnb/file/app/config/SwaggerConfig.java

@@ -1,47 +0,0 @@
-package cn.reghao.tnb.file.app.config;
-
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import springfox.documentation.RequestHandler;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * 配置 Swagger
- * Swagger 仅在 dev 环境生效
- *
- * @author reghao
- * @date 2019-05-14 17:01:07
- */
-@Profile({"dev"})
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-    @Bean
-    public Docket createRestApi() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .select()
-                .apis(RequestHandlerSelectors.basePackage("cn.reghao.tnb.file.app.controller"))
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    private ApiInfo apiInfo() {
-        return new ApiInfoBuilder()
-                .title("file APIs")
-                .description("")
-                .termsOfServiceUrl("")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 5 - 5
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/AliyunController.java

@@ -5,8 +5,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.file.app.model.dto.GetSignedUrl;
 import cn.reghao.tnb.file.app.model.vo.StsToken;
 import cn.reghao.tnb.file.app.service.AliyunService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @author reghao
  * @date 2024-08-30 14:31:14
  */
-@Api(tags = "阿里云接口")
+@Tag(name = "阿里云接口")
 @RestController
 @RequestMapping("/api/file/aliyun")
 public class AliyunController {
@@ -29,7 +29,7 @@ public class AliyunController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取阿里云 sts token", notes = "N")
+    @Operation(summary = "获取阿里云 sts token", description = "N")
     @PostMapping(value = "/sts_token", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUploadStore() {
         StsToken stsToken = aliyunService.getStsToken();
@@ -37,7 +37,7 @@ public class AliyunController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取阿里云 oss 签名 url", notes = "N")
+    @Operation(summary = "获取阿里云 oss 签名 url", description = "N")
     @PostMapping(value = "/signed_url", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getSignedUrl(@RequestBody @Validated GetSignedUrl getSignedUrl) {
         String signedUrl = aliyunService.getSignedUrl(getSignedUrl.getObjectName());

+ 4 - 4
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/AvatarController.java

@@ -3,8 +3,8 @@ package cn.reghao.tnb.file.app.controller;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.file.app.model.dto.AvatarUpdate;
 import cn.reghao.tnb.file.app.service.AvatarService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -18,7 +18,7 @@ import java.util.Map;
  * @author reghao
  * @date 2024-12-06 10:54:39
  */
-@Api(tags = "头像接口")
+@Tag(name = "头像接口")
 @RestController
 @RequestMapping("/api/file/avatar")
 public class AvatarController {
@@ -28,7 +28,7 @@ public class AvatarController {
         this.avatarService = avatarService;
     }
 
-    @ApiOperation(value = "更新账号头像", notes = "N")
+    @Operation(summary = "更新账号头像", description = "N")
     @PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
     public String updateUserAvatar(@RequestBody @Validated AvatarUpdate avatarUpdate) throws Exception {
         String avatarUrl = avatarService.updateAvatar(avatarUpdate);

+ 8 - 8
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OrderController.java

@@ -5,8 +5,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.file.app.model.vo.OrderDetail;
 import cn.reghao.tnb.file.app.service.OrderService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -15,7 +15,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-04-16 10:54:52
  */
-@Api(tags = "订单接口")
+@Tag(name = "订单接口")
 @RestController
 @RequestMapping("/api/mall/order")
 public class OrderController {
@@ -26,13 +26,13 @@ public class OrderController {
     }
 
     @AuthUser
-    @ApiOperation(value = "取消订单", notes = "N")
+    @Operation(summary = "取消订单", description = "N")
     @PostMapping("/cancel/{orderId}")
     public String cancelOrder(@PathVariable("orderId") Long orderId) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "订单退款", notes = "N")
+    @Operation(summary = "订单退款", description = "N")
     @AuthUser
     @PostMapping("/refund/{orderId}")
     public String refund(@PathVariable("orderId") Long orderId) {
@@ -40,7 +40,7 @@ public class OrderController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取订单列表", notes = "N")
+    @Operation(summary = "获取订单列表", description = "N")
     @GetMapping("")
     public String getOrders() {
         List<OrderDetail> list = orderService.getOrders(1);
@@ -48,14 +48,14 @@ public class OrderController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取订单详情", notes = "N")
+    @Operation(summary = "获取订单详情", description = "N")
     @GetMapping("/{orderId}")
     public String getOrderDetail(@PathVariable("orderId") Long orderId) {
         OrderDetail orderDetail = orderService.getOrderDetail(orderId);
         return WebResult.success(orderDetail);
     }
 
-    @ApiOperation(value = "支付订单", notes = "N")
+    @Operation(summary = "支付订单", description = "N")
     @AuthUser
     @PostMapping("/pay/{orderId}")
     public String payOrder(@PathVariable("orderId") Long orderId) {

+ 7 - 7
file/file-service/src/main/java/cn/reghao/tnb/file/app/controller/OssController.java

@@ -4,8 +4,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.oss.sdk.model.dto.ServerInfo;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.file.app.rpc.StoreServiceWrapperRouter;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @author reghao
  * @date 2024-04-19 20:47:14
  */
-@Api(tags = "OSS 接口")
+@Tag(name = "OSS 接口")
 @RestController
 @RequestMapping("/api/file/oss")
 public class OssController {
@@ -26,7 +26,7 @@ public class OssController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取图片上传 token", notes = "N")
+    @Operation(summary = "获取图片上传 token", description = "N")
     @PostMapping(value = "/serverinfo/image", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getImageChannelInfo() throws Exception {
         ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(104);
@@ -34,7 +34,7 @@ public class OssController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取照片上传 token", notes = "N")
+    @Operation(summary = "获取照片上传 token", description = "N")
     @PostMapping(value = "/serverinfo/photo", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getPhotoChannelInfo() throws Exception {
         ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(105);
@@ -42,7 +42,7 @@ public class OssController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取视频上传 token", notes = "N")
+    @Operation(summary = "获取视频上传 token", description = "N")
     @PostMapping(value = "/serverinfo/video", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoChannelInfo() throws Exception {
         ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(101);
@@ -50,7 +50,7 @@ public class OssController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取文件上传 token", notes = "N")
+    @Operation(summary = "获取文件上传 token", description = "N")
     @PostMapping(value = "/serverinfo/file", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getFileChannelInfo() throws Exception {
         ServerInfo serverInfo = storeServiceWrapperRouter.getUploadStore(114);

+ 0 - 6
message/message-service/pom.xml

@@ -101,12 +101,6 @@
             <version>2.4</version>
             <classifier>jdk15</classifier>
         </dependency>
-
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
-        </dependency>
     </dependencies>
 
     <profiles>

+ 0 - 43
message/message-service/src/main/java/cn/reghao/tnb/message/app/config/SwaggerConfig.java

@@ -1,43 +0,0 @@
-package cn.reghao.tnb.message.app.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * 配置 Swagger
- * Swagger 仅在 dev 环境生效
- *
- * @author reghao
- * @date 2019-05-14 17:01:07
- */
-@Profile({"dev"})
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-    @Bean
-    public Docket createRestApi() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .select()
-                .apis(RequestHandlerSelectors.basePackage("cn.reghao.tnb.message.app.controller"))
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    private ApiInfo apiInfo() {
-        return new ApiInfoBuilder()
-                .title("message APIs")
-                .description("")
-                .termsOfServiceUrl("")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 0 - 4
message/message-service/src/main/java/cn/reghao/tnb/message/app/controller/MessageController.java

@@ -1,8 +1,6 @@
 package cn.reghao.tnb.message.app.controller;
 
 import cn.reghao.jutil.web.WebResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -10,11 +8,9 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2023-10-30 21:32:37
  */
-@Api(tags = "消息接口")
 @RestController
 @RequestMapping("/api/message")
 public class MessageController {
-    @ApiOperation(value = "message webapi", notes = "N")
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getMessage() {
         return WebResult.success();

+ 0 - 6
search/search-service/pom.xml

@@ -128,12 +128,6 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
-
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
-        </dependency>
     </dependencies>
 
     <profiles>

+ 2 - 5
search/search-service/src/main/java/cn/reghao/tnb/search/app/controller/SearchController.java

@@ -2,8 +2,6 @@ package cn.reghao.tnb.search.app.controller;
 
 import cn.reghao.tnb.search.app.EsSearch;
 import cn.reghao.tnb.search.app.model.po.Wenshu;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
@@ -18,12 +16,11 @@ import org.springframework.web.bind.annotation.RequestParam;
  * @author reghao
  * @date 2025-05-02 16:44:46
  */
-@Api(tags = "博客前台页面")
 @Controller
 public class SearchController {
     private EsSearch esSearch;
 
-    @ApiOperation(value = "裁判文书搜索页面", notes = "N")
+    // 裁判文书搜索页面
     @GetMapping("/wenshu")
     public String wenshuSearchPage(@RequestParam(value = "search", required = false) String search,
                                    @RequestParam(value = "searchType", required = false) String searchType,
@@ -46,7 +43,7 @@ public class SearchController {
         return "/classic/wenshu/wenshu_search";
     }
 
-    @ApiOperation(value = "裁判文书详情页面", notes = "N")
+    // 裁判文书详情页面
     @GetMapping("/wenshu/{id}")
     public String wenshuPage(@PathVariable("id") String id, ModelMap model) {
         Wenshu wenshuResult = esSearch.getById(id);

+ 3 - 3
user/user-service/pom.xml

@@ -90,9 +90,9 @@
         </dependency>
 
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>3.0.0</version>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.7.0</version>
         </dependency>
     </dependencies>
 

+ 30 - 0
user/user-service/src/main/java/cn/reghao/tnb/user/app/config/SpringDocConfig.java

@@ -0,0 +1,30 @@
+package cn.reghao.tnb.user.app.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * SpringDoc API 文档相关配置
+ *
+ * @author reghao
+ * @date 2025-06-09 19:01:07
+ */
+@Configuration
+public class SpringDocConfig {
+    @Bean
+    public OpenAPI springOpenAPI() {
+        return new OpenAPI()
+                .info(new Info()
+                        .title("user api")
+                        .description("user api")
+                        .version("v0.0.1")
+                        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
+                .externalDocs(new ExternalDocumentation()
+                        .description("user api")
+                        .url("https://git.reghao.cn/reghao/tnb"));
+    }
+}

+ 0 - 43
user/user-service/src/main/java/cn/reghao/tnb/user/app/config/SwaggerConfig.java

@@ -1,43 +0,0 @@
-package cn.reghao.tnb.user.app.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * 配置 Swagger
- * Swagger 仅在 dev 环境生效
- *
- * @author reghao
- * @date 2019-05-14 17:01:07
- */
-@Profile({"dev"})
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-    @Bean
-    public Docket createRestApi() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .select()
-                .apis(RequestHandlerSelectors.basePackage("cn.reghao.tnb.user.app.controller"))
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    private ApiInfo apiInfo() {
-        return new ApiInfoBuilder()
-                .title("user APIs")
-                .description("")
-                .termsOfServiceUrl("")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 5 - 5
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/CrawledUserController.java

@@ -3,8 +3,8 @@ package cn.reghao.tnb.user.app.controller;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.account.api.dto.CrawledUser;
 import cn.reghao.tnb.user.app.service.CrawledUserService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2024-09-27 15:15:50
  */
-@Api(tags = "爬取的用户资料接口")
+@Tag(name = "爬取的用户资料接口")
 @RestController
 @RequestMapping("/api/user")
 public class CrawledUserController {
@@ -23,14 +23,14 @@ public class CrawledUserController {
         this.crawledUserService = crawledUserService;
     }
 
-    @ApiOperation(value = "创建 bilibili 用户帐号", notes = "N")
+    @Operation(summary = "创建 bilibili 用户帐号", description = "N")
     @PostMapping("/create/bili")
     public String updateUserProfile(@RequestBody @Validated CrawledUser crawledUser) {
         Long userId = crawledUserService.createAccount(crawledUser);
         return WebResult.success(userId);
     }
 
-    @ApiOperation(value = "查找 bilibili 用户", notes = "N")
+    @Operation(summary = "查找 bilibili 用户", description = "N")
     @GetMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE)
     public String searchUser(@RequestParam("username") String username) {
         Long userId = crawledUserService.getUserId(username);

+ 14 - 14
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/GroupController.java

@@ -6,7 +6,7 @@ import cn.reghao.tnb.user.app.model.dto.group.*;
 import cn.reghao.tnb.user.app.service.GroupInfoService;
 import cn.reghao.tnb.user.app.service.GroupMemberService;
 import cn.reghao.tnb.user.app.service.GroupNoticeService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -30,91 +30,91 @@ public class GroupController {
         this.groupNoticeService = groupNoticeService;
     }
 
-    @ApiOperation(value = "创建群组")
+    @Operation(summary = "创建群组")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupCreate(@RequestBody CreateGroup createGroup) {
         CreateGroupRet createGroupRet = groupInfoService.createGroup(createGroup);
         return WebResult.success(createGroupRet);
     }
 
-    @ApiOperation(value = "群组详细信息")
+    @Operation(summary = "群组详细信息")
     @GetMapping(value = "/detail", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupDetail(@RequestParam("group_id") int groupId) {
         GroupDetailRet groupDetailRet = groupInfoService.getGroupDetail(groupId);
         return WebResult.success(groupDetailRet);
     }
 
-    @ApiOperation(value = "群组信息设置")
+    @Operation(summary = "群组信息设置")
     @PostMapping(value = "/setting", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupSetting(@RequestBody GroupSetting groupSetting) {
         groupInfoService.editGroupDetail(groupSetting);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "(群主)解散群组")
+    @Operation(summary = "(群主)解散群组")
     @PostMapping(value = "/dismiss", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupDismiss() {
         // TODO 前端未实现该接口
         return WebResult.success();
     }
 
-    @ApiOperation(value = "用户所在的群组")
+    @Operation(summary = "用户所在的群组")
     @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupList() {
         GroupInfoRetList groupInfoRetList = groupMemberService.getGroups();
         return WebResult.success(groupInfoRetList);
     }
 
-    @ApiOperation(value = "群成员")
+    @Operation(summary = "群成员")
     @GetMapping(value = "/member/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupMemberList(@RequestParam("group_id") long groupId) {
         List<GroupMemberRet> memberList = groupMemberService.getGroupMember(groupId);
         return WebResult.success(memberList);
     }
 
-    @ApiOperation(value = "获取需要邀请入群的用户")
+    @Operation(summary = "获取需要邀请入群的用户")
     @GetMapping(value = "/member/invites", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupMemberInvites(@RequestParam("group_id") long groupId) {
         List<ContactInfo> list = groupMemberService.getInvitedUsers(groupId);
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "邀请用户进群")
+    @Operation(summary = "邀请用户进群")
     @PostMapping(value = "/invite", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupInvite(@RequestBody GroupInvite groupInvite) {
         groupMemberService.inviteUsers(groupInvite);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "(群成员)退出群组")
+    @Operation(summary = "(群成员)退出群组")
     @PostMapping(value = "/secede", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupSecede(@RequestBody SecedeGroup secedeGroup) {
         groupMemberService.leaveGroup(secedeGroup);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "(群主)移除群成员")
+    @Operation(summary = "(群主)移除群成员")
     @PostMapping(value = "/member/remove", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupMemberRemove(@RequestBody RemoveMember removeMember) {
         groupMemberService.removeMembers(removeMember);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "修改群组内显示的昵称")
+    @Operation(summary = "修改群组内显示的昵称")
     @PostMapping(value = "/member/remark", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupMemberRemark(@RequestBody MemberRemark memberRemark) {
         groupMemberService.setNicknameInGroup(memberRemark);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "群公告")
+    @Operation(summary = "群公告")
     @GetMapping(value = "/notice/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupNoticeList(@RequestParam("group_id") int groupId) {
         NoticeListRet noticeListRet = groupNoticeService.getNoticeList(groupId);
         return WebResult.success(noticeListRet);
     }
 
-    @ApiOperation(value = "添加/修改群公告")
+    @Operation(summary = "添加/修改群公告")
     @PostMapping(value = "/notice/edit", produces = MediaType.APPLICATION_JSON_VALUE)
     public String groupNoticeEdit(@RequestBody EditGroupNotice editGroupNotice) {
         groupNoticeService.createOrUpdateNotice(editGroupNotice);

+ 15 - 15
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserContactController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.user.app.model.dto.*;
 import cn.reghao.tnb.user.app.service.ContactService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +18,7 @@ import java.util.List;
  * @author reghao
  * @date 2022-04-16 20:43:30
  */
-@Api(tags = "用户联系人接口")
+@Tag(name = "用户联系人接口")
 @RestController
 @RequestMapping("/api/user/contact")
 public class UserContactController {
@@ -28,7 +28,7 @@ public class UserContactController {
         this.contactService = contactService;
     }
 
-    @ApiOperation(value = "查找联系人", notes = "N")
+    @Operation(summary = "查找联系人", description = "N")
     @GetMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactSearch(@RequestParam("mobile") String mobile) {
         SearchContactResult contactDetail = contactService.searchUser(mobile);
@@ -39,7 +39,7 @@ public class UserContactController {
         return WebResult.success(contactDetail);
     }
 
-    @ApiOperation(value = "获取联系人信息", notes = "N")
+    @Operation(summary = "获取联系人信息", description = "N")
     @GetMapping(value = "/detail/{userId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactDetail(@PathVariable("userId") Long userId) {
         ContactInfoResult contactDetail = contactService.getContactInfoResult(userId);
@@ -50,41 +50,41 @@ public class UserContactController {
         return WebResult.success(contactDetail);
     }
 
-    @ApiOperation(value = "申请添加联系人", notes = "N")
+    @Operation(summary = "申请添加联系人", description = "N")
     @PostMapping(value = "/apply/create", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactApplyCreate(@RequestBody ContactAdd contactAdd) {
         Result result = contactService.createApply(contactAdd);
         return WebResult.result(result);
     }
 
-    @ApiOperation(value = "获取联系人申请列表", notes = "N")
+    @Operation(summary = "获取联系人申请列表", description = "N")
     @GetMapping(value = "/apply/records", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactApplyRecords(@RequestParam("pageNumber") int pageNumber) {
         ContactApplyList pageList = contactService.getApplyList(pageNumber);
         return WebResult.success(pageList);
     }
 
-    @ApiOperation(value = "获取联系人申请未读消息数目", notes = "N")
+    @Operation(summary = "获取联系人申请未读消息数目", description = "N")
     @GetMapping(value = "/apply/unread", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactApplyUnreadNum() {
         UnreadNum unreadNum = contactService.getApplyCount();
         return WebResult.success(unreadNum);
     }
 
-    @ApiOperation(value = "回复消息", notes = "N")
+    @Operation(summary = "回复消息", description = "N")
     @PostMapping(value = "/reply", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactReply(@RequestBody ContactReply contactReply) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "接受联系人申请", notes = "N")
+    @Operation(summary = "接受联系人申请", description = "N")
     @PostMapping(value = "/apply/accept", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactApplyAccept(@RequestBody ContactAddRespond contactAddRespond) {
         contactService.acceptApply(contactAddRespond);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "拒绝联系人申请", notes = "N")
+    @Operation(summary = "拒绝联系人申请", description = "N")
     @PostMapping(value = "/apply/decline", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactApplyDecline(@RequestBody ContactAddRespond contactAddRespond) {
         contactService.declineApply(contactAddRespond);
@@ -92,7 +92,7 @@ public class UserContactController {
     }
 
     @AuthUser
-    @ApiOperation(value = "获取联系人列表", notes = "N")
+    @Operation(summary = "获取联系人列表", description = "N")
     @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactList() {
         long loginUser = UserContext.getUser();
@@ -100,20 +100,20 @@ public class UserContactController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "设置联系人备注", notes = "N")
+    @Operation(summary = "设置联系人备注", description = "N")
     @PostMapping(value = "/remark", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactEditRemark(@RequestBody @Validated ContactRemark contactRemark) {
         contactService.updateContactRemark(contactRemark);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "拉黑联系人", notes = "N")
+    @Operation(summary = "拉黑联系人", description = "N")
     @PostMapping(value = "/block", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactBlock(@RequestParam("friend_id") int friendId) {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "删除联系人", notes = "N")
+    @Operation(summary = "删除联系人", description = "N")
     @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
     public String contactDelete(@RequestParam("friend_id") int friendId) {
         return WebResult.success();

+ 6 - 6
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserMessageController.java

@@ -4,8 +4,8 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.user.app.model.po.UserMessage;
 import cn.reghao.tnb.user.app.service.UserMessageService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
@@ -16,7 +16,7 @@ import java.util.Map;
  * @author reghao
  * @date 2024-04-18 15:04:24
  */
-@Api(tags = "用户消息接口")
+@Tag(name = "用户消息接口")
 @RestController
 @RequestMapping("/api/user/message")
 public class UserMessageController {
@@ -26,7 +26,7 @@ public class UserMessageController {
         this.userMessageService = userMessageService;
     }
 
-    @ApiOperation(value = "获取未读消息数量", notes = "N")
+    @Operation(summary = "获取未读消息数量", description = "N")
     @GetMapping(value = "/unread", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUnreadCount() {
         long loginUser = UserContext.getUser();
@@ -34,7 +34,7 @@ public class UserMessageController {
         return WebResult.success(Map.of("total", total));
     }
 
-    @ApiOperation(value = "获取未读消息列表", notes = "N")
+    @Operation(summary = "获取未读消息列表", description = "N")
     @GetMapping(value = "/unread/list", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUnreadMessages() {
         long loginUser = UserContext.getUser();
@@ -42,7 +42,7 @@ public class UserMessageController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取消息详情", notes = "N")
+    @Operation(summary = "获取消息详情", description = "N")
     @GetMapping(value = "/detail/{messageId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserMessage(@PathVariable("messageId") Long messageId) {
         UserMessage userMessage = userMessageService.getUserMessage(messageId);

+ 6 - 6
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserProfileController.java

@@ -5,8 +5,8 @@ import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.user.api.dto.UserInfo;
 import cn.reghao.tnb.user.app.model.dto.UserProfileUpdate;
 import cn.reghao.tnb.user.app.service.UserProfileService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
@@ -18,7 +18,7 @@ import java.util.Collections;
  * @author reghao
  * @date 2023-06-22 14:10:07
  */
-@Api(tags = "用户资料接口")
+@Tag(name = "用户资料接口")
 @RestController
 @RequestMapping("/api/user")
 public class UserProfileController {
@@ -31,14 +31,14 @@ public class UserProfileController {
         this.userProfileService = userProfileService;
     }
 
-    @ApiOperation(value = "修改用户资料", notes = "N")
+    @Operation(summary = "修改用户资料", description = "N")
     @PostMapping(value = "/profile/update", produces = MediaType.APPLICATION_JSON_VALUE)
     public String updateUserProfile(@RequestBody @Validated UserProfileUpdate userProfileUpdate) {
         userProfileService.updateUserProfile(userProfileUpdate);
         return WebResult.success();
     }
 
-    @ApiOperation(value = "获取用户资料", notes = "N")
+    @Operation(summary = "获取用户资料", description = "N")
     @GetMapping(value = "/info", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserInfo(@RequestParam("userId") String userId) {
         long userId1 = accountQuery.getUserIdLong(userId);
@@ -46,7 +46,7 @@ public class UserProfileController {
         return WebResult.success(userInfo);
     }
 
-    @ApiOperation(value = "获取推荐用户", notes = "N")
+    @Operation(summary = "获取推荐用户", description = "N")
     @GetMapping(value = "/discover", produces = MediaType.APPLICATION_JSON_VALUE)
     public String discover() {
         return WebResult.success(Collections.emptyList());

+ 8 - 8
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserRelationController.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.user.api.dto.UserCard;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.user.app.service.UserRelationService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.web.bind.annotation.*;
 
@@ -17,7 +17,7 @@ import java.util.List;
  * @author reghao
  * @date 2022-01-14 18:50:16
  */
-@Api(tags = "用户关注接口")
+@Tag(name = "用户关注接口")
 @RestController
 @RequestMapping("/api/user/relation")
 public class UserRelationController {
@@ -30,7 +30,7 @@ public class UserRelationController {
         this.userRelationService = userRelationService;
     }
 
-    @ApiOperation(value = "关注用户", notes = "N")
+    @Operation(summary = "关注用户", description = "N")
     @PostMapping("/follow/{followingId}")
     public String followUser(@PathVariable("followingId") String followingId) {
         long followingId1 = accountQuery.getUserIdLong(followingId);
@@ -40,7 +40,7 @@ public class UserRelationController {
     }
 
     @AuthUser
-    @ApiOperation(value = "取消关注用户", notes = "N")
+    @Operation(summary = "取消关注用户", description = "N")
     @PostMapping("/unfollow/{followingId}")
     public String unfollowUser(@PathVariable("followingId") String followingId) {
         long followingId1 = accountQuery.getUserIdLong(followingId);
@@ -49,7 +49,7 @@ public class UserRelationController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "检查是否关注了用户", notes = "N")
+    @Operation(summary = "检查是否关注了用户", description = "N")
     @GetMapping("/check/{userId}")
     public String check(@PathVariable("userId") String userId) {
         long userId1 = accountQuery.getUserIdLong(userId);
@@ -63,7 +63,7 @@ public class UserRelationController {
         return WebResult.success(followed);
     }
 
-    @ApiOperation(value = "获取用户的关注列表", notes = "N")
+    @Operation(summary = "获取用户的关注列表", description = "N")
     @GetMapping("/following/{userId}")
     public String getFollowing(@PathVariable("userId") String userId) {
         long userId1 = accountQuery.getUserIdLong(userId);
@@ -71,7 +71,7 @@ public class UserRelationController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取用户的粉丝列表", notes = "N")
+    @Operation(summary = "获取用户的粉丝列表", description = "N")
     @GetMapping("/follower/{userId}")
     public String getFollower(@PathVariable("userId") String userId) {
         long userId1 = accountQuery.getUserIdLong(userId);

+ 6 - 6
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserVipController.java

@@ -7,8 +7,8 @@ import cn.reghao.tnb.user.app.model.dto.BuyVip;
 import cn.reghao.tnb.user.app.model.po.VipPlan;
 import cn.reghao.tnb.user.app.model.vo.MyVip;
 import cn.reghao.tnb.user.app.service.UserVipService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -18,7 +18,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-06-22 14:14:09
  */
-@Api(tags = "用户会员接口")
+@Tag(name = "用户会员接口")
 @RestController
 @RequestMapping("/api/user/vip")
 public class UserVipController {
@@ -28,7 +28,7 @@ public class UserVipController {
         this.userVipService = userVipService;
     }
 
-    @ApiOperation(value = "获取用户的会员信息", notes = "N")
+    @Operation(summary = "获取用户的会员信息", description = "N")
     @AuthUser
     @GetMapping("/my")
     public String getMyVip() {
@@ -36,7 +36,7 @@ public class UserVipController {
         return WebResult.success(myVip);
     }
 
-    @ApiOperation(value = "获取会员计划", notes = "N")
+    @Operation(summary = "获取会员计划", description = "N")
     @AuthUser
     @GetMapping("/plan")
     public String getVipPlan() {
@@ -44,7 +44,7 @@ public class UserVipController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "购买会员", notes = "N")
+    @Operation(summary = "购买会员", description = "N")
     @AuthUser
     @PostMapping("/buy")
     public String buyVip(@RequestBody @Validated BuyVip buyVip) throws Exception {

+ 7 - 7
user/user-service/src/main/java/cn/reghao/tnb/user/app/controller/UserWalletController.java

@@ -9,8 +9,8 @@ import cn.reghao.tnb.user.app.model.dto.WalletDto;
 import cn.reghao.tnb.user.app.model.po.Wallet;
 import cn.reghao.tnb.user.app.model.vo.BillRecord;
 import cn.reghao.tnb.user.app.service.WalletService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -21,7 +21,7 @@ import java.util.List;
  * @author reghao
  * @date 2024-04-16 16:15:04
  */
-@Api(tags = "用户钱包接口")
+@Tag(name = "用户钱包接口")
 @RestController
 @RequestMapping("/api/user/wallet")
 public class UserWalletController {
@@ -33,7 +33,7 @@ public class UserWalletController {
         this.walletService = walletService;
     }
 
-    @ApiOperation(value = "获取用户钱包", notes = "N")
+    @Operation(summary = "获取用户钱包", description = "N")
     @AuthUser
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUserWallet() {
@@ -42,7 +42,7 @@ public class UserWalletController {
         return WebResult.success(wallet);
     }
 
-    @ApiOperation(value = "获取钱包账单", notes = "N")
+    @Operation(summary = "获取钱包账单", description = "N")
     @AuthUser
     @GetMapping(value = "/bill", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getWalletBill() {
@@ -51,7 +51,7 @@ public class UserWalletController {
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "向钱包充值", notes = "N")
+    @Operation(summary = "向钱包充值", description = "N")
     @AuthUser
     @PostMapping("/charge")
     public String chargeWallet(@RequestBody @Validated ChargeReq chargeReq) {
@@ -59,7 +59,7 @@ public class UserWalletController {
         return WebResult.success();
     }
 
-    @ApiOperation(value = "使用钱包支付", notes = "N")
+    @Operation(summary = "使用钱包支付", description = "N")
     @AuthUser
     @PostMapping("/pay")
     public String pay(@RequestBody @Validated WalletDto walletDto) throws Exception {