@llryiop/avatar-boot-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +309 -0
- package/bin/cli.js +3 -0
- package/docs/plans/2026-03-12-avatar-boot-cli-design.md +73 -0
- package/docs/plans/2026-03-12-avatar-boot-cli-plan.md +681 -0
- package/package.json +28 -0
- package/src/index.js +78 -0
- package/src/prompts.js +78 -0
- package/src/template.js +37 -0
- package/src/transform.js +172 -0
- package/src/utils.js +34 -0
- package/templates/.claude/rules/architecture-redlines.md +146 -0
- package/templates/.claude/rules/code-review-standards.md +137 -0
- package/templates/.claude/rules/coding-standards.md +56 -0
- package/templates/.claude/rules/git-commit.md +59 -0
- package/templates/.claude/rules/layered-architecture.md +201 -0
- package/templates/.claude/rules/mybatis-plus.md +263 -0
- package/templates/.claude/rules/tech-stack.md +41 -0
- package/templates/.claude/rules/version.md +467 -0
- package/templates/.claude/settings.local.json +18 -0
- package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
- package/templates/.claude/skills/api-design/SKILL.md +200 -0
- package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
- package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +1007 -0
- package/templates/.claude/skills/changelog-generator/SKILL.md +114 -0
- package/templates/.claude/skills/code-review/SKILL.md +239 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +824 -0
- package/templates/.claude/skills/database-design/SKILL.md +377 -0
- package/templates/.claude/skills/deployment-config/SKILL.md +277 -0
- package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
- package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
- package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
- package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
- package/templates/.claude/skills/security-audit/SKILL.md +330 -0
- package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
- package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
- package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
- package/templates/CLAUDE.md +173 -0
- package/templates/README.md +303 -0
- package/templates/avatar-scaffold-api/pom.xml +41 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +40 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
- package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
- package/templates/avatar-scaffold-service/pom.xml +150 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserLoginEntity.java +33 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +29 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +28 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +28 -0
- package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
- package/templates/pom.xml +98 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-doc-generator
|
|
3
|
+
description: |
|
|
4
|
+
API 文档生成技能。当用户提到以下关键词时触发:
|
|
5
|
+
API doc, Swagger, OpenAPI, 接口文档, SpringDoc,
|
|
6
|
+
接口说明, API 文档生成, 文档注解
|
|
7
|
+
|
|
8
|
+
本技能提供 Controller 到 OpenAPI/Swagger 注解的生成指导,
|
|
9
|
+
包括 SpringDoc 集成配置、常用注解使用、分组文档、
|
|
10
|
+
代码示例和常见问题排查。
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# API 文档生成技能
|
|
14
|
+
|
|
15
|
+
## 适用场景
|
|
16
|
+
|
|
17
|
+
- 为已有 Controller 生成 OpenAPI 注解
|
|
18
|
+
- 集成 SpringDoc 到 Avatar Boot 项目
|
|
19
|
+
- 配置 API 文档分组
|
|
20
|
+
- 自定义文档展示内容
|
|
21
|
+
|
|
22
|
+
## SpringDoc 集成
|
|
23
|
+
|
|
24
|
+
### 依赖配置
|
|
25
|
+
|
|
26
|
+
```xml
|
|
27
|
+
<!-- pom.xml (api 模块) -->
|
|
28
|
+
<dependency>
|
|
29
|
+
<groupId>org.springdoc</groupId>
|
|
30
|
+
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
|
31
|
+
<version>2.5.0</version>
|
|
32
|
+
</dependency>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 基础配置
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
# application.yml
|
|
39
|
+
springdoc:
|
|
40
|
+
api-docs:
|
|
41
|
+
enabled: true
|
|
42
|
+
path: /v3/api-docs
|
|
43
|
+
swagger-ui:
|
|
44
|
+
enabled: true
|
|
45
|
+
path: /swagger-ui.html
|
|
46
|
+
tags-sorter: alpha
|
|
47
|
+
operations-sorter: alpha
|
|
48
|
+
default-produces-media-type: application/json
|
|
49
|
+
default-consumes-media-type: application/json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 全局配置类
|
|
53
|
+
|
|
54
|
+
```java
|
|
55
|
+
@Configuration
|
|
56
|
+
public class OpenApiConfig {
|
|
57
|
+
|
|
58
|
+
@Bean
|
|
59
|
+
public OpenAPI customOpenAPI() {
|
|
60
|
+
return new OpenAPI()
|
|
61
|
+
.info(new Info()
|
|
62
|
+
.title("Avatar Boot 服务 API 文档")
|
|
63
|
+
.version("1.0.0")
|
|
64
|
+
.description("基于 Avatar Boot 框架的服务接口文档")
|
|
65
|
+
.contact(new Contact()
|
|
66
|
+
.name("开发团队")
|
|
67
|
+
.email("dev@example.com")))
|
|
68
|
+
.externalDocs(new ExternalDocumentation()
|
|
69
|
+
.description("项目文档")
|
|
70
|
+
.url("https://wiki.example.com"));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Controller 注解生成
|
|
76
|
+
|
|
77
|
+
### 完整 Controller 示例
|
|
78
|
+
|
|
79
|
+
```java
|
|
80
|
+
@Tag(name = "用户管理", description = "用户信息的增删改查接口")
|
|
81
|
+
@RestController
|
|
82
|
+
@RequestMapping("/api/users")
|
|
83
|
+
@RequiredArgsConstructor
|
|
84
|
+
public class UserController {
|
|
85
|
+
|
|
86
|
+
private final UserService userService;
|
|
87
|
+
|
|
88
|
+
@Operation(
|
|
89
|
+
summary = "根据ID查询用户",
|
|
90
|
+
description = "根据用户ID查询用户详细信息,返回脱敏后的数据"
|
|
91
|
+
)
|
|
92
|
+
@ApiResponses({
|
|
93
|
+
@ApiResponse(responseCode = "200", description = "查询成功",
|
|
94
|
+
content = @Content(schema = @Schema(implementation = Result.class))),
|
|
95
|
+
@ApiResponse(responseCode = "200", description = "用户不存在(业务错误码非0)")
|
|
96
|
+
})
|
|
97
|
+
@GetMapping("/{id}")
|
|
98
|
+
public Result<UserInfoVO> getById(
|
|
99
|
+
@Parameter(description = "用户ID", required = true, example = "1")
|
|
100
|
+
@PathVariable Long id) {
|
|
101
|
+
return Result.success(userService.getById(id));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@Operation(summary = "创建用户", description = "创建新用户,用户名不可重复")
|
|
105
|
+
@PostMapping
|
|
106
|
+
public Result<Long> create(
|
|
107
|
+
@RequestBody @Valid UserInfoCreateDTO dto) {
|
|
108
|
+
return Result.success(userService.create(dto));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@Operation(summary = "更新用户信息")
|
|
112
|
+
@PutMapping("/{id}")
|
|
113
|
+
public Result<Void> update(
|
|
114
|
+
@Parameter(description = "用户ID", required = true)
|
|
115
|
+
@PathVariable Long id,
|
|
116
|
+
@RequestBody @Valid UserInfoUpdateDTO dto) {
|
|
117
|
+
userService.update(id, dto);
|
|
118
|
+
return Result.success();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@Operation(summary = "删除用户", description = "逻辑删除用户,关联数据不受影响")
|
|
122
|
+
@DeleteMapping("/{id}")
|
|
123
|
+
public Result<Void> delete(
|
|
124
|
+
@Parameter(description = "用户ID", required = true)
|
|
125
|
+
@PathVariable Long id) {
|
|
126
|
+
userService.delete(id);
|
|
127
|
+
return Result.success();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@Operation(summary = "分页查询用户列表")
|
|
131
|
+
@PostMapping("/page")
|
|
132
|
+
public Result<IPage<UserInfoVO>> page(
|
|
133
|
+
@RequestBody @Valid UserInfoPageQueryDTO dto) {
|
|
134
|
+
return Result.success(userService.page(dto));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@Operation(summary = "批量删除用户")
|
|
138
|
+
@DeleteMapping("/batch")
|
|
139
|
+
public Result<Void> batchDelete(
|
|
140
|
+
@Parameter(description = "用户ID列表", required = true)
|
|
141
|
+
@RequestBody List<Long> ids) {
|
|
142
|
+
userService.batchDelete(ids);
|
|
143
|
+
return Result.success();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 核心注解详解
|
|
149
|
+
|
|
150
|
+
### @Tag — 接口分组
|
|
151
|
+
|
|
152
|
+
```java
|
|
153
|
+
// 用在 Controller 类上,定义接口分组
|
|
154
|
+
@Tag(name = "用户管理", description = "用户信息的增删改查接口")
|
|
155
|
+
@RestController
|
|
156
|
+
public class UserController { }
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### @Operation — 接口描述
|
|
160
|
+
|
|
161
|
+
```java
|
|
162
|
+
@Operation(
|
|
163
|
+
summary = "简要描述(显示在接口列表中)",
|
|
164
|
+
description = "详细描述(展开后显示)",
|
|
165
|
+
deprecated = false, // 是否废弃
|
|
166
|
+
hidden = false // 是否隐藏
|
|
167
|
+
)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### @Parameter — 参数描述
|
|
171
|
+
|
|
172
|
+
```java
|
|
173
|
+
// 路径参数
|
|
174
|
+
@Parameter(description = "用户ID", required = true, example = "1")
|
|
175
|
+
@PathVariable Long id
|
|
176
|
+
|
|
177
|
+
// 查询参数
|
|
178
|
+
@Parameter(description = "用户名(模糊匹配)", example = "zhang")
|
|
179
|
+
@RequestParam(required = false) String username
|
|
180
|
+
|
|
181
|
+
// Header 参数
|
|
182
|
+
@Parameter(description = "认证令牌", in = ParameterIn.HEADER, required = true)
|
|
183
|
+
@RequestHeader("Authorization") String token
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### @Schema — 模型描述
|
|
187
|
+
|
|
188
|
+
```java
|
|
189
|
+
@Data
|
|
190
|
+
@Schema(description = "用户创建请求")
|
|
191
|
+
public class UserInfoCreateDTO {
|
|
192
|
+
|
|
193
|
+
@Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED,
|
|
194
|
+
example = "zhangsan", maxLength = 50)
|
|
195
|
+
@NotBlank(message = "用户名不能为空")
|
|
196
|
+
private String username;
|
|
197
|
+
|
|
198
|
+
@Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED,
|
|
199
|
+
example = "13812345678", pattern = "^1[3-9]\\d{9}$")
|
|
200
|
+
@NotBlank(message = "手机号不能为空")
|
|
201
|
+
private String phone;
|
|
202
|
+
|
|
203
|
+
@Schema(description = "邮箱", example = "zhangsan@example.com")
|
|
204
|
+
private String email;
|
|
205
|
+
|
|
206
|
+
@Schema(description = "用户状态", allowableValues = {"0", "1"},
|
|
207
|
+
defaultValue = "1", example = "1")
|
|
208
|
+
private Integer status;
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### @ApiResponse — 响应描述
|
|
213
|
+
|
|
214
|
+
```java
|
|
215
|
+
@ApiResponses({
|
|
216
|
+
@ApiResponse(responseCode = "200", description = "操作成功",
|
|
217
|
+
content = @Content(
|
|
218
|
+
mediaType = "application/json",
|
|
219
|
+
schema = @Schema(implementation = Result.class),
|
|
220
|
+
examples = @ExampleObject(value = """
|
|
221
|
+
{
|
|
222
|
+
"code": 0,
|
|
223
|
+
"message": "success",
|
|
224
|
+
"data": { "id": 1, "username": "zhangsan" }
|
|
225
|
+
}
|
|
226
|
+
""")
|
|
227
|
+
)),
|
|
228
|
+
@ApiResponse(responseCode = "400", description = "参数校验失败"),
|
|
229
|
+
@ApiResponse(responseCode = "401", description = "未认证"),
|
|
230
|
+
@ApiResponse(responseCode = "403", description = "无权限")
|
|
231
|
+
})
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## 分组文档配置
|
|
235
|
+
|
|
236
|
+
按模块或业务域对 API 进行分组:
|
|
237
|
+
|
|
238
|
+
```java
|
|
239
|
+
@Configuration
|
|
240
|
+
public class OpenApiGroupConfig {
|
|
241
|
+
|
|
242
|
+
@Bean
|
|
243
|
+
public GroupedOpenApi userApi() {
|
|
244
|
+
return GroupedOpenApi.builder()
|
|
245
|
+
.group("1-用户管理")
|
|
246
|
+
.pathsToMatch("/api/users/**")
|
|
247
|
+
.build();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@Bean
|
|
251
|
+
public GroupedOpenApi orderApi() {
|
|
252
|
+
return GroupedOpenApi.builder()
|
|
253
|
+
.group("2-订单管理")
|
|
254
|
+
.pathsToMatch("/api/orders/**")
|
|
255
|
+
.build();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
@Bean
|
|
259
|
+
public GroupedOpenApi systemApi() {
|
|
260
|
+
return GroupedOpenApi.builder()
|
|
261
|
+
.group("3-系统管理")
|
|
262
|
+
.pathsToMatch("/api/system/**")
|
|
263
|
+
.packagesToScan("com.example.controller.system")
|
|
264
|
+
.build();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Result<T> 泛型文档支持
|
|
270
|
+
|
|
271
|
+
为了让 SpringDoc 正确解析 `Result<T>` 泛型,确保 Controller 方法的返回类型明确泛型参数:
|
|
272
|
+
|
|
273
|
+
```java
|
|
274
|
+
// 正确:明确泛型类型
|
|
275
|
+
public Result<UserInfoVO> getById(...)
|
|
276
|
+
|
|
277
|
+
// 正确:分页泛型
|
|
278
|
+
public Result<IPage<UserInfoVO>> page(...)
|
|
279
|
+
|
|
280
|
+
// 错误:原始类型,文档无法推断 data 结构
|
|
281
|
+
public Result getById(...)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Result 类注解
|
|
285
|
+
|
|
286
|
+
```java
|
|
287
|
+
@Data
|
|
288
|
+
@Schema(description = "统一响应结构")
|
|
289
|
+
public class Result<T> {
|
|
290
|
+
|
|
291
|
+
@Schema(description = "业务状态码,0表示成功", example = "0")
|
|
292
|
+
private Integer code;
|
|
293
|
+
|
|
294
|
+
@Schema(description = "响应消息", example = "success")
|
|
295
|
+
private String message;
|
|
296
|
+
|
|
297
|
+
@Schema(description = "响应数据")
|
|
298
|
+
private T data;
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## 生产环境关闭文档
|
|
303
|
+
|
|
304
|
+
```yaml
|
|
305
|
+
# application-prod.yml
|
|
306
|
+
springdoc:
|
|
307
|
+
api-docs:
|
|
308
|
+
enabled: false
|
|
309
|
+
swagger-ui:
|
|
310
|
+
enabled: false
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
或使用条件配置:
|
|
314
|
+
|
|
315
|
+
```java
|
|
316
|
+
@Configuration
|
|
317
|
+
@Profile("!prod")
|
|
318
|
+
public class OpenApiConfig {
|
|
319
|
+
// 仅在非生产环境加载
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## 文档访问地址
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
Swagger UI: http://localhost:8080/swagger-ui.html
|
|
327
|
+
OpenAPI JSON: http://localhost:8080/v3/api-docs
|
|
328
|
+
OpenAPI YAML: http://localhost:8080/v3/api-docs.yaml
|
|
329
|
+
分组文档: http://localhost:8080/v3/api-docs/1-用户管理
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## 最佳实践
|
|
333
|
+
|
|
334
|
+
1. **中文描述** — `summary` 和 `description` 使用中文,方便团队协作
|
|
335
|
+
2. **示例值** — 每个字段提供 `example`,便于前端理解和调试
|
|
336
|
+
3. **枚举说明** — 使用 `allowableValues` 说明枚举值含义
|
|
337
|
+
4. **分组管理** — 按业务模块分组,方便查找
|
|
338
|
+
5. **保持同步** — 注解与代码逻辑保持一致,避免文档与实际行为不符
|
|
339
|
+
6. **生产关闭** — 生产环境必须关闭 Swagger UI
|
|
340
|
+
7. **版本控制** — API 文档版本与应用版本一致
|
|
341
|
+
8. **废弃标记** — 废弃接口使用 `@Deprecated` + `deprecated = true`
|
|
342
|
+
|
|
343
|
+
## 常见问题排查
|
|
344
|
+
|
|
345
|
+
### Swagger UI 页面空白
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
原因: 静态资源路径被拦截
|
|
349
|
+
解决:
|
|
350
|
+
1. 检查 Security 配置是否放行 /swagger-ui/** 和 /v3/api-docs/**
|
|
351
|
+
2. 检查是否有自定义 WebMvcConfigurer 覆盖了资源映射
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### 泛型类型显示为 Object
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
原因: 返回类型使用了原始 Result 而非 Result<T>
|
|
358
|
+
解决:
|
|
359
|
+
1. Controller 方法返回值明确泛型参数
|
|
360
|
+
2. 使用 @Schema 注解标注 DTO 字段类型
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 分页响应结构不正确
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
原因: IPage 接口的泛型推断问题
|
|
367
|
+
解决:
|
|
368
|
+
1. 使用具体实现类 Page<T> 替代 IPage<T> 作为返回类型
|
|
369
|
+
2. 或自定义 PageVO<T> 作为响应类型
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 文档加载缓慢
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
原因: 扫描了过多的包路径
|
|
376
|
+
解决:
|
|
377
|
+
1. 使用 packagesToScan 限制扫描范围
|
|
378
|
+
2. 使用 pathsToMatch 限制匹配路径
|
|
379
|
+
3. 排除不需要文档的内部接口
|
|
380
|
+
```
|