This is an automated email from the ASF dual-hosted git repository.

benjobs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git


The following commit(s) were added to refs/heads/dev by this push:
     new 9cbb92ecb [Feature] Support openapi3 & accessToken unit test (#2459)
9cbb92ecb is described below

commit 9cbb92ecb6eb3bdb70f3a6661c9eda7c82da741d
Author: lvshaokang <[email protected]>
AuthorDate: Sat Apr 15 23:52:30 2023 +0800

    [Feature] Support openapi3 & accessToken unit test (#2459)
    
    * [Feature] Support openapi3
    
    * feat: add operation and tag
    
    
    ---------
    
    Co-authored-by: benjobs <[email protected]>
---
 .../streampark-console-service/pom.xml             |  29 ++-
 .../console/base/config/OpenapiConfig.java         |  79 ++++++++
 .../console/base/config/SwaggerConfig.java         | 141 --------------
 .../console/base/domain/RestRequest.java           |  11 ++
 .../console/core/bean/AlertConfigWithParams.java   |  26 +--
 .../console/core/bean/AlertDingTalkParams.java     |  23 ++-
 .../console/core/bean/AlertEmailParams.java        |   7 +-
 .../console/core/bean/AlertHttpCallbackParams.java |  17 +-
 .../console/core/bean/AlertLarkParams.java         |  20 +-
 .../console/core/bean/AlertWeComParams.java        |   7 +-
 .../console/core/controller/AlertController.java   |  65 ++-----
 .../ApplicationBuildPipelineController.java        |  46 ++---
 .../core/controller/ApplicationController.java     | 216 +++++++++++----------
 .../controller/ApplicationHistoryController.java   |  14 +-
 .../console/core/controller/ConfigController.java  |   9 +
 .../core/controller/ExternalLinkController.java    |  40 ++--
 .../core/controller/FlinkClusterController.java    |  12 ++
 .../core/controller/FlinkEnvController.java        |  11 ++
 .../controller/FlinkPodTemplateController.java     |   8 +
 .../core/controller/FlinkSqlController.java        |  13 +-
 .../console/core/controller/IndexController.java   |   2 +
 .../console/core/controller/MessageController.java |   5 +
 .../console/core/controller/ProjectController.java |  17 ++
 .../core/controller/SavePointController.java       |  35 ++--
 .../console/core/controller/SettingController.java |   8 +
 .../core/controller/VariableController.java        |  11 ++
 .../core/controller/YarnQueueController.java       |  58 ++----
 .../console/system/authentication/ShiroConfig.java |   7 +-
 .../system/controller/AccessTokenController.java   |  64 +++++-
 .../system/controller/MemberController.java        |  10 +
 .../console/system/controller/MenuController.java  |   8 +
 .../system/controller/PassportController.java      |   5 +
 .../console/system/controller/RoleController.java  |   9 +
 .../console/system/controller/TeamController.java  |   8 +
 .../console/system/controller/UserController.java  |  19 ++
 .../src/main/resources/application.yml             |  10 +-
 .../resources/mapper/system/AccessTokenMapper.xml  |   2 +-
 .../core/service/AccessTokenServiceTest.java       |  30 ++-
 38 files changed, 622 insertions(+), 480 deletions(-)

diff --git a/streampark-console/streampark-console-service/pom.xml 
b/streampark-console/streampark-console-service/pom.xml
index 9259dadcb..67dd320d7 100644
--- a/streampark-console/streampark-console-service/pom.xml
+++ b/streampark-console/streampark-console-service/pom.xml
@@ -41,8 +41,8 @@
         <MaxPermGen>512m</MaxPermGen>
         <CodeCacheSize>512m</CodeCacheSize>
 
-        <swagger-bootstrap.version>2.0.9</swagger-bootstrap.version>
-        <springfox.version>3.0.0</springfox.version>
+        <knife4j-openapi3.version>4.0.0</knife4j-openapi3.version>
+        <springdoc-openapi-ui.version>1.6.9</springdoc-openapi-ui.version>
         <commons-compress.version>1.21</commons-compress.version>
         <javax-mail.version>1.4.7</javax-mail.version>
         <shiro.version>1.10.0</shiro.version>
@@ -358,24 +358,23 @@
             
<artifactId>jackson-module-scala_${scala.binary.version}</artifactId>
         </dependency>
 
-        <!-- swagger 3 -->
+        <!-- openapi -->
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-            <version>${springfox.version}</version>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>${springdoc-openapi-ui.version}</version>
         </dependency>
 
-        <!-- swagger-bootstrap -->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-spring-ui</artifactId>
-            <version>${swagger-bootstrap.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-spring-boot-autoconfigure</artifactId>
-            <version>${swagger-bootstrap.version}</version>
+            <artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
+            <version>${knife4j-openapi3.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>springdoc-openapi-webflux-core</artifactId>
+                    <groupId>org.springdoc</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!--Test dependencies start.-->
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/OpenapiConfig.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/OpenapiConfig.java
new file mode 100644
index 000000000..e076dece2
--- /dev/null
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/OpenapiConfig.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.console.base.config;
+
+import org.apache.http.HttpHeaders;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springdoc.core.GroupedOpenApi;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.Collections;
+
+@EnableKnife4j
+@Configuration
+@ConditionalOnWebApplication
+public class OpenapiConfig implements WebMvcConfigurer {
+
+  @Bean
+  public OpenAPI apiV1Info() {
+    return new OpenAPI()
+        .info(
+            new Info()
+                .title("Apache StreamPark Api Docs")
+                .description("Apache StreamPark Api Docs")
+                .contact(
+                    new Contact()
+                        .name("Apache StreamPark")
+                        .url("https://streampark.apache.org/";)
+                        .email("[email protected]"))
+                .version("2.1.0-SNAPSHOT")
+                .license(new License().name("Apache-2.0 license")))
+        .components(
+            new Components()
+                .addSecuritySchemes(
+                    HttpHeaders.AUTHORIZATION,
+                    new SecurityScheme()
+                        .type(SecurityScheme.Type.APIKEY)
+                        .name(HttpHeaders.AUTHORIZATION)
+                        .in(SecurityScheme.In.HEADER)))
+        .security(
+            Collections.singletonList(
+                new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)));
+  }
+
+  @Bean
+  public GroupedOpenApi publicApiV1() {
+    return 
GroupedOpenApi.builder().group("v1").pathsToExclude("/v2/**").build();
+  }
+
+  @Bean
+  public GroupedOpenApi publicApiV2() {
+    return GroupedOpenApi.builder().group("v2").pathsToMatch("/v2/**").build();
+  }
+}
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/SwaggerConfig.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/SwaggerConfig.java
deleted file mode 100644
index 7355dc3fa..000000000
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/config/SwaggerConfig.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.streampark.console.base.config;
-
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Value;
-import 
org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
-import 
org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
-import 
org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
-import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
-import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
-import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
-import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
-import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
-import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
-import 
org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
-import 
org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
-import 
org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
-import 
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-import org.springframework.util.StringUtils;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.oas.annotations.EnableOpenApi;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.ApiKey;
-import springfox.documentation.service.AuthorizationScope;
-import springfox.documentation.service.Contact;
-import springfox.documentation.service.SecurityReference;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spi.service.contexts.SecurityContextBuilder;
-import springfox.documentation.spring.web.plugins.Docket;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-@Configuration
-@EnableOpenApi
-@ConditionalOnWebApplication
-public class SwaggerConfig implements WebMvcConfigurer {
-
-  @Value("${swagger.enable:false}")
-  private Boolean swaggerEnabled;
-
-  @Bean
-  public Docket createRestApi() {
-    return new Docket(DocumentationType.OAS_30)
-        .enable(swaggerEnabled)
-        .apiInfo(apiInfo())
-        .securitySchemes(
-            Collections.singletonList(new ApiKey("Authorization", 
"Authorization", "header")))
-        .securityContexts(
-            Collections.singletonList(
-                new SecurityContextBuilder()
-                    .securityReferences(
-                        Collections.singletonList(
-                            SecurityReference.builder()
-                                .scopes(new AuthorizationScope[0])
-                                .reference("Authorization")
-                                .build()))
-                    .operationSelector(s -> true)
-                    .build()))
-        .select()
-        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
-        .paths(PathSelectors.any())
-        .build();
-  }
-
-  private ApiInfo apiInfo() {
-    return new ApiInfoBuilder()
-        .title("Apache StreamPark Api Docs")
-        .description("Apache StreamPark Api Docs")
-        .contact(
-            new Contact(
-                "Apache StreamPark", "https://streampark.apache.org/";, 
"[email protected]"))
-        .version("2.1.0-SNAPSHOT")
-        .license("Apache-2.0 license")
-        .build();
-  }
-
-  /**
-   * Streampark used `ant_path_matcher` as default matching-strategy in the 
springboot 2.6+ version,
-   * but actuator endpoint used `PathPattern` based URL matching. So rewrite
-   * webEndpointServletHandlerMapping @Bean for resolve springfox and actuator 
conflicts.
-   */
-  @Bean
-  public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(
-      WebEndpointsSupplier webEndpointsSupplier,
-      ServletEndpointsSupplier servletEndpointsSupplier,
-      ControllerEndpointsSupplier controllerEndpointsSupplier,
-      EndpointMediaTypes endpointMediaTypes,
-      CorsEndpointProperties corsProperties,
-      WebEndpointProperties webEndpointProperties,
-      Environment environment) {
-    List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
-    Collection<ExposableWebEndpoint> webEndpoints = 
webEndpointsSupplier.getEndpoints();
-    allEndpoints.addAll(webEndpoints);
-    allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
-    allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
-    String basePath = webEndpointProperties.getBasePath();
-    EndpointMapping endpointMapping = new EndpointMapping(basePath);
-    boolean shouldRegisterLinksMapping =
-        this.shouldRegisterLinksMapping(webEndpointProperties, environment, 
basePath);
-    return new WebMvcEndpointHandlerMapping(
-        endpointMapping,
-        webEndpoints,
-        endpointMediaTypes,
-        corsProperties.toCorsConfiguration(),
-        new EndpointLinksResolver(allEndpoints, basePath),
-        shouldRegisterLinksMapping,
-        null);
-  }
-
-  private boolean shouldRegisterLinksMapping(
-      WebEndpointProperties webEndpointProperties, Environment environment, 
String basePath) {
-    return webEndpointProperties.getDiscovery().isEnabled()
-        && (StringUtils.hasText(basePath)
-            || 
ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
-  }
-}
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/domain/RestRequest.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/domain/RestRequest.java
index 15eb62383..42fe5084a 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/domain/RestRequest.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/base/domain/RestRequest.java
@@ -17,18 +17,29 @@
 
 package org.apache.streampark.console.base.domain;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.springdoc.api.annotations.ParameterObject;
 
 import java.io.Serializable;
 
+@ParameterObject
 @Data
 public class RestRequest implements Serializable {
 
   private static final long serialVersionUID = -4869594085374385813L;
 
+  @Schema(example = "10", required = true)
   private int pageSize = 10;
+
+  @Schema(example = "1", required = true)
   private int pageNum = 1;
 
+  @Schema(example = "", description = "e.g. create_time")
   private String sortField;
+
+  @Schema(
+      example = "",
+      allowableValues = {"asc", "desc"})
   private String sortOrder;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertConfigWithParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertConfigWithParams.java
index 5fb5a1811..634f99248 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertConfigWithParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertConfigWithParams.java
@@ -23,44 +23,46 @@ import 
org.apache.streampark.console.core.entity.AlertConfig;
 import org.apache.commons.lang3.StringUtils;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertConfig")
+@Schema(name = "AlertConfig")
 @Data
 @Slf4j
 public class AlertConfigWithParams implements Serializable {
 
-  @ApiModelProperty(name = "id", value = "id")
+  @Schema(example = "1")
   private Long id;
 
-  @ApiModelProperty(name = "userId", value = "user id")
+  @Schema(example = "100000")
   private Long userId;
 
-  @ApiModelProperty(name = "alertName", value = "alert name")
+  @Schema(example = "test-alert")
   private String alertName;
 
-  @ApiModelProperty(name = "alertType", value = "alert type")
+  @Schema(
+      example = "1",
+      description =
+          "base type, email 1, dink-talk 2, we-com 4, http callback 8, lark 
16, also choose a combination, e.g. 3 means email + dink-talk")
   private Integer alertType;
 
-  @ApiModelProperty(name = "emailParams", value = "email alert params")
+  @Schema(description = "email alert parameters")
   private AlertEmailParams emailParams;
 
-  @ApiModelProperty(name = "dingTalkParams", value = "ding-talk alert params")
+  @Schema(description = "ding-talk alert parameters")
   private AlertDingTalkParams dingTalkParams;
 
-  @ApiModelProperty(name = "weComParams", value = "we-com alert params")
+  @Schema(description = "we-com alert parameters")
   private AlertWeComParams weComParams;
 
-  @ApiModelProperty(name = "httpCallbackParams", value = "http callback alert 
params")
+  @Schema(description = "http callback alert parameters")
   private AlertHttpCallbackParams httpCallbackParams;
 
-  @ApiModelProperty(name = "larkParams", value = "lark alert params")
+  @Schema(description = "lark alert parameters")
   private AlertLarkParams larkParams;
 
   public static AlertConfigWithParams of(AlertConfig config) {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertDingTalkParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertDingTalkParams.java
index 06f704eae..d6bb14e41 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertDingTalkParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertDingTalkParams.java
@@ -18,38 +18,37 @@
 package org.apache.streampark.console.core.bean;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertDingTalk")
+@Schema(name = "AlertDingTalk")
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class AlertDingTalkParams implements Serializable {
 
-  @ApiModelProperty(name = "token", value = "token")
+  @Schema(description = "dink-talk token")
   @NotBlank(message = "The access token of DingTalk must be not empty")
   private String token;
 
-  @ApiModelProperty(name = "contacts", value = "phone, multiple use ',' 
delimiter")
+  @Schema(description = "phone numbers, use ',' to split multiple phone 
numbers")
   private String contacts;
 
-  @ApiModelProperty(name = "alertDingUrl", value = "ding url")
+  @Schema(description = "ding-talk url")
   private String alertDingURL;
 
-  @ApiModelProperty(name = "isAtAll", value = "is @all", example = "false")
+  @Schema(description = "is @all", example = "false", defaultValue = "false")
   private Boolean isAtAll = false;
 
-  @ApiModelProperty(
-      name = "secretEnable",
-      value = "is ding robot secret enabled",
-      example = "false")
+  @Schema(
+      description = "is ding-talk robot secret enabled",
+      example = "false",
+      defaultValue = "false")
   private Boolean secretEnable = false;
 
-  @ApiModelProperty(name = "secretToken", value = "ding robot webhook secret 
token")
+  @Schema(description = "ding-talk robot webhook secret token")
   private String secretToken;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertEmailParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertEmailParams.java
index 168648300..b9e7ac89f 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertEmailParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertEmailParams.java
@@ -18,20 +18,19 @@
 package org.apache.streampark.console.core.bean;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertEmail")
+@Schema(name = "AlertEmail")
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class AlertEmailParams implements Serializable {
 
-  @ApiModelProperty(name = "contacts", value = "email address")
+  @Schema(example = "[email protected]", description = "email address")
   @NotBlank(message = "The address of email must be not empty")
   private String contacts;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertHttpCallbackParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertHttpCallbackParams.java
index ac876e1e7..f95311717 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertHttpCallbackParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertHttpCallbackParams.java
@@ -18,29 +18,32 @@
 package org.apache.streampark.console.core.bean;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertHttpCallback")
+@Schema(name = "AlertHttpCallback")
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class AlertHttpCallbackParams implements Serializable {
 
-  @ApiModelProperty(name = "url", value = "callback url")
+  @Schema(description = "http callback url")
   @NotBlank(message = "The url of callback must be not empty")
   private String url;
 
-  @ApiModelProperty(name = "method", value = "http method")
+  @Schema(
+      description = "http method",
+      defaultValue = "POST",
+      example = "POST",
+      allowableValues = {"POST", "GET"})
   private String method = "POST";
 
-  @ApiModelProperty(name = "contentType", value = "content type", example = 
"application/json")
+  @Schema(description = "content type header", example = "application/json")
   private String contentType;
 
-  @ApiModelProperty(name = "requestTemplate", value = "use freemarker template 
replace the params")
+  @Schema(description = "use freemarker template replace the parameters")
   private String requestTemplate;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertLarkParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertLarkParams.java
index 8e676681f..01f55511b 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertLarkParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertLarkParams.java
@@ -18,32 +18,32 @@
 package org.apache.streampark.console.core.bean;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertLark")
+@Schema(name = "AlertLark")
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class AlertLarkParams implements Serializable {
 
-  @ApiModelProperty(name = "token", value = "lark token")
+  @Schema(description = "lark access token")
   @NotBlank(message = "The access token of Lark must be not empty")
   private String token;
 
-  @ApiModelProperty(name = "isAtAll", value = "is @all", example = "false")
+  @Schema(description = "is @all", example = "false", implementation = 
boolean.class)
   private Boolean isAtAll = false;
 
-  @ApiModelProperty(
-      name = "secretEnable",
-      value = "is lark robot secret enabled",
-      example = "false")
+  @Schema(
+      description = "is lark robot secret enabled",
+      example = "false",
+      defaultValue = "false",
+      implementation = boolean.class)
   private Boolean secretEnable = false;
 
-  @ApiModelProperty(name = "secretToken", value = "lark robot webhook secret 
token")
+  @Schema(description = "lark robot webhook secret token")
   private String secretToken;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertWeComParams.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertWeComParams.java
index fddd422b8..3568f3dd3 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertWeComParams.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/AlertWeComParams.java
@@ -18,20 +18,19 @@
 package org.apache.streampark.console.core.bean;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 
 import java.io.Serializable;
 
-@ApiModel(value = "AlertWeCom")
+@Schema(name = "AlertWeCom")
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class AlertWeComParams implements Serializable {
 
-  @ApiModelProperty(name = "token", value = "we-com token")
+  @Schema(name = "token", description = "we-com token")
   @NotBlank(message = "The access token of WeCom must be not empty")
   private String token;
 }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/AlertController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/AlertController.java
index 316276811..aebd46e2d 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/AlertController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/AlertController.java
@@ -28,10 +28,10 @@ import 
org.apache.streampark.console.core.service.alert.AlertConfigService;
 import org.apache.streampark.console.core.service.alert.AlertService;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -48,7 +48,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.TimeZone;
 
-@Api(tags = {"ALERT_TAG"})
+@Tag(name = "ALERT_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -59,82 +59,51 @@ public class AlertController {
 
   @Autowired private AlertService alertService;
 
-  @ApiOperation(value = "Create alert config")
+  @Operation(summary = "Create alert config")
   @PostMapping(value = "/add")
   public RestResponse createAlertConfig(@RequestBody AlertConfigWithParams 
params) {
     boolean save = alertConfigService.save(AlertConfig.of(params));
     return RestResponse.success(save);
   }
 
-  @ApiOperation(value = "Exist alert config")
+  @Operation(summary = "Check alert config exist")
   @PostMapping(value = "/exists")
-  public RestResponse existsAlertConfig(@RequestBody AlertConfigWithParams 
params) {
+  public RestResponse verifyAlertConfig(@RequestBody AlertConfigWithParams 
params) {
     boolean exist = alertConfigService.exist(AlertConfig.of(params));
     return RestResponse.success(exist);
   }
 
-  @ApiOperation(value = "Update alert config")
+  @Operation(summary = "Update alert config")
   @PostMapping(value = "/update")
   public RestResponse updateAlertConfig(@RequestBody AlertConfigWithParams 
params) {
     boolean update = alertConfigService.updateById(AlertConfig.of(params));
     return RestResponse.success(update);
   }
 
-  @ApiOperation(value = "Get alert config")
+  @Operation(summary = "Get alert config")
   @PostMapping("/get")
   public RestResponse getAlertConfig(@RequestBody AlertConfigWithParams 
params) {
     AlertConfig alertConfig = alertConfigService.getById(params.getId());
     return RestResponse.success(AlertConfigWithParams.of(alertConfig));
   }
 
-  @ApiOperation(value = "List alert configs(Pagination)")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "pageSize",
-        value = "page size",
-        required = true,
-        example = "10",
-        dataTypeClass = Integer.class),
-    @ApiImplicitParam(
-        name = "pageNum",
-        value = "page num",
-        required = true,
-        example = "1",
-        dataTypeClass = Integer.class),
-    @ApiImplicitParam(
-        name = "sortField",
-        value = "sort field",
-        dataType = "string",
-        dataTypeClass = String.class),
-    @ApiImplicitParam(
-        name = "sortOrder",
-        value = "sort order",
-        dataType = "string",
-        dataTypeClass = String.class)
-  })
+  @Operation(summary = "List alert configs (Pagination)")
   @PostMapping(value = "/list")
-  public RestResponse listPageAlertConfigs(
+  public RestResponse alertConfigsPaginationList(
       @RequestBody AlertConfigWithParams params, RestRequest request) {
     IPage<AlertConfigWithParams> page = alertConfigService.page(params, 
request);
     return RestResponse.success(page);
   }
 
-  @ApiOperation(value = "List alert configs")
+  @Operation(summary = "List alert configs")
   @PostMapping(value = "/listWithOutPage")
-  public RestResponse listAlertConfigs() {
+  public RestResponse alertConfigsList() {
     List<AlertConfig> page = alertConfigService.list();
     return RestResponse.success(page);
   }
 
-  @ApiOperation(value = "Delete alert config")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "id",
-        value = "config id",
-        required = true,
-        paramType = "query",
-        dataTypeClass = Long.class)
-  })
+  @Operation(summary = "Delete alert config")
+  @Parameters({@Parameter(name = "id", required = true, description = "config 
id")})
   @DeleteMapping("/delete")
   public RestResponse deleteAlertConfig(
       @RequestParam("id") @NotNull(message = "config id must be not null") 
Long id) {
@@ -142,7 +111,7 @@ public class AlertController {
     return RestResponse.success(result);
   }
 
-  /** TODO after remove to unit test */
+  @Operation(summary = "Send alert config")
   @PostMapping("/send")
   public RestResponse sendAlert(Long id) throws AlertException {
     AlertTemplate alertTemplate = new AlertTemplate();
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationBuildPipelineController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationBuildPipelineController.java
index d2b560dac..69ca3b28a 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationBuildPipelineController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationBuildPipelineController.java
@@ -26,7 +26,6 @@ import 
org.apache.streampark.console.core.entity.AppBuildPipeline;
 import org.apache.streampark.console.core.entity.Application;
 import org.apache.streampark.console.core.entity.ApplicationLog;
 import org.apache.streampark.console.core.entity.FlinkEnv;
-import org.apache.streampark.console.core.enums.Operation;
 import org.apache.streampark.console.core.service.AppBuildPipeService;
 import org.apache.streampark.console.core.service.ApplicationLogService;
 import org.apache.streampark.console.core.service.ApplicationService;
@@ -37,10 +36,11 @@ import 
org.apache.streampark.flink.packer.pipeline.PipelineType;
 
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -53,7 +53,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
-@Api(tags = {"FLINK_APPLICATION_BUILD_PIPELINE_TAG"})
+@Tag(name = "FLINK_APPLICATION_BUILD_PIPELINE_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -77,28 +77,20 @@ public class ApplicationBuildPipelineController {
    * @param forceBuild forced start pipeline or not
    * @return Whether the pipeline was successfully started
    */
-  @ApiAccess
-  @ApiOperation(
-      value = "Release application",
-      notes = "Release application",
-      tags = ApiDocConstant.FLINK_APP_OP_TAG,
-      consumes = "application/x-www-form-urlencoded")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "appId",
-        value = "APP_ID",
-        required = true,
-        paramType = "query",
-        dataTypeClass = Long.class),
-    @ApiImplicitParam(
+  @Operation(
+      summary = "Release application",
+      tags = {ApiDocConstant.FLINK_APP_OP_TAG})
+  @Parameters({
+    @Parameter(name = "appId", description = "app id", required = true, 
example = "100000"),
+    @Parameter(
         name = "forceBuild",
-        value = "FORCE_BUILD",
+        description = "force build",
         required = true,
-        paramType = "query",
-        dataTypeClass = Boolean.class,
-        defaultValue = "false"),
+        example = "false",
+        schema = @Schema(defaultValue = "false", implementation = 
boolean.class))
   })
-  @PostMapping(value = "build", consumes = "application/x-www-form-urlencoded")
+  @ApiAccess
+  @PostMapping(value = "build")
   @RequiresPermissions("app:create")
   public RestResponse buildApplication(Long appId, boolean forceBuild) {
     try {
@@ -128,7 +120,8 @@ public class ApplicationBuildPipelineController {
       // you don't need to go through the build process)
 
       ApplicationLog applicationLog = new ApplicationLog();
-      applicationLog.setOptionName(Operation.RELEASE.getValue());
+      applicationLog.setOptionName(
+          
org.apache.streampark.console.core.enums.Operation.RELEASE.getValue());
       applicationLog.setAppId(app.getId());
       applicationLog.setOptionTime(new Date());
 
@@ -157,6 +150,7 @@ public class ApplicationBuildPipelineController {
    * @param appId application id
    * @return "pipeline" -> pipeline details, "docker" -> docker resolved 
snapshot
    */
+  @Operation(summary = "Get application release pipeline")
   @ApiAccess
   @PostMapping("/detail")
   @RequiresPermissions("app:view")
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationController.java
index 7884effe0..73ca135d1 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationController.java
@@ -39,10 +39,13 @@ import 
org.apache.streampark.flink.packer.pipeline.PipelineStatus;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -50,7 +53,6 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import springfox.documentation.annotations.ApiIgnore;
 
 import java.io.File;
 import java.io.IOException;
@@ -61,7 +63,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-@Api(tags = {"FLINK_APPLICATION_TAG"})
+@Tag(name = "FLINK_APPLICATION_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -76,6 +78,7 @@ public class ApplicationController {
 
   @Autowired private AppBuildPipeService appBuildPipeService;
 
+  @Operation(summary = "Get application")
   @ApiAccess
   @PostMapping("get")
   @RequiresPermissions("app:detail")
@@ -84,6 +87,7 @@ public class ApplicationController {
     return RestResponse.success(application);
   }
 
+  @Operation(summary = "Create application")
   @ApiAccess
   @PostMapping("create")
   @RequiresPermissions("app:create")
@@ -92,36 +96,27 @@ public class ApplicationController {
     return RestResponse.success(saved);
   }
 
-  @ApiAccess
-  @ApiOperation(
-      value = "Copy application from the exist app",
-      tags = ApiDocConstant.FLINK_APP_OP_TAG,
-      consumes = "application/x-www-form-urlencoded")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
+  @Operation(
+      summary = "Copy application",
+      tags = {ApiDocConstant.FLINK_APP_OP_TAG})
+  @Parameters({
+    @Parameter(
         name = "id",
-        value = "copy target app id",
+        description = "copied target app id",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Long.class),
-    @ApiImplicitParam(
+        example = "100000"),
+    @Parameter(
         name = "jobName",
-        value = "name of the copied application",
-        required = true,
-        paramType = "query",
-        dataTypeClass = String.class,
-        defaultValue = ""),
-    @ApiImplicitParam(
-        name = "args",
-        value = "commit parameters after copying",
-        required = false,
-        paramType = "query",
-        dataTypeClass = String.class,
-        defaultValue = "")
+        description = "new application name",
+        in = ParameterIn.QUERY,
+        example = "copy-app"),
+    @Parameter(name = "args", description = "new application args", in = 
ParameterIn.QUERY)
   })
-  @PostMapping(value = "copy", consumes = "application/x-www-form-urlencoded")
+  @ApiAccess
+  @PostMapping(value = "copy")
   @RequiresPermissions("app:copy")
-  public RestResponse copy(@ApiIgnore Application app) throws IOException {
+  public RestResponse copy(@Parameter(hidden = true) Application app) throws 
IOException {
     Long id = applicationService.copy(app);
     Map<String, String> data = new HashMap<>();
     data.put("id", Long.toString(id));
@@ -130,6 +125,7 @@ public class ApplicationController {
         : RestResponse.success(true).data(data);
   }
 
+  @Operation(summary = "Update application")
   @AppUpdated
   @PostMapping("update")
   @RequiresPermissions("app:update")
@@ -138,12 +134,14 @@ public class ApplicationController {
     return RestResponse.success(true);
   }
 
+  @Operation(summary = "Get applications dashboard data")
   @PostMapping("dashboard")
   public RestResponse dashboard(Long teamId) {
     Map<String, Serializable> map = applicationService.dashboard(teamId);
     return RestResponse.success(map);
   }
 
+  @Operation(summary = "List applications")
   @ApiAccess
   @PostMapping("list")
   @RequiresPermissions("app:view")
@@ -180,6 +178,7 @@ public class ApplicationController {
     return RestResponse.success(applicationList);
   }
 
+  @Operation(summary = "Mapping application")
   @AppUpdated
   @PostMapping("mapping")
   @RequiresPermissions("app:mapping")
@@ -188,6 +187,7 @@ public class ApplicationController {
     return RestResponse.success(flag);
   }
 
+  @Operation(summary = "Revoke application")
   @AppUpdated
   @PostMapping("revoke")
   @RequiresPermissions("app:release")
@@ -196,43 +196,40 @@ public class ApplicationController {
     return RestResponse.success();
   }
 
-  @ApiAccess
-  @ApiOperation(
-      value = "Start application",
-      tags = ApiDocConstant.FLINK_APP_OP_TAG,
-      consumes = "application/x-www-form-urlencoded")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
+  @Operation(
+      summary = "Start application",
+      tags = {ApiDocConstant.FLINK_APP_OP_TAG})
+  @Parameters({
+    @Parameter(
         name = "id",
-        value = "app Id",
+        description = "start app id",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Long.class),
-    @ApiImplicitParam(
+        example = "100000",
+        schema = @Schema(implementation = Long.class)),
+    @Parameter(
         name = "savePointed",
-        value = "restored app from the savepoint or latest checkpoint",
+        description = "restored app from the savepoint or latest checkpoint",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Boolean.class,
-        defaultValue = "false"),
-    @ApiImplicitParam(
+        example = "false",
+        schema = @Schema(implementation = boolean.class, defaultValue = 
"false")),
+    @Parameter(
         name = "savePoint",
-        value = "savepoint or checkpoint path",
-        required = true,
-        paramType = "query",
-        dataTypeClass = String.class,
-        defaultValue = ""),
-    @ApiImplicitParam(
+        description = "savepoint or checkpoint path",
+        in = ParameterIn.QUERY,
+        schema = @Schema(implementation = String.class)),
+    @Parameter(
         name = "allowNonRestored",
-        value = "ignore savepoint then cannot be restored",
-        required = true,
-        paramType = "query",
-        dataTypeClass = Boolean.class,
-        defaultValue = "false")
+        description = "ignore savepoint if cannot be restored",
+        in = ParameterIn.QUERY,
+        required = false,
+        schema = @Schema(implementation = boolean.class, defaultValue = 
"false"))
   })
-  @PostMapping(value = "start", consumes = "application/x-www-form-urlencoded")
+  @ApiAccess
+  @PostMapping(value = "start")
   @RequiresPermissions("app:start")
-  public RestResponse start(@ApiIgnore Application app) {
+  public RestResponse start(@Parameter(hidden = true) Application app) {
     try {
       applicationService.checkEnv(app);
       applicationService.start(app, false);
@@ -242,46 +239,46 @@ public class ApplicationController {
     }
   }
 
+  @Operation(
+      summary = "Cancel application",
+      tags = {ApiDocConstant.FLINK_APP_OP_TAG})
   @ApiAccess
-  @ApiOperation(
-      value = "Cancel application",
-      tags = ApiDocConstant.FLINK_APP_OP_TAG,
-      consumes = "application/x-www-form-urlencoded")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
+  @Parameters({
+    @Parameter(
         name = "id",
-        value = "app id",
+        description = "cancel app id",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Long.class),
-    @ApiImplicitParam(
+        example = "100000",
+        schema = @Schema(implementation = Long.class)),
+    @Parameter(
         name = "savePointed",
-        value = "whether trigger savepoint before taking stopping",
+        description = "trigger savepoint before taking stopping",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Boolean.class,
-        defaultValue = "false"),
-    @ApiImplicitParam(
+        schema = @Schema(implementation = boolean.class, defaultValue = 
"false")),
+    @Parameter(
         name = "savePoint",
-        value = "savepoint path",
-        paramType = "query",
-        dataTypeClass = String.class,
-        defaultValue = "hdfs:///tm/xxx"),
-    @ApiImplicitParam(
+        description = "savepoint path",
+        in = ParameterIn.QUERY,
+        example = "hdfs:///savepoint/100000",
+        schema = @Schema(implementation = String.class)),
+    @Parameter(
         name = "drain",
-        value = "send max watermark before canceling",
+        description = "send max watermark before canceling",
+        in = ParameterIn.QUERY,
         required = true,
-        paramType = "query",
-        dataTypeClass = Boolean.class,
-        defaultValue = "false")
+        example = "false",
+        schema = @Schema(implementation = boolean.class, defaultValue = 
"false"))
   })
-  @PostMapping(value = "cancel", consumes = 
"application/x-www-form-urlencoded")
+  @PostMapping(value = "cancel")
   @RequiresPermissions("app:cancel")
-  public RestResponse cancel(@ApiIgnore Application app) throws Exception {
+  public RestResponse cancel(@Parameter(hidden = true) Application app) throws 
Exception {
     applicationService.cancel(app);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Clean application")
   @AppUpdated
   @ApiAccess
   @PostMapping("clean")
@@ -292,6 +289,7 @@ public class ApplicationController {
   }
 
   /** force stop(stop normal start or in progress) */
+  @Operation(summary = "Force stop application")
   @PostMapping("forcedStop")
   @RequiresPermissions("app:cancel")
   public RestResponse forcedStop(Application app) {
@@ -299,54 +297,55 @@ public class ApplicationController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Get application on yarn proxy address")
   @PostMapping("yarn")
   public RestResponse yarn() {
     return RestResponse.success(YarnUtils.getRMWebAppProxyURL());
   }
 
+  @Operation(summary = "Get application on yarn name")
   @PostMapping("name")
   public RestResponse yarnName(Application app) {
     String yarnName = applicationService.getYarnName(app);
     return RestResponse.success(yarnName);
   }
 
+  @Operation(summary = "Check the application exist status")
   @PostMapping("checkName")
   public RestResponse checkName(Application app) {
     AppExistsState exists = applicationService.checkExists(app);
     return RestResponse.success(exists.get());
   }
 
+  @Operation(summary = "Get application conf")
   @PostMapping("readConf")
   public RestResponse readConf(Application app) throws IOException {
     String config = applicationService.readConf(app);
     return RestResponse.success(config);
   }
 
+  @Operation(summary = "Get application main-class")
   @PostMapping("main")
   public RestResponse getMain(Application application) {
     String mainClass = applicationService.getMain(application);
     return RestResponse.success(mainClass);
   }
 
+  @Operation(summary = "List application backups")
   @PostMapping("backups")
   public RestResponse backups(ApplicationBackUp backUp, RestRequest request) {
     IPage<ApplicationBackUp> backups = backUpService.page(backUp, request);
     return RestResponse.success(backups);
   }
 
-  @PostMapping("rollback")
-  public RestResponse rollback(ApplicationBackUp backUp) {
-    // TODO: next version implementation
-    // backUpService.rollback(backUp);
-    return RestResponse.success();
-  }
-
+  @Operation(summary = "List application operation logs")
   @PostMapping("optionlog")
   public RestResponse optionlog(ApplicationLog applicationLog, RestRequest 
request) {
     IPage<ApplicationLog> applicationList = 
applicationLogService.page(applicationLog, request);
     return RestResponse.success(applicationList);
   }
 
+  @Operation(summary = "Delete application operation log")
   @PostMapping("deleteOperationLog")
   @RequiresPermissions("app:delete")
   public RestResponse deleteOperationLog(ApplicationLog applicationLog) {
@@ -354,6 +353,7 @@ public class ApplicationController {
     return RestResponse.success(deleted);
   }
 
+  @Operation(summary = "Delete application")
   @PostMapping("delete")
   @RequiresPermissions("app:delete")
   public RestResponse delete(Application app) throws InternalException {
@@ -361,12 +361,14 @@ public class ApplicationController {
     return RestResponse.success(deleted);
   }
 
+  @Operation(summary = "Backup application when deleted")
   @PostMapping("deletebak")
   public RestResponse deleteBak(ApplicationBackUp backUp) throws 
InternalException {
     Boolean deleted = backUpService.delete(backUp.getId());
     return RestResponse.success(deleted);
   }
 
+  @Operation(summary = "Check the application jar")
   @PostMapping("checkjar")
   public RestResponse checkjar(String jar) {
     File file = new File(jar);
@@ -378,6 +380,7 @@ public class ApplicationController {
     }
   }
 
+  @Operation(summary = "Upload the application jar")
   @PostMapping("upload")
   @RequiresPermissions("app:create")
   public RestResponse upload(MultipartFile file) throws Exception {
@@ -385,6 +388,7 @@ public class ApplicationController {
     return RestResponse.success(uploadPath);
   }
 
+  @Hidden
   @PostMapping("verifySchema")
   public RestResponse verifySchema(String path) {
     final URI uri = URI.create(path);
@@ -407,6 +411,7 @@ public class ApplicationController {
     return restResponse;
   }
 
+  @Operation(summary = "Check the application savepoint path")
   @PostMapping("checkSavepointPath")
   public RestResponse checkSavepointPath(Application app) throws Exception {
     String error = applicationService.checkSavepointPath(app);
@@ -417,11 +422,26 @@ public class ApplicationController {
     }
   }
 
-  @ApiOperation(value = "Read flink on k8s deploy log")
-  @ApiImplicitParams({
-    @ApiImplicitParam(name = "id", value = "app id"),
-    @ApiImplicitParam(name = "offset", value = "number of log lines offset"),
-    @ApiImplicitParam(name = "limit", value = "number of log lines loaded at 
once")
+  @Operation(summary = "Get application on k8s deploy logs")
+  @Parameters({
+    @Parameter(
+        name = "id",
+        description = "app id",
+        required = true,
+        example = "100000",
+        schema = @Schema(implementation = Long.class)),
+    @Parameter(
+        name = "offset",
+        description = "number of log lines offset",
+        required = true,
+        example = "0",
+        schema = @Schema(implementation = int.class)),
+    @Parameter(
+        name = "limit",
+        description = "number of log lines loaded at once",
+        required = true,
+        example = "100",
+        schema = @Schema(implementation = int.class)),
   })
   @PostMapping(value = "k8sStartLog")
   public RestResponse k8sStartLog(Long id, Integer offset, Integer limit) 
throws Exception {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationHistoryController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationHistoryController.java
index 15b9e3d5b..2ba542336 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationHistoryController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ApplicationHistoryController.java
@@ -23,7 +23,8 @@ import 
org.apache.streampark.console.core.service.ApplicationService;
 
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
-import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -34,9 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.ArrayList;
 import java.util.List;
 
-@Api(
-    tags = "[flink history] related operations",
-    consumes = "Content-Type=application/x-www-form-urlencoded")
+@Tag(name = "FLINK_APPLICATION_HISTORY_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -45,6 +44,7 @@ public class ApplicationHistoryController {
 
   @Autowired private ApplicationService applicationService;
 
+  @Operation(summary = "List the upload jar history records")
   @PostMapping("uploadJars")
   @RequiresPermissions("app:create")
   public RestResponse listUploadJars() {
@@ -52,6 +52,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(jars);
   }
 
+  @Operation(summary = "List the k8s namespace history records")
   @PostMapping("k8sNamespaces")
   @RequiresPermissions("app:create")
   public RestResponse listK8sNamespace() {
@@ -59,6 +60,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(namespaces);
   }
 
+  @Operation(summary = "List the session cluster history records")
   @PostMapping("sessionClusterIds")
   @RequiresPermissions("app:create")
   public RestResponse listSessionClusterId(int executionMode) {
@@ -76,6 +78,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(clusterIds);
   }
 
+  @Operation(summary = "List the flink base image history records")
   @PostMapping("flinkBaseImages")
   @RequiresPermissions("app:create")
   public RestResponse listFlinkBaseImage() {
@@ -83,6 +86,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(images);
   }
 
+  @Operation(summary = "List the flink pod template history records")
   @PostMapping("flinkPodTemplates")
   @RequiresPermissions("app:create")
   public RestResponse listPodTemplate() {
@@ -90,6 +94,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(templates);
   }
 
+  @Operation(summary = "List the flink JM pod template history records")
   @PostMapping("flinkJmPodTemplates")
   @RequiresPermissions("app:create")
   public RestResponse listJmPodTemplate() {
@@ -97,6 +102,7 @@ public class ApplicationHistoryController {
     return RestResponse.success(templates);
   }
 
+  @Operation(summary = "List the flink TM pod template history records")
   @PostMapping("flinkTmPodTemplates")
   @RequiresPermissions("app:create")
   public RestResponse listTmPodTemplate() {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ConfigController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ConfigController.java
index a31647921..ba4d59e15 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ConfigController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ConfigController.java
@@ -28,6 +28,8 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -38,6 +40,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 import java.util.Map;
 
+@Tag(name = "CONFIG_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -46,30 +49,35 @@ public class ConfigController {
 
   @Autowired private ApplicationConfigService applicationConfigService;
 
+  @Operation(summary = "Get config")
   @PostMapping("get")
   public RestResponse get(Long id) {
     ApplicationConfig config = applicationConfigService.get(id);
     return RestResponse.success(config);
   }
 
+  @Operation(summary = "Get the flink application conf-template")
   @PostMapping("template")
   public RestResponse template() {
     String config = applicationConfigService.readTemplate();
     return RestResponse.success(config);
   }
 
+  @Operation(summary = "List the application configs")
   @PostMapping("list")
   public RestResponse list(ApplicationConfig config, RestRequest request) {
     IPage<ApplicationConfig> page = applicationConfigService.page(config, 
request);
     return RestResponse.success(page);
   }
 
+  @Operation(summary = "List application config histories")
   @PostMapping("history")
   public RestResponse history(Application application) {
     List<ApplicationConfig> history = 
applicationConfigService.history(application);
     return RestResponse.success(history);
   }
 
+  @Operation(summary = "Delete config")
   @PostMapping("delete")
   @RequiresPermissions("conf:delete")
   public RestResponse delete(Long id) {
@@ -77,6 +85,7 @@ public class ConfigController {
     return RestResponse.success(deleted);
   }
 
+  @Operation(summary = "Get system hadoop configs")
   @PostMapping("sysHadoopConf")
   @RequiresPermissions("app:create")
   public RestResponse getSystemHadoopConfig() {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ExternalLinkController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ExternalLinkController.java
index 11c75a87a..db1f8ec5c 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ExternalLinkController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ExternalLinkController.java
@@ -24,10 +24,10 @@ import 
org.apache.streampark.console.core.service.ExternalLinkService;
 
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -42,7 +42,7 @@ import javax.validation.constraints.NotNull;
 
 import java.util.List;
 
-@Api(tags = {"FLINK_EXTERNAL_LINK_TAG"})
+@Tag(name = "FLINK_EXTERNAL_LINK_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -51,7 +51,7 @@ public class ExternalLinkController {
 
   @Autowired private ExternalLinkService externalLinkService;
 
-  @ApiOperation(value = "List externalLink")
+  @Operation(summary = "List external link")
   @PostMapping("/list")
   @RequiresPermissions("externalLink:view")
   public RestResponse list() {
@@ -59,15 +59,10 @@ public class ExternalLinkController {
     return RestResponse.success(externalLink);
   }
 
-  @ApiOperation(value = "Render externalLink by appId")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "appId",
-        value = "application id",
-        required = true,
-        paramType = "query",
-        dataTypeClass = Long.class)
-  })
+  @Operation(
+      summary = "Get the application external links",
+      description = "Render external link by app id")
+  @Parameters({@Parameter(name = "appId", required = true, example = 
"100000")})
   @PostMapping("/render")
   public RestResponse render(
       @NotNull(message = "The flink app id cannot be null") 
@RequestParam("appId") Long appId) {
@@ -75,7 +70,7 @@ public class ExternalLinkController {
     return RestResponse.success(renderedExternalLink);
   }
 
-  @ApiOperation(value = "Create externalLink")
+  @Operation(summary = "Create external link")
   @PostMapping("/create")
   @RequiresPermissions("externalLink:create")
   public RestResponse create(@Valid ExternalLink externalLink) {
@@ -83,7 +78,7 @@ public class ExternalLinkController {
     return RestResponse.success();
   }
 
-  @ApiOperation(value = "Update externalLink")
+  @Operation(summary = "Update external link")
   @PostMapping("/update")
   @RequiresPermissions("externalLink:update")
   public RestResponse update(@Valid ExternalLink externalLink) {
@@ -92,15 +87,8 @@ public class ExternalLinkController {
     return RestResponse.success();
   }
 
-  @ApiOperation(value = "Delete externalLink")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "id",
-        value = "external link id",
-        required = true,
-        paramType = "query",
-        dataTypeClass = Long.class)
-  })
+  @Operation(summary = "Delete external link")
+  @Parameters({@Parameter(name = "appId", required = true, example = 
"100000")})
   @DeleteMapping("/delete")
   @RequiresPermissions("externalLink:delete")
   public RestResponse delete(
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkClusterController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkClusterController.java
index 9465cad5f..148cd554b 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkClusterController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkClusterController.java
@@ -25,6 +25,8 @@ import 
org.apache.streampark.console.core.service.FlinkClusterService;
 
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -34,6 +36,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
+@Tag(name = "FLINK_CLUSTER_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -42,24 +45,28 @@ public class FlinkClusterController {
 
   @Autowired private FlinkClusterService flinkClusterService;
 
+  @Operation(summary = "List flink clusters")
   @PostMapping("list")
   public RestResponse list() {
     List<FlinkCluster> flinkClusters = flinkClusterService.list();
     return RestResponse.success(flinkClusters);
   }
 
+  @Operation(summary = "Get flink cluster remote address")
   @PostMapping("remoteUrl")
   public RestResponse remoteUrl(Long id) {
     FlinkCluster cluster = flinkClusterService.getById(id);
     return RestResponse.success(cluster.getAddress());
   }
 
+  @Operation(summary = "Check the cluster status")
   @PostMapping("check")
   public RestResponse check(FlinkCluster cluster) {
     ResponseResult checkResult = flinkClusterService.check(cluster);
     return RestResponse.success(checkResult);
   }
 
+  @Operation(summary = "Create flink cluster")
   @PostMapping("create")
   @RequiresPermissions("cluster:create")
   public RestResponse create(FlinkCluster cluster) {
@@ -67,6 +74,7 @@ public class FlinkClusterController {
     return RestResponse.success(success);
   }
 
+  @Operation(summary = "Update flink cluster")
   @PostMapping("update")
   @RequiresPermissions("cluster:update")
   public RestResponse update(FlinkCluster cluster) {
@@ -74,24 +82,28 @@ public class FlinkClusterController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Get flink cluster")
   @PostMapping("get")
   public RestResponse get(Long id) throws InternalException {
     FlinkCluster cluster = flinkClusterService.getById(id);
     return RestResponse.success(cluster);
   }
 
+  @Operation(summary = "Start flink cluster")
   @PostMapping("start")
   public RestResponse start(FlinkCluster cluster) {
     flinkClusterService.start(cluster);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Shutdown flink cluster")
   @PostMapping("shutdown")
   public RestResponse shutdown(FlinkCluster cluster) {
     flinkClusterService.shutdown(cluster);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Delete flink cluster")
   @PostMapping("delete")
   public RestResponse delete(FlinkCluster cluster) {
     flinkClusterService.delete(cluster);
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkEnvController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkEnvController.java
index b87255b29..1eab993cc 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkEnvController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkEnvController.java
@@ -22,6 +22,8 @@ import 
org.apache.streampark.console.base.exception.ApiDetailException;
 import org.apache.streampark.console.core.entity.FlinkEnv;
 import org.apache.streampark.console.core.service.FlinkEnvService;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -31,6 +33,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
+@Tag(name = "FLINK_ENV_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -39,18 +42,21 @@ public class FlinkEnvController {
 
   @Autowired private FlinkEnvService flinkEnvService;
 
+  @Operation(summary = "Get flink environment")
   @PostMapping("list")
   public RestResponse list() {
     List<FlinkEnv> list = flinkEnvService.list();
     return RestResponse.success(list);
   }
 
+  @Operation(summary = "Verify flink environment")
   @PostMapping("check")
   public RestResponse check(FlinkEnv version) {
     Integer checkResp = flinkEnvService.check(version);
     return RestResponse.success(checkResp);
   }
 
+  @Operation(summary = "Create flink environment")
   @PostMapping("create")
   public RestResponse create(FlinkEnv version) {
     try {
@@ -61,6 +67,7 @@ public class FlinkEnvController {
     return RestResponse.success(true);
   }
 
+  @Operation(summary = "Get flink environment")
   @PostMapping("get")
   public RestResponse get(Long id) throws Exception {
     FlinkEnv flinkEnv = flinkEnvService.getById(id);
@@ -68,12 +75,14 @@ public class FlinkEnvController {
     return RestResponse.success(flinkEnv);
   }
 
+  @Operation(summary = "Sync flink environment conf")
   @PostMapping("sync")
   public RestResponse sync(Long id) throws Exception {
     flinkEnvService.syncConf(id);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update flink environment")
   @PostMapping("update")
   public RestResponse update(FlinkEnv version) throws Exception {
     try {
@@ -84,12 +93,14 @@ public class FlinkEnvController {
     return RestResponse.success(true);
   }
 
+  @Operation(summary = "Delete flink environment")
   @PostMapping("delete")
   public RestResponse delete(Long id) {
     flinkEnvService.delete(id);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update flink environment as default")
   @PostMapping("default")
   public RestResponse setDefault(Long id) {
     flinkEnvService.setDefault(id);
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkPodTemplateController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkPodTemplateController.java
index 66f311b51..034a08c29 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkPodTemplateController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkPodTemplateController.java
@@ -23,6 +23,8 @@ import 
org.apache.streampark.flink.kubernetes.PodTemplateParser;
 
 import org.apache.commons.lang3.StringUtils;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -35,12 +37,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+@Tag(name = "FLINK_POD_TEMPLATE_TAG")
 @Slf4j
 @Validated
 @RestController
 @RequestMapping("flink/podtmpl")
 public class FlinkPodTemplateController {
 
+  @Operation(summary = "Get system hosts")
   @PostMapping("sysHosts")
   public RestResponse getHosts() {
     // hostname -> ipv4
@@ -52,12 +56,14 @@ public class FlinkPodTemplateController {
     return RestResponse.success(friendlyHosts);
   }
 
+  @Operation(summary = "Get initial pod template")
   @PostMapping("init")
   public RestResponse getInitContent() {
     return RestResponse.success(PodTemplateParser.getInitPodTemplateContent());
   }
 
   /** @param hosts hostname:ipv4,hostname:ipv4,hostname:ipv4... */
+  @Operation(summary = "Get pod template of complete host-alias")
   @PostMapping("compHostAlias")
   public RestResponse completeHostAlias(String hosts, String podTemplate) {
     Map<String, String> hostMap = covertHostsParamToMap(hosts);
@@ -82,6 +88,7 @@ public class FlinkPodTemplateController {
     }
   }
 
+  @Operation(summary = "Extract host-alias from pod template")
   @PostMapping("extractHostAlias")
   public RestResponse extractHostAlias(String podTemplate) {
     Map<String, String> hosts = 
PodTemplateParser.extractHostAliasMap(podTemplate);
@@ -93,6 +100,7 @@ public class FlinkPodTemplateController {
   }
 
   /** @param hosts hostname:ipv4,hostname:ipv4,hostname:ipv4... */
+  @Operation(summary = "Preview pod template with host-alias")
   @PostMapping("previewHostAlias")
   public RestResponse previewHostAlias(String hosts) {
     Map<String, String> hostMap = covertHostsParamToMap(hosts);
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
index b427ac0f9..2fad82e5b 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
@@ -30,7 +30,8 @@ import 
org.apache.streampark.flink.core.FlinkSqlValidationResult;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -42,9 +43,7 @@ import javax.validation.constraints.NotNull;
 
 import java.util.List;
 
-@Api(
-    tags = "[flink sql] related operations",
-    consumes = "Content-Type=application/x-www-form-urlencoded")
+@Tag(name = "FLINK_SQL_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -57,6 +56,7 @@ public class FlinkSqlController {
 
   @Autowired private SqlCompleteService sqlComplete;
 
+  @Operation(summary = "Verify sql")
   @PostMapping("verify")
   public RestResponse verify(String sql, Long versionId, Long teamId) {
     sql = variableService.replaceVariable(teamId, sql);
@@ -83,12 +83,14 @@ public class FlinkSqlController {
     }
   }
 
+  @Operation(summary = "List the application sql")
   @PostMapping("list")
   public RestResponse list(Long appId, RestRequest request) {
     IPage<FlinkSql> page = flinkSqlService.page(appId, request);
     return RestResponse.success(page);
   }
 
+  @Operation(summary = "Delete sql")
   @PostMapping("delete")
   @RequiresPermissions("sql:delete")
   public RestResponse delete(Long id) {
@@ -96,6 +98,7 @@ public class FlinkSqlController {
     return RestResponse.success(deleted);
   }
 
+  @Operation(summary = "List sql by ids")
   @PostMapping("get")
   public RestResponse get(String id) throws InternalException {
     String[] array = id.split(",");
@@ -109,12 +112,14 @@ public class FlinkSqlController {
     return RestResponse.success(new FlinkSql[] {flinkSql1, flinkSql2});
   }
 
+  @Operation(summary = "List the applications sql histories")
   @PostMapping("history")
   public RestResponse sqlhistory(Application application) {
     List<FlinkSql> sqlList = flinkSqlService.history(application);
     return RestResponse.success(sqlList);
   }
 
+  @Operation(summary = "Get the complete sql")
   @PostMapping("sqlComplete")
   public RestResponse getSqlComplete(@NotNull(message = "{required}") String 
sql) {
     return RestResponse.success().put("word", sqlComplete.getComplete(sql));
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/IndexController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/IndexController.java
index 950a4d130..ca3ddf6d1 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/IndexController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/IndexController.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.console.core.controller;
 
+import io.swagger.v3.oas.annotations.Hidden;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,6 +27,7 @@ import org.springframework.web.servlet.ModelAndView;
 @Controller
 public class IndexController {
 
+  @Hidden
   @GetMapping("/")
   public ModelAndView index() {
     return new ModelAndView("/index.html");
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/MessageController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/MessageController.java
index f13fe254c..87d763783 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/MessageController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/MessageController.java
@@ -24,6 +24,8 @@ import org.apache.streampark.console.core.enums.NoticeType;
 import org.apache.streampark.console.core.service.MessageService;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -31,6 +33,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+@Tag(name = "MESSAGE_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -39,6 +42,7 @@ public class MessageController {
 
   @Autowired private MessageService messageService;
 
+  @Operation(summary = "List notices")
   @PostMapping("notice")
   public RestResponse notice(Integer type, RestRequest request) {
     NoticeType noticeType = NoticeType.of(type);
@@ -46,6 +50,7 @@ public class MessageController {
     return RestResponse.success(pages);
   }
 
+  @Operation(summary = "Delete notice")
   @PostMapping("delnotice")
   public RestResponse delNotice(Long id) {
     return RestResponse.success(messageService.removeById(id));
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProjectController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProjectController.java
index 8ad1ae081..859261933 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProjectController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProjectController.java
@@ -28,6 +28,8 @@ import 
org.apache.streampark.console.core.service.ProjectService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -40,6 +42,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+@Tag(name = "PROJECT_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -48,6 +51,7 @@ public class ProjectController {
 
   @Autowired private ProjectService projectService;
 
+  @Operation(summary = "Create project")
   @PostMapping("create")
   @RequiresPermissions("project:create")
   public RestResponse create(Project project) {
@@ -56,6 +60,7 @@ public class ProjectController {
     return projectService.create(project);
   }
 
+  @Operation(summary = "Update project")
   @AppUpdated
   @PostMapping("update")
   @RequiresPermissions("project:update")
@@ -64,11 +69,13 @@ public class ProjectController {
     return RestResponse.success().data(update);
   }
 
+  @Operation(summary = "Get project")
   @PostMapping("get")
   public RestResponse get(Long id) {
     return RestResponse.success().data(projectService.getById(id));
   }
 
+  @Operation(summary = "Build project")
   @PostMapping("build")
   @RequiresPermissions("project:build")
   public RestResponse build(Long id) throws Exception {
@@ -76,6 +83,7 @@ public class ProjectController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Get project build logs")
   @PostMapping("buildlog")
   @RequiresPermissions("project:build")
   public RestResponse buildLog(
@@ -83,6 +91,7 @@ public class ProjectController {
     return projectService.getBuildLog(id, startOffset);
   }
 
+  @Operation(summary = "List projects")
   @PostMapping("list")
   @RequiresPermissions("project:view")
   public RestResponse list(Project project, RestRequest restRequest) {
@@ -93,12 +102,14 @@ public class ProjectController {
     return RestResponse.success().data(page);
   }
 
+  @Operation(summary = "List git project branches")
   @PostMapping("branches")
   public RestResponse branches(Project project) {
     List<String> branches = project.getAllBranches();
     return RestResponse.success().data(branches);
   }
 
+  @Operation(summary = "Delete project")
   @PostMapping("delete")
   @RequiresPermissions("project:delete")
   public RestResponse delete(Long id) {
@@ -106,36 +117,42 @@ public class ProjectController {
     return RestResponse.success().data(deleted);
   }
 
+  @Operation(summary = "Authenticate git project")
   @PostMapping("gitcheck")
   public RestResponse gitCheck(Project project) {
     GitAuthorizedError error = project.gitCheck();
     return RestResponse.success().data(error.getType());
   }
 
+  @Operation(summary = "Check the project")
   @PostMapping("exists")
   public RestResponse exists(Project project) {
     boolean exists = projectService.checkExists(project);
     return RestResponse.success().data(exists);
   }
 
+  @Operation(summary = "List project modules")
   @PostMapping("modules")
   public RestResponse modules(Long id) {
     List<String> result = projectService.modules(id);
     return RestResponse.success().data(result);
   }
 
+  @Operation(summary = "List project jars")
   @PostMapping("jars")
   public RestResponse jars(Project project) {
     List<String> result = projectService.jars(project);
     return RestResponse.success().data(result);
   }
 
+  @Operation(summary = "List project configurations")
   @PostMapping("listconf")
   public RestResponse listConf(Project project) {
     List<Map<String, Object>> list = projectService.listConf(project);
     return RestResponse.success().data(list);
   }
 
+  @Operation(summary = "List the team projects")
   @PostMapping("select")
   public RestResponse select(@RequestParam Long teamId) {
     List<Project> list = projectService.findByTeamId(teamId);
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
index 7ba61296c..b5d69dde1 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
@@ -29,9 +29,11 @@ import 
org.apache.streampark.console.core.service.SavePointService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -41,6 +43,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Nullable;
 
+@Tag(name = "SAVEPOINT_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -51,18 +54,21 @@ public class SavePointController {
 
   @Autowired private SavePointService savePointService;
 
+  @Operation(summary = "Get application savepoint latest")
   @PostMapping("latest")
   public RestResponse latest(Long appId) {
     SavePoint savePoint = savePointService.getLatest(appId);
     return RestResponse.success(savePoint);
   }
 
+  @Operation(summary = "List application savepoint histories")
   @PostMapping("history")
   public RestResponse history(SavePoint savePoint, RestRequest request) {
     IPage<SavePoint> page = savePointService.page(savePoint, request);
     return RestResponse.success(page);
   }
 
+  @Operation(summary = "Delete savepoint")
   @PostMapping("delete")
   @RequiresPermissions("savepoint:delete")
   public RestResponse delete(Long id) throws InternalException {
@@ -72,21 +78,22 @@ public class SavePointController {
     return RestResponse.success(deleted);
   }
 
-  @ApiAccess
-  @ApiOperation(value = "Trigger savepoint for specified application by id.")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
+  @Operation(
+      summary = "Trigger savepoint",
+      description = "trigger savepoint for specified application")
+  @Parameters({
+    @Parameter(
         name = "appId",
-        value = "application id",
+        description = "app id",
         required = true,
-        paramType = "query",
-        dataTypeClass = Long.class),
-    @ApiImplicitParam(
+        example = "100000",
+        schema = @Schema(implementation = Long.class)),
+    @Parameter(
         name = "savepointPath",
-        value = "specified savepoint path",
-        paramType = "query",
-        dataTypeClass = String.class)
+        description = "specified savepoint path",
+        schema = @Schema(implementation = String.class))
   })
+  @ApiAccess
   @PostMapping("trigger")
   @RequiresPermissions("savepoint:trigger")
   public RestResponse trigger(Long appId, @Nullable String savepointPath) {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
index 06aa1aeac..5fb9cd14d 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
@@ -25,6 +25,8 @@ import 
org.apache.streampark.console.core.service.SettingService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -34,6 +36,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
+@Tag(name = "SETTING_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -42,6 +45,7 @@ public class SettingController {
 
   @Autowired private SettingService settingService;
 
+  @Operation(summary = "List settings")
   @PostMapping("all")
   @RequiresPermissions("setting:view")
   public RestResponse all() {
@@ -51,18 +55,21 @@ public class SettingController {
     return RestResponse.success(setting);
   }
 
+  @Operation(summary = "Get setting")
   @PostMapping("get")
   public RestResponse get(String key) {
     Setting setting = settingService.get(key);
     return RestResponse.success(setting);
   }
 
+  @Operation(summary = "Get streampark address")
   @PostMapping("weburl")
   public RestResponse webUrl() {
     String url = settingService.getStreamParkAddress();
     return RestResponse.success(url == null ? null : url.trim());
   }
 
+  @Operation(summary = "Update setting")
   @PostMapping("update")
   @RequiresPermissions("setting:update")
   public RestResponse update(Setting setting) {
@@ -70,6 +77,7 @@ public class SettingController {
     return RestResponse.success(updated);
   }
 
+  @Operation(summary = "Check hadoop status")
   @PostMapping("checkHadoop")
   public RestResponse checkHadoop() {
     try {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/VariableController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/VariableController.java
index 9017243ff..b57b4c4b8 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/VariableController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/VariableController.java
@@ -26,6 +26,8 @@ import 
org.apache.streampark.console.core.service.VariableService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -41,6 +43,7 @@ import javax.validation.constraints.NotBlank;
 
 import java.util.List;
 
+@Tag(name = "VARIABLE_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -56,6 +59,7 @@ public class VariableController {
    * @param variable
    * @return
    */
+  @Operation(summary = "List variables")
   @PostMapping("page")
   @RequiresPermissions("variable:view")
   public RestResponse page(RestRequest restRequest, Variable variable) {
@@ -73,6 +77,7 @@ public class VariableController {
    * @param keyword Fuzzy search keywords through variable code or 
description, Nullable.
    * @return
    */
+  @Operation(summary = "List variables")
   @PostMapping("list")
   public RestResponse variableList(@RequestParam Long teamId, String keyword) {
     List<Variable> variableList = variableService.findByTeamId(teamId, 
keyword);
@@ -82,6 +87,7 @@ public class VariableController {
     return RestResponse.success(variableList);
   }
 
+  @Operation(summary = "List the variable depend applications")
   @PostMapping("dependApps")
   @RequiresPermissions("variable:depend_apps")
   public RestResponse dependApps(RestRequest restRequest, Variable variable) {
@@ -89,6 +95,7 @@ public class VariableController {
     return RestResponse.success(dependApps);
   }
 
+  @Operation(summary = "Create variable")
   @PostMapping("post")
   @RequiresPermissions("variable:add")
   public RestResponse addVariable(@Valid Variable variable) {
@@ -96,6 +103,7 @@ public class VariableController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update variable")
   @PutMapping("update")
   @RequiresPermissions("variable:update")
   public RestResponse updateVariable(@Valid Variable variable) {
@@ -103,6 +111,7 @@ public class VariableController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Get variable")
   @PostMapping("showOriginal")
   @RequiresPermissions("variable:show_original")
   public RestResponse showOriginal(@RequestParam Long id) {
@@ -110,6 +119,7 @@ public class VariableController {
     return RestResponse.success(v);
   }
 
+  @Operation(summary = "Delete variable")
   @DeleteMapping("delete")
   @RequiresPermissions("variable:delete")
   public RestResponse deleteVariable(@Valid Variable variable) {
@@ -117,6 +127,7 @@ public class VariableController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Check variable code")
   @PostMapping("check/code")
   public RestResponse checkVariableCode(
       @RequestParam Long teamId, @NotBlank(message = "{required}") String 
variableCode) {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/YarnQueueController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/YarnQueueController.java
index 694b3a833..4f05dd404 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/YarnQueueController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/YarnQueueController.java
@@ -26,16 +26,17 @@ import 
org.apache.streampark.console.core.service.YarnQueueService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+@Tag(name = "YARN_QUEUE_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -51,6 +52,7 @@ public class YarnQueueController {
    * @param yarnQueue optional fields used to search.
    * @return RestResponse with IPage<{@link YarnQueue}> object.
    */
+  @Operation(summary = "List yarn queues")
   @ApiAccess
   @PostMapping("list")
   public RestResponse list(RestRequest restRequest, YarnQueue yarnQueue) {
@@ -58,67 +60,37 @@ public class YarnQueueController {
     return RestResponse.success(queuePage);
   }
 
+  @Operation(summary = "Check yarn queue valid")
   @ApiAccess
-  @ApiOperation(value = "Check the yarn queue whether is valid.")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "yarnQueue",
-        value = "yarn queue",
-        required = true,
-        paramType = "body",
-        dataTypeClass = Long.class)
-  })
   @PostMapping("check")
-  public RestResponse check(YarnQueue yarnQueue) {
+  public RestResponse check(@RequestBody YarnQueue yarnQueue) {
     return RestResponse.success(yarnQueueService.checkYarnQueue(yarnQueue));
   }
 
+  @Operation(summary = "Create yarn queue")
   @ApiAccess
-  @ApiOperation(value = "Create a new yarn queue.")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "yarnQueue",
-        value = "yarn queue",
-        required = true,
-        paramType = "body",
-        dataTypeClass = Long.class)
-  })
   @PostMapping("create")
   @RequiresPermissions("yarnQueue:create")
-  public RestResponse create(YarnQueue yarnQueue) {
+  public RestResponse create(@RequestBody YarnQueue yarnQueue) {
     return RestResponse.success(yarnQueueService.createYarnQueue(yarnQueue));
   }
 
+  @Operation(summary = "Update yarn queue")
   @ApiAccess
-  @ApiOperation(value = "Update the yarn queue.")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "yarnQueue",
-        value = "yarn queue",
-        required = true,
-        paramType = "body",
-        dataTypeClass = Long.class)
-  })
   @PostMapping("update")
   @RequiresPermissions("yarnQueue:update")
-  public RestResponse update(YarnQueue yarnQueue) {
+  public RestResponse update(@RequestBody YarnQueue yarnQueue) {
     yarnQueueService.updateYarnQueue(yarnQueue);
     return RestResponse.success();
   }
 
+  @Operation(
+      summary = "Delete yarn queue",
+      description = "delete by (team id & yarn queue) or yarn queue id")
   @ApiAccess
-  @ApiOperation(value = "Delete a yarn queue by (team id & yarn queue) or yarn 
queue id.")
-  @ApiImplicitParams({
-    @ApiImplicitParam(
-        name = "yarnQueue",
-        value = "Yarn Queue json value",
-        required = true,
-        paramType = "body",
-        dataTypeClass = YarnQueue.class)
-  })
   @PostMapping("delete")
   @RequiresPermissions("yarnQueue:delete")
-  public RestResponse delete(YarnQueue yarnQueue) {
+  public RestResponse delete(@RequestBody YarnQueue yarnQueue) {
     yarnQueueService.deleteYarnQueue(yarnQueue);
     return RestResponse.success();
   }
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroConfig.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroConfig.java
index ae37ef038..3384723ae 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroConfig.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroConfig.java
@@ -45,11 +45,10 @@ public class ShiroConfig {
     filterChainDefinitionMap.put("/actuator/**", "anon");
 
     filterChainDefinitionMap.put("/doc.html", "anon");
+    filterChainDefinitionMap.put("/swagger-ui.html", "anon");
     filterChainDefinitionMap.put("/swagger-ui/**", "anon");
-    filterChainDefinitionMap.put("/swagger-resources", "anon");
-    filterChainDefinitionMap.put("/swagger-resources/configuration/security", 
"anon");
-    filterChainDefinitionMap.put("/swagger-resources/configuration/ui", 
"anon");
-    filterChainDefinitionMap.put("/v3/api-docs", "anon");
+    filterChainDefinitionMap.put("/swagger-resources/**", "anon");
+    filterChainDefinitionMap.put("/v3/api-docs/**", "anon");
     filterChainDefinitionMap.put("/webjars/**", "anon");
 
     filterChainDefinitionMap.put("/passport/**", "anon");
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/AccessTokenController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/AccessTokenController.java
index d2cef3a16..09dd0b55c 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/AccessTokenController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/AccessTokenController.java
@@ -29,15 +29,23 @@ import 
org.apache.streampark.console.system.service.AccessTokenService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
+@Tag(name = "ACCESS_TOKEN_TAG")
 @RestController
 @RequestMapping("token")
 public class AccessTokenController {
@@ -47,16 +55,38 @@ public class AccessTokenController {
   @Autowired private CommonService commonService;
 
   /** generate token string */
+  @Operation(summary = "Create token")
+  @Parameters({
+    @Parameter(
+        name = "userId",
+        description = "user id",
+        required = true,
+        example = "100000",
+        schema = @Schema(implementation = Long.class)),
+    @Parameter(
+        name = "expireTime",
+        description = "token expire time, yyyy-MM-dd HH:mm:ss",
+        required = true,
+        example = "9999-01-01 00:00:00",
+        schema = @Schema(implementation = String.class)),
+    @Parameter(
+        name = "description",
+        description = "token description",
+        schema = @Schema(implementation = String.class))
+  })
   @PostMapping(value = "create")
   @RequiresPermissions("token:add")
   public RestResponse createToken(
-      @NotBlank(message = "{required}") Long userId, String expireTime, String 
description)
+      @NotBlank(message = "{required}") Long userId,
+      String expireTime,
+      @RequestParam(required = false) String description)
       throws InternalException {
     return accessTokenService.generateToken(userId, expireTime, description);
   }
 
+  @Operation(summary = "Verify current user token")
   @PostMapping(value = "check")
-  public RestResponse checkToken() {
+  public RestResponse verifyToken() {
     Long userId = commonService.getUserId();
     RestResponse restResponse = RestResponse.success();
     if (userId != null) {
@@ -75,14 +105,32 @@ public class AccessTokenController {
   }
 
   /** query token list */
+  @Operation(summary = "List tokens")
+  @Parameters({
+    @Parameter(
+        name = "userId",
+        in = ParameterIn.QUERY,
+        description = "user id",
+        schema = @Schema(implementation = Long.class))
+  })
   @PostMapping(value = "list")
   @RequiresPermissions("token:view")
-  public RestResponse tokenList(RestRequest restRequest, AccessToken 
accessToken) {
+  public RestResponse tokensList(
+      RestRequest restRequest, @Parameter(hidden = true) AccessToken 
accessToken) {
     IPage<AccessToken> accessTokens = 
accessTokenService.findAccessTokens(accessToken, restRequest);
     return RestResponse.success(accessTokens);
   }
 
   /** update token status */
+  @Operation(summary = "Toggle token")
+  @Parameters({
+    @Parameter(
+        name = "tokenId",
+        description = "token id",
+        required = true,
+        example = "1",
+        schema = @Schema(implementation = Long.class))
+  })
   @PostMapping("toggle")
   @RequiresPermissions("token:add")
   public RestResponse toggleToken(@NotNull(message = "{required}") Long 
tokenId) {
@@ -90,6 +138,15 @@ public class AccessTokenController {
   }
 
   /** delete token by id */
+  @Operation(summary = "Delete token")
+  @Parameters({
+    @Parameter(
+        name = "tokenId",
+        description = "token id",
+        required = true,
+        example = "1",
+        schema = @Schema(implementation = Long.class))
+  })
   @DeleteMapping(value = "delete")
   @RequiresPermissions("token:delete")
   public RestResponse deleteToken(@NotBlank(message = "{required}") Long 
tokenId) {
@@ -101,6 +158,7 @@ public class AccessTokenController {
    * copy cURL, hardcode now, there is no need for configuration here, because 
there are several
    * fixed interfaces
    */
+  @Operation(summary = "Generate api with token")
   @PostMapping(value = "curl")
   public RestResponse copyRestApiCurl(
       @NotBlank(message = "{required}") String appId,
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MemberController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MemberController.java
index 971d51c00..c92df03f8 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MemberController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MemberController.java
@@ -27,6 +27,8 @@ import 
org.apache.streampark.console.system.service.MemberService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -41,6 +43,7 @@ import javax.validation.constraints.NotBlank;
 
 import java.util.List;
 
+@Tag(name = "MEMBER_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -49,30 +52,35 @@ public class MemberController {
 
   @Autowired private MemberService memberService;
 
+  @Operation(summary = "List members")
   @PostMapping("list")
   public RestResponse memberList(RestRequest restRequest, Member member) {
     IPage<Member> userList = memberService.findUsers(member, restRequest);
     return RestResponse.success(userList);
   }
 
+  @Operation(summary = "List candidate users")
   @PostMapping("candidateUsers")
   public RestResponse candidateUsers(Long teamId) {
     List<User> userList = memberService.findCandidateUsers(teamId);
     return RestResponse.success(userList);
   }
 
+  @Operation(summary = "List teams")
   @PostMapping("teams")
   public RestResponse listTeams(Long userId) {
     List<Team> teamList = memberService.findUserTeams(userId);
     return RestResponse.success(teamList);
   }
 
+  @Operation(summary = "Check the username")
   @PostMapping("check/user")
   public RestResponse check(@NotBlank(message = "{required}") Long teamId, 
String userName) {
     Member result = this.memberService.findByUserName(teamId, userName);
     return RestResponse.success(result == null);
   }
 
+  @Operation(summary = "Create member")
   @PostMapping("post")
   @RequiresPermissions("member:add")
   public RestResponse create(@Valid Member member) {
@@ -80,6 +88,7 @@ public class MemberController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Delete member")
   @DeleteMapping("delete")
   @RequiresPermissions("member:delete")
   public RestResponse delete(Member member) {
@@ -87,6 +96,7 @@ public class MemberController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update member")
   @PutMapping("update")
   @RequiresPermissions("member:update")
   public RestResponse update(Member member) {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MenuController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MenuController.java
index 79288f803..0e6218888 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MenuController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/MenuController.java
@@ -25,6 +25,9 @@ import 
org.apache.streampark.console.system.service.MenuService;
 
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -38,6 +41,7 @@ import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.Map;
 
+@Tag(name = "MENU_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -48,6 +52,7 @@ public class MenuController {
 
   @Autowired private CommonService commonService;
 
+  @Operation(summary = "List menu-routes")
   @PostMapping("router")
   public RestResponse getUserRouters(Long teamId) {
     // TODO The teamId is required, get routers should be called after choose 
teamId.
@@ -56,6 +61,7 @@ public class MenuController {
     return RestResponse.success(routers);
   }
 
+  @Operation(summary = "List menus")
   @PostMapping("list")
   @RequiresPermissions("menu:view")
   public RestResponse menuList(Menu menu) {
@@ -63,6 +69,7 @@ public class MenuController {
     return RestResponse.success(maps);
   }
 
+  @Operation(summary = "Create menu")
   @PostMapping("post")
   @RequiresPermissions("menu:add")
   public RestResponse addMenu(@Valid Menu menu) {
@@ -70,6 +77,7 @@ public class MenuController {
     return RestResponse.success();
   }
 
+
   @PutMapping("update")
   @RequiresPermissions("menu:update")
   public RestResponse updateMenu(@Valid Menu menu) throws Exception {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java
index eb7799cf2..bfb5f819c 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java
@@ -32,6 +32,8 @@ import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -43,6 +45,7 @@ import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
 import java.util.Map;
 
+@Tag(name = "PASSPORT_TAG")
 @Validated
 @RestController
 @RequestMapping("passport")
@@ -54,6 +57,7 @@ public class PassportController {
 
   @Autowired private Authenticator authenticator;
 
+  @Operation(summary = "Signin")
   @PostMapping("signin")
   public RestResponse signin(
       @NotBlank(message = "{required}") String username,
@@ -95,6 +99,7 @@ public class PassportController {
     return new RestResponse().data(userInfo);
   }
 
+  @Operation(summary = "Signout")
   @PostMapping("signout")
   public RestResponse signout() {
     SecurityUtils.getSecurityManager().logout(SecurityUtils.getSubject());
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/RoleController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/RoleController.java
index 3760fd7ab..7c639782d 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/RoleController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/RoleController.java
@@ -27,6 +27,8 @@ import 
org.apache.streampark.console.system.service.RoleService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -42,6 +44,7 @@ import javax.validation.constraints.NotBlank;
 import java.util.List;
 import java.util.stream.Collectors;
 
+@Tag(name = "ROLE_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -51,6 +54,7 @@ public class RoleController {
   @Autowired private RoleService roleService;
   @Autowired private RoleMenuServie roleMenuServie;
 
+  @Operation(summary = "List roles")
   @PostMapping("list")
   @RequiresPermissions("role:view")
   public RestResponse roleList(RestRequest restRequest, Role role) {
@@ -58,12 +62,14 @@ public class RoleController {
     return RestResponse.success(roleList);
   }
 
+  @Operation(summary = "Check the role name")
   @PostMapping("check/name")
   public RestResponse checkRoleName(@NotBlank(message = "{required}") String 
roleName) {
     Role result = this.roleService.findByName(roleName);
     return RestResponse.success(result == null);
   }
 
+  @Operation(summary = "List role menus")
   @PostMapping("menu")
   public RestResponse getRoleMenus(@NotBlank(message = "{required}") String 
roleId) {
     List<RoleMenu> list = this.roleMenuServie.getByRoleId(roleId);
@@ -74,6 +80,7 @@ public class RoleController {
     return RestResponse.success(roleMenus);
   }
 
+  @Operation(summary = "Create role")
   @PostMapping("post")
   @RequiresPermissions("role:add")
   public RestResponse addRole(@Valid Role role) {
@@ -81,6 +88,7 @@ public class RoleController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Delete role")
   @DeleteMapping("delete")
   @RequiresPermissions("role:delete")
   public RestResponse deleteRole(Long roleId) {
@@ -88,6 +96,7 @@ public class RoleController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update role")
   @PutMapping("update")
   @RequiresPermissions("role:update")
   public RestResponse updateRole(Role role) throws Exception {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/TeamController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/TeamController.java
index fed8b041e..86736b9e6 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/TeamController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/TeamController.java
@@ -25,6 +25,8 @@ import 
org.apache.streampark.console.system.service.TeamService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -37,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 
+@Tag(name = "TEAM_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -45,18 +48,21 @@ public class TeamController {
 
   @Autowired private TeamService teamService;
 
+  @Operation(summary = "List teams")
   @PostMapping("list")
   public RestResponse teamList(RestRequest restRequest, Team team) {
     IPage<Team> teamList = teamService.findTeams(team, restRequest);
     return RestResponse.success(teamList);
   }
 
+  @Operation(summary = "Check the team name")
   @PostMapping("check/name")
   public RestResponse checkTeamName(@NotBlank(message = "{required}") String 
teamName) {
     Team result = this.teamService.findByName(teamName);
     return RestResponse.success(result == null);
   }
 
+  @Operation(summary = "Create team")
   @PostMapping("post")
   @RequiresPermissions("team:add")
   public RestResponse addTeam(@Valid Team team) {
@@ -64,6 +70,7 @@ public class TeamController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Delete team")
   @DeleteMapping("delete")
   @RequiresPermissions("team:delete")
   public RestResponse deleteTeam(Team team) {
@@ -71,6 +78,7 @@ public class TeamController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update team")
   @PutMapping("update")
   @RequiresPermissions("team:update")
   public RestResponse updateTeam(Team team) {
diff --git 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/UserController.java
 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/UserController.java
index cf927d677..07da93547 100644
--- 
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/UserController.java
+++ 
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/UserController.java
@@ -34,6 +34,9 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -41,6 +44,7 @@ import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
@@ -49,6 +53,7 @@ import javax.validation.constraints.NotBlank;
 import java.util.List;
 import java.util.Map;
 
+@Tag(name = "USER_TAG")
 @Slf4j
 @Validated
 @RestController
@@ -61,6 +66,8 @@ public class UserController {
 
   @Autowired private CommonService commonService;
 
+
+  @Operation(summary = "List users")
   @PostMapping("list")
   @RequiresPermissions(
       value = {"user:view", "app:view"},
@@ -70,6 +77,7 @@ public class UserController {
     return RestResponse.success(userList);
   }
 
+  @Operation(summary = "Create user")
   @PostMapping("post")
   @RequiresPermissions("user:add")
   public RestResponse addUser(@Valid User user) throws Exception {
@@ -78,6 +86,7 @@ public class UserController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Update user")
   @PutMapping("update")
   @RequiresPermissions("user:update")
   public RestResponse updateUser(@Valid User user) throws Exception {
@@ -85,6 +94,7 @@ public class UserController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Delete user")
   @DeleteMapping("delete")
   @RequiresPermissions("user:delete")
   public RestResponse deleteUser(Long userId) throws Exception {
@@ -92,24 +102,29 @@ public class UserController {
     return RestResponse.success();
   }
 
+
+  @Operation(summary = "List without token users")
   @PostMapping("getNoTokenUser")
   public RestResponse getNoTokenUser() {
     List<User> userList = this.userService.getNoTokenUser();
     return RestResponse.success(userList);
   }
 
+  @Operation(summary = "Check the username")
   @PostMapping("check/name")
   public RestResponse checkUserName(@NotBlank(message = "{required}") String 
username) {
     boolean result = this.userService.findByName(username) == null;
     return RestResponse.success(result);
   }
 
+  @Operation(summary = "Update password")
   @PutMapping("password")
   public RestResponse updatePassword(User user) throws Exception {
     userService.updatePassword(user);
     return RestResponse.success();
   }
 
+  @Operation(summary = "Reset password")
   @PutMapping("password/reset")
   @RequiresPermissions("user:reset")
   public RestResponse resetPassword(@NotBlank(message = "{required}") String 
usernames)
@@ -119,12 +134,14 @@ public class UserController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "List user types")
   @PostMapping("types")
   @RequiresPermissions("user:types")
   public RestResponse userTypes() {
     return RestResponse.success(UserType.values());
   }
 
+  @Operation(summary = "Init the user teams")
   @PostMapping("initTeam")
   public RestResponse initTeam(Long teamId, Long userId) {
     Team team = teamService.getById(teamId);
@@ -135,6 +152,7 @@ public class UserController {
     return RestResponse.success();
   }
 
+  @Operation(summary = "Set the current user teams")
   @PostMapping("setTeam")
   public RestResponse setTeam(Long teamId) {
     Team team = teamService.getById(teamId);
@@ -153,6 +171,7 @@ public class UserController {
     return new RestResponse().data(infoMap);
   }
 
+  @Operation(summary = "List the team users")
   @PostMapping("appOwners")
   public RestResponse appOwners(Long teamId) {
     List<User> userList = userService.findByAppOwner(teamId);
diff --git 
a/streampark-console/streampark-console-service/src/main/resources/application.yml
 
b/streampark-console/streampark-console-service/src/main/resources/application.yml
index 7d4a2d197..d21c11666 100644
--- 
a/streampark-console/streampark-console-service/src/main/resources/application.yml
+++ 
b/streampark-console/streampark-console-service/src/main/resources/application.yml
@@ -28,9 +28,6 @@ logging:
   level:
     root: info
 
-swagger:
-  enable: true
-
 knife4j:
   enable: true
   basic:
@@ -39,6 +36,13 @@ knife4j:
     username: admin
     password: streampark
 
+springdoc:
+  api-docs:
+    enabled: true
+  swagger-ui:
+    path: /swagger-ui.html
+  packages-to-scan: org.apache.streampark.console
+
 spring:
   profiles.active: h2 #[h2,pgsql,mysql]
   application.name: StreamPark
diff --git 
a/streampark-console/streampark-console-service/src/main/resources/mapper/system/AccessTokenMapper.xml
 
b/streampark-console/streampark-console-service/src/main/resources/mapper/system/AccessTokenMapper.xml
index 7b544b42a..e36715720 100644
--- 
a/streampark-console/streampark-console-service/src/main/resources/mapper/system/AccessTokenMapper.xml
+++ 
b/streampark-console/streampark-console-service/src/main/resources/mapper/system/AccessTokenMapper.xml
@@ -44,7 +44,7 @@
         from t_access_token t1 join t_user t2 on t1.user_id = t2.user_id
         <where>
             <if test="accessToken.userId != null and accessToken.userId != ''">
-                and t1.user_id = accessToken.userId
+                and t1.user_id = #{accessToken.userId}
             </if>
         </where>
     </select>
diff --git 
a/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/AccessTokenServiceTest.java
 
b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/AccessTokenServiceTest.java
index b13e5f6bd..70b8768d0 100644
--- 
a/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/AccessTokenServiceTest.java
+++ 
b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/AccessTokenServiceTest.java
@@ -18,6 +18,7 @@
 package org.apache.streampark.console.core.service;
 
 import org.apache.streampark.console.SpringTestBase;
+import org.apache.streampark.console.base.domain.RestRequest;
 import org.apache.streampark.console.base.domain.RestResponse;
 import org.apache.streampark.console.base.util.WebUtils;
 import org.apache.streampark.console.system.authentication.JWTToken;
@@ -27,6 +28,7 @@ import org.apache.streampark.console.system.entity.User;
 import org.apache.streampark.console.system.service.AccessTokenService;
 import org.apache.streampark.console.system.service.UserService;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,12 +40,14 @@ public class AccessTokenServiceTest extends SpringTestBase {
   @Autowired private UserService userService;
 
   @Test
-  void testGenerateToken() throws Exception {
+  void testCrudToken() throws Exception {
     Long mockUserId = 100000L;
     String expireTime = "9999-01-01 00:00:00";
     RestResponse restResponse = accessTokenService.generateToken(mockUserId, 
expireTime, "");
     Assertions.assertNotNull(restResponse);
     Assertions.assertInstanceOf(AccessToken.class, restResponse.get("data"));
+
+    // verify
     AccessToken accessToken = (AccessToken) restResponse.get("data");
     LOG.info(accessToken.getToken());
     JWTToken jwtToken = new 
JWTToken(WebUtils.decryptToken(accessToken.getToken()));
@@ -54,5 +58,29 @@ public class AccessTokenServiceTest extends SpringTestBase {
     User user = userService.findByName(username);
     Assertions.assertNotNull(user);
     Assertions.assertTrue(JWTUtil.verify(jwtToken.getToken(), username));
+
+    // list
+    AccessToken mockToken1 = new AccessToken();
+    mockToken1.setUserId(100000L);
+    IPage<AccessToken> tokens1 = 
accessTokenService.findAccessTokens(mockToken1, new RestRequest());
+    Assertions.assertEquals(1, tokens1.getRecords().size());
+    AccessToken mockToken2 = new AccessToken();
+    mockToken2.setUserId(100001L);
+    IPage<AccessToken> tokens2 = 
accessTokenService.findAccessTokens(mockToken2, new RestRequest());
+    Assertions.assertTrue(tokens2.getRecords().isEmpty());
+
+    // toggle
+    Long tokenId = accessToken.getId();
+    RestResponse toggleTokenResp = accessTokenService.toggleToken(tokenId);
+    Assertions.assertNotNull(toggleTokenResp);
+    Assertions.assertTrue((Boolean) toggleTokenResp.get("data"));
+
+    // get
+    AccessToken afterToggle = accessTokenService.getByUserId(mockUserId);
+    Assertions.assertNotNull(afterToggle);
+    Assertions.assertEquals(AccessToken.STATUS_DISABLE, 
afterToggle.getStatus());
+
+    // delete
+    Assertions.assertTrue(accessTokenService.deleteToken(tokenId));
   }
 }

Reply via email to