diff --git a/README.md b/README.md
index 21f7a0a..361d15c 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,8 @@ chmod +x /home/tms/scripts/tms.sh
Open:
- Swagger UI: http://localhost:8080/swagger-ui.html
+- Internal API docs JSON: http://localhost:8080/v3/api-docs/internal-api
+- Runtime-generated Swagger/OpenAPI docs are the source of truth for `/api/**`.
- Internal health API: `GET /api/v1/device/status`
- Internal sign preview API: `POST /api/v1/sign/preview`
- External sign API: `POST /openapi/v1/sign/signature`
diff --git a/pom.xml b/pom.xml
index 9bd5405..0d27edd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,6 +79,22 @@
spring-boot-starter-test
test
+
+
+
+ org.bouncycastle
+ bcprov-jdk18on
+ 1.83
+
+
+
+
+
+ org.bouncycastle
+ bcpkix-jdk18on
+ 1.83
+
+
diff --git a/src/main/java/com/cisd/tms/common/config/OpenApiConfig.java b/src/main/java/com/cisd/tms/common/config/OpenApiConfig.java
index d6f9fb0..bed22f5 100644
--- a/src/main/java/com/cisd/tms/common/config/OpenApiConfig.java
+++ b/src/main/java/com/cisd/tms/common/config/OpenApiConfig.java
@@ -16,7 +16,7 @@ public class OpenApiConfig {
return new OpenAPI()
.info(new Info()
.title("CISD TMS API")
- .description("CISD Terminal Management System API")
+ .description("CISD TMS 内部业务接口文档")
.version("v0.0.1")
.license(new License().name("Internal Use")))
.externalDocs(new ExternalDocumentation()
diff --git a/src/main/java/com/cisd/tms/modules/auth/controller/AuthController.java b/src/main/java/com/cisd/tms/modules/auth/controller/AuthController.java
index c8f1405..1f8a71a 100644
--- a/src/main/java/com/cisd/tms/modules/auth/controller/AuthController.java
+++ b/src/main/java/com/cisd/tms/modules/auth/controller/AuthController.java
@@ -5,6 +5,9 @@ import com.cisd.tms.modules.auth.dto.CurrentUserResponse;
import com.cisd.tms.modules.auth.dto.LoginRequest;
import com.cisd.tms.modules.auth.dto.LoginResponse;
import com.cisd.tms.modules.auth.service.AuthService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -15,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/auth")
+@Tag(name = "认证鉴权", description = "内部用户登录与当前用户信息接口")
public class AuthController {
private final AuthService authService;
@@ -24,12 +28,17 @@ public class AuthController {
}
@PostMapping("/login")
+ @Operation(summary = "内部用户登录", description = "校验用户名和密码,返回访问令牌及过期时间。")
public ApiResponse login(@Valid @RequestBody LoginRequest request) {
return ApiResponse.success(authService.login(request));
}
@GetMapping("/me")
- public ApiResponse me(@RequestHeader(value = "X-User", required = false) String user) {
+ @Operation(summary = "查询当前用户", description = "根据请求头中的用户标识返回当前登录用户信息。")
+ public ApiResponse me(
+ @Parameter(description = "当前用户标识,来自内部鉴权链路透传的 X-User 请求头")
+ @RequestHeader(value = "X-User", required = false) String user
+ ) {
return ApiResponse.success(authService.me(user));
}
}
diff --git a/src/main/java/com/cisd/tms/modules/auth/dto/CurrentUserResponse.java b/src/main/java/com/cisd/tms/modules/auth/dto/CurrentUserResponse.java
index 976a6bf..3fa14e4 100644
--- a/src/main/java/com/cisd/tms/modules/auth/dto/CurrentUserResponse.java
+++ b/src/main/java/com/cisd/tms/modules/auth/dto/CurrentUserResponse.java
@@ -1,9 +1,15 @@
package com.cisd.tms.modules.auth.dto;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+@Schema(description = "当前登录用户信息")
public class CurrentUserResponse {
+ @Schema(description = "用户名", example = "admin")
private String username;
+ @Schema(description = "展示名称", example = "系统管理员")
private String displayName;
+ @Schema(description = "角色标识", example = "ADMIN")
private String role;
public String getUsername() {
diff --git a/src/main/java/com/cisd/tms/modules/auth/dto/LoginRequest.java b/src/main/java/com/cisd/tms/modules/auth/dto/LoginRequest.java
index da97d99..fcd0b4e 100644
--- a/src/main/java/com/cisd/tms/modules/auth/dto/LoginRequest.java
+++ b/src/main/java/com/cisd/tms/modules/auth/dto/LoginRequest.java
@@ -1,13 +1,17 @@
package com.cisd.tms.modules.auth.dto;
+import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
+@Schema(description = "内部登录请求")
public class LoginRequest {
@NotBlank(message = "username is required")
+ @Schema(description = "登录用户名", example = "admin")
private String username;
@NotBlank(message = "password is required")
+ @Schema(description = "登录密码", example = "P@ssw0rd")
private String password;
public String getUsername() {
diff --git a/src/main/java/com/cisd/tms/modules/auth/dto/LoginResponse.java b/src/main/java/com/cisd/tms/modules/auth/dto/LoginResponse.java
index 1341d1f..b5873f0 100644
--- a/src/main/java/com/cisd/tms/modules/auth/dto/LoginResponse.java
+++ b/src/main/java/com/cisd/tms/modules/auth/dto/LoginResponse.java
@@ -1,9 +1,15 @@
package com.cisd.tms.modules.auth.dto;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+@Schema(description = "内部登录响应")
public class LoginResponse {
+ @Schema(description = "登录用户名", example = "admin")
private String username;
+ @Schema(description = "访问令牌")
private String token;
+ @Schema(description = "令牌过期时间", example = "2026-03-11T18:00:00+08:00")
private String expiresAt;
public String getUsername() {
diff --git a/src/main/java/com/cisd/tms/modules/device/controller/CryptoCardController.java b/src/main/java/com/cisd/tms/modules/device/controller/CryptoCardController.java
index 42d5bf7..afde97a 100644
--- a/src/main/java/com/cisd/tms/modules/device/controller/CryptoCardController.java
+++ b/src/main/java/com/cisd/tms/modules/device/controller/CryptoCardController.java
@@ -25,6 +25,9 @@ import com.cisd.tms.integration.crypto.pcie.model.SymmetricCryptoRequest;
import com.cisd.tms.integration.crypto.pcie.model.SymmetricKekCryptoRequest;
import com.cisd.tms.integration.crypto.pcie.model.StandardKeyPairResult;
import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
@@ -42,6 +45,7 @@ import org.springframework.web.bind.annotation.RestController;
@Validated
@RestController
@RequestMapping("/api/v1/device/crypto")
+@Tag(name = "密码卡调试", description = "密码卡设备调试、密钥操作和文件管理接口")
public class CryptoCardController {
private final PcieCryptoService pcieCryptoService;
@@ -51,22 +55,29 @@ public class CryptoCardController {
}
@GetMapping("/device-count")
+ @Operation(summary = "查询密码卡数量", description = "返回当前环境可见的密码卡设备数量。")
public ApiResponse getDeviceCount() {
return ApiResponse.success(pcieCryptoService.getDeviceCount());
}
@GetMapping("/device-conf")
+ @Operation(summary = "查询密码卡配置", description = "返回密码卡底层驱动和配置快照。")
public ApiResponse getDeviceConf() {
return ApiResponse.success(pcieCryptoService.getDeviceConf());
}
@GetMapping("/device-info")
+ @Operation(summary = "查询密码卡信息", description = "返回密码卡设备详细信息。")
public ApiResponse getDeviceInfo() {
return ApiResponse.success(pcieCryptoService.getDeviceInfo());
}
@GetMapping("/random")
- public ApiResponse