ai-engineering-init 1.4.3 → 1.6.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.
Files changed (131) hide show
  1. package/.cursor/skills/bug-detective/SKILL.md +19 -19
  2. package/.cursor/skills/project-navigator/SKILL.md +164 -258
  3. package/README.md +20 -236
  4. package/bin/index.js +437 -7
  5. package/package.json +7 -1
  6. package/scripts/build-skills.js +180 -0
  7. package/src/platform-map.json +56 -0
  8. package/src/skills/add-skill/SKILL.md +488 -0
  9. package/src/skills/add-todo/SKILL.md +269 -0
  10. package/src/skills/api-development/SKILL.md +266 -0
  11. package/src/skills/architecture-design/SKILL.md +262 -0
  12. package/src/skills/backend-annotations/SKILL.md +302 -0
  13. package/src/skills/banana-image/CHANGELOG.md +37 -0
  14. package/src/skills/banana-image/README.md +146 -0
  15. package/src/skills/banana-image/SKILL.md +171 -0
  16. package/src/skills/banana-image/assets/logo.png +0 -0
  17. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  18. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  19. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  20. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  21. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  22. package/src/skills/banana-image/scripts/package.json +18 -0
  23. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  24. package/src/skills/banana-image/templates/poster.json +22 -0
  25. package/src/skills/banana-image/templates/product.json +17 -0
  26. package/src/skills/banana-image/templates/social.json +22 -0
  27. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  28. package/src/skills/brainstorm/SKILL.md +216 -0
  29. package/src/skills/bug-detective/SKILL.md +256 -0
  30. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  31. package/src/skills/check/SKILL.md +367 -0
  32. package/src/skills/code-patterns/SKILL.md +280 -0
  33. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  34. package/src/skills/codex-code-review/SKILL.md +135 -0
  35. package/src/skills/collaborating-with-codex/SKILL.md +174 -0
  36. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  37. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  38. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  39. package/src/skills/crud/SKILL.md +265 -0
  40. package/src/skills/crud-development/SKILL.md +409 -0
  41. package/src/skills/data-permission/SKILL.md +292 -0
  42. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  43. package/src/skills/database-ops/SKILL.md +407 -0
  44. package/src/skills/dev/SKILL.md +187 -0
  45. package/src/skills/error-handler/SKILL.md +371 -0
  46. package/src/skills/file-oss-management/SKILL.md +255 -0
  47. package/src/skills/file-oss-management/references/entities.md +105 -0
  48. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  49. package/src/skills/git-workflow/SKILL.md +397 -0
  50. package/src/skills/init-docs/SKILL.md +194 -0
  51. package/src/skills/json-serialization/SKILL.md +357 -0
  52. package/src/skills/leniu-api-development/SKILL.md +319 -0
  53. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  54. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  55. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  56. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  57. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  58. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  59. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  60. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  61. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  62. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  63. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  64. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  65. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  66. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  67. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  68. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  69. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  70. package/src/skills/leniu-java-export/SKILL.md +570 -0
  71. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  72. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  73. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  74. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  75. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  76. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  77. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  78. package/src/skills/leniu-java-task/SKILL.md +367 -0
  79. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  80. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  81. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  82. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  83. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  84. package/src/skills/leniu-report-customization/SKILL.md +335 -0
  85. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  86. package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
  87. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  88. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  89. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  90. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  91. package/src/skills/mysql-debug/SKILL.md +364 -0
  92. package/src/skills/next/SKILL.md +137 -0
  93. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  94. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  95. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  96. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  97. package/src/skills/openspec-explore/SKILL.md +299 -0
  98. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  99. package/src/skills/openspec-new-change/SKILL.md +82 -0
  100. package/src/skills/openspec-onboard/SKILL.md +414 -0
  101. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  102. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  103. package/src/skills/performance-doctor/SKILL.md +303 -0
  104. package/src/skills/progress/SKILL.md +193 -0
  105. package/src/skills/project-navigator/SKILL.md +211 -0
  106. package/src/skills/redis-cache/SKILL.md +333 -0
  107. package/src/skills/redis-cache/references/listeners.md +23 -0
  108. package/src/skills/scheduled-jobs/SKILL.md +314 -0
  109. package/src/skills/security-guard/SKILL.md +353 -0
  110. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  111. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  112. package/src/skills/sms-mail/SKILL.md +308 -0
  113. package/src/skills/sms-mail/references/mail-config.md +88 -0
  114. package/src/skills/sms-mail/references/sms-config.md +74 -0
  115. package/src/skills/social-login/SKILL.md +266 -0
  116. package/src/skills/social-login/references/provider-configs.md +118 -0
  117. package/src/skills/start/SKILL.md +154 -0
  118. package/src/skills/store-pc/SKILL.md +366 -0
  119. package/src/skills/sync/SKILL.md +149 -0
  120. package/src/skills/task-tracker/SKILL.md +307 -0
  121. package/src/skills/tech-decision/SKILL.md +393 -0
  122. package/src/skills/tenant-management/SKILL.md +288 -0
  123. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  124. package/src/skills/test-development/SKILL.md +301 -0
  125. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  126. package/src/skills/ui-pc/SKILL.md +438 -0
  127. package/src/skills/update-status/SKILL.md +159 -0
  128. package/src/skills/utils-toolkit/SKILL.md +362 -0
  129. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  130. package/src/skills/websocket-sse/SKILL.md +271 -0
  131. package/src/skills/workflow-engine/SKILL.md +321 -0
@@ -0,0 +1,383 @@
1
+ ---
2
+ name: leniu-architecture-design
3
+ description: |
4
+ leniu-tengyun-core 项目架构设计指南。基于 pigx-framework 的云食堂双库架构,包含四层架构规范、双库多租户实现、模块划分、Entity 设计。
5
+
6
+ 触发场景:
7
+ - 新模块/新功能的架构设计与代码分层
8
+ - 双库架构(系统库+商户库)数据路由决策
9
+ - 四层架构(Controller→Business→Service→Mapper)编排
10
+ - 多租户数据隔离与跨租户操作
11
+ - Entity/DTO/VO 结构设计
12
+ - Mapper XML 文件放置与配置
13
+
14
+ 适用项目:
15
+ - leniu-tengyun-core:/Users/xujiajun/Developer/gongsi_proj/leniu-api/leniu-tengyun-core
16
+ - leniu-yunshitang:/Users/xujiajun/Developer/gongsi_proj/leniu-api/leniu-tengyun/leniu-yunshitang
17
+
18
+ 触发词:架构设计、双库架构、商户库、系统库、pigx框架、四层架构、模块划分、Business层、分层设计、代码结构
19
+ ---
20
+
21
+ # leniu-tengyun-core 架构设计指南
22
+
23
+ ## 双库架构
24
+
25
+ 物理分离双库,**Entity 无 tenant_id 字段**:
26
+
27
+ | 库类型 | 数据范围 | 访问方式 |
28
+ |--------|---------|---------|
29
+ | **系统库** | 租户信息、商户配置、系统字典 | `Executors.doInSystem()` |
30
+ | **商户库** | 订单、菜品、用户、设备等 | 默认(请求头 `MERCHANT-ID`) |
31
+
32
+ ### 多租户上下文切换
33
+
34
+ ```java
35
+ // 获取当前租户
36
+ Long tenantId = TenantContextHolder.getTenantId();
37
+
38
+ // 在指定商户库执行
39
+ Executors.doInTenant(tenantId, () -> { /* 商户库 */ });
40
+
41
+ // 在系统库执行
42
+ Executors.doInSystem(() -> { /* 系统库 */ });
43
+
44
+ // 遍历所有租户执行(定时任务场景)
45
+ Executors.doInAllTenant(tenantId -> { /* 每个租户 */ });
46
+ ```
47
+
48
+ ### 双库路由场景
49
+
50
+ ```java
51
+ // 场景1:商户业务(默认,前端请求头携带 MERCHANT-ID)
52
+ @PostMapping("/order/add")
53
+ public void addOrder(@RequestBody LeRequest<OrderDTO> request) {
54
+ orderService.add(request.getContent()); // 自动路由商户库
55
+ }
56
+
57
+ // 场景2:系统配置操作
58
+ @PostMapping("/merchant/config")
59
+ public void updateConfig(@RequestBody LeRequest<ConfigDTO> request) {
60
+ Executors.doInSystem(() -> configService.update(request.getContent()));
61
+ }
62
+
63
+ // 场景3:定时任务遍历所有租户
64
+ public void execute() {
65
+ Executors.doInAllTenant(tenantId -> reportService.generate(tenantId));
66
+ }
67
+
68
+ // 场景4:MQ 消费指定租户
69
+ @RabbitListener(queues = "order.queue")
70
+ public void consumeOrder(Message message) {
71
+ Long tenantId = getTenantFromMessage(message);
72
+ Executors.doInTenant(tenantId, () -> orderService.process(message));
73
+ }
74
+ ```
75
+
76
+ ---
77
+
78
+ ## 四层架构
79
+
80
+ ```
81
+ Controller → Business → Service → Mapper
82
+ ```
83
+
84
+ | 层 | 职责 | 命名 |
85
+ |----|------|------|
86
+ | **Controller** | 接收请求、参数校验、路由分端 | `XxxWebController` |
87
+ | **Business** | 业务编排、跨 Service 协调 | `XxxWebBusiness` |
88
+ | **Service** | 单表 CRUD、事务 | `XxxServiceImpl` |
89
+ | **Mapper** | ORM 映射(XML 同目录) | `XxxMapper` |
90
+
91
+ > **Business 层**是本项目核心特色,复杂逻辑在此编排,简单 CRUD 可跳过直接 Controller→Service。
92
+
93
+ ### Controller 示例
94
+
95
+ ```java
96
+ package net.xnzn.core.xxx.controller;
97
+
98
+ import com.pig4cloud.pigx.common.core.util.LeRequest;
99
+ import net.xnzn.framework.secure.filter.annotation.RequiresAuthentication;
100
+
101
+ @RestController
102
+ @RequiresAuthentication
103
+ @RequestMapping("/api/v2/web/xxx")
104
+ public class XxxWebController {
105
+
106
+ @Autowired
107
+ private XxxWebBusiness xxxBusiness;
108
+
109
+ @PostMapping("/add")
110
+ public void add(@Validated @RequestBody LeRequest<XxxDTO> request) {
111
+ xxxBusiness.add(request.getContent());
112
+ }
113
+
114
+ @PostMapping("/query")
115
+ public Page<XxxVO> query(@Validated @RequestBody LeRequest<PageDTO> request) {
116
+ return xxxBusiness.query(request.getContent());
117
+ }
118
+ }
119
+ ```
120
+
121
+ ### Business 示例
122
+
123
+ ```java
124
+ package net.xnzn.core.xxx.business.impl;
125
+
126
+ @Component
127
+ public class XxxWebBusiness {
128
+
129
+ @Autowired
130
+ private XxxServiceImpl xxxService;
131
+ @Autowired
132
+ private YyyServiceImpl yyyService;
133
+
134
+ public void add(XxxDTO dto) {
135
+ // 编排多个 Service
136
+ xxxService.add(dto);
137
+ yyyService.bindRelation(dto.getId());
138
+ }
139
+
140
+ public Page<XxxVO> query(PageDTO dto) {
141
+ return xxxService.query(dto);
142
+ }
143
+ }
144
+ ```
145
+
146
+ ### Service 示例
147
+
148
+ ```java
149
+ package net.xnzn.core.xxx.service.impl;
150
+
151
+ @Service
152
+ public class XxxServiceImpl {
153
+ @Autowired
154
+ private XxxMapper xxxMapper;
155
+
156
+ public void add(XxxDTO dto) {
157
+ long id = Id.next();
158
+ XxxEntity entity = new XxxEntity();
159
+ BeanUtil.copyProperties(dto, entity);
160
+ entity.setId(id);
161
+ xxxMapper.insert(entity);
162
+ }
163
+
164
+ public Page<XxxVO> query(PageDTO dto) {
165
+ return xxxMapper.page(dto.getMpPage(), dto.getKeyword());
166
+ }
167
+ }
168
+ ```
169
+
170
+ ### Mapper 示例
171
+
172
+ ```java
173
+ package net.xnzn.core.xxx.mapper;
174
+
175
+ @Mapper
176
+ public interface XxxMapper extends BaseMapper<XxxEntity> {
177
+ Page<XxxVO> page(Page<Object> page, @Param("keyword") String keyword);
178
+ }
179
+ ```
180
+
181
+ ### Mapper XML(与 Java 同目录)
182
+
183
+ ```
184
+ src/main/java/net/xnzn/core/xxx/mapper/
185
+ ├── XxxMapper.java
186
+ └── XxxMapper.xml ← 同目录,非 resources/mapper/
187
+ ```
188
+
189
+ **pom.xml 必须配置资源过滤:**
190
+ ```xml
191
+ <build>
192
+ <resources>
193
+ <resource>
194
+ <directory>src/main/java</directory>
195
+ <includes>
196
+ <include>**/*.xml</include>
197
+ </includes>
198
+ </resource>
199
+ <resource>
200
+ <directory>src/main/resources</directory>
201
+ </resource>
202
+ </resources>
203
+ </build>
204
+ ```
205
+
206
+ **XML 文件示例:**
207
+ ```xml
208
+ <?xml version="1.0" encoding="UTF-8"?>
209
+ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
210
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
211
+ <mapper namespace="net.xnzn.core.xxx.mapper.XxxMapper">
212
+ <select id="page" resultType="net.xnzn.core.xxx.vo.XxxVO">
213
+ SELECT id, name, status, crtime, uptime
214
+ FROM xxx_table
215
+ WHERE del_flag = 2
216
+ <if test="keyword != null and keyword != ''">
217
+ AND name LIKE CONCAT('%', #{keyword}, '%')
218
+ </if>
219
+ </select>
220
+ </mapper>
221
+ ```
222
+
223
+ ---
224
+
225
+ ## 多端 Controller 路由
226
+
227
+ | 端 | 路由前缀 | Controller 命名 |
228
+ |----|---------|----------------|
229
+ | Web 管理端 | `/api/v2/web/{module}` | `XxxWebController` |
230
+ | 移动端 | `/api/v2/mobile/{module}` | `XxxMobileController` |
231
+ | 设备端 | `/api/v2/android/{module}` | `XxxAndroidController` |
232
+ | 开放接口 | `/api/v2/open/{module}` | `XxxOpenController` |
233
+
234
+ ---
235
+
236
+ ## Entity 设计
237
+
238
+ ```java
239
+ package net.xnzn.core.xxx.model;
240
+
241
+ @Data
242
+ @TableName("xxx_table")
243
+ public class XxxEntity {
244
+
245
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
246
+ private Long id; // 雪花ID:Id.next()
247
+
248
+ private String name;
249
+ private Integer status;
250
+
251
+ // 审计字段
252
+ @TableField(fill = FieldFill.INSERT)
253
+ private String crby;
254
+ @TableField(fill = FieldFill.INSERT)
255
+ private LocalDateTime crtime;
256
+ @TableField(fill = FieldFill.INSERT_UPDATE)
257
+ private String upby;
258
+ @TableField(fill = FieldFill.INSERT_UPDATE)
259
+ private LocalDateTime uptime;
260
+
261
+ // 逻辑删除:1=删除,2=正常
262
+ private Integer delFlag;
263
+ }
264
+ ```
265
+
266
+ ### DelFlagEnum
267
+
268
+ ```java
269
+ public enum DelFlagEnum {
270
+ DEL_TRUE(1, "删除"),
271
+ DEL_FALSE(2, "正常");
272
+
273
+ private final Integer key;
274
+ private final String val;
275
+ }
276
+ ```
277
+
278
+ ### 对应建表 SQL
279
+
280
+ ```sql
281
+ CREATE TABLE xxx_table (
282
+ id BIGINT NOT NULL COMMENT '主键(雪花ID)',
283
+ name VARCHAR(100) COMMENT '名称',
284
+ status INT COMMENT '状态',
285
+ crby VARCHAR(64) COMMENT '创建人',
286
+ crtime DATETIME COMMENT '创建时间',
287
+ upby VARCHAR(64) COMMENT '更新人',
288
+ uptime DATETIME COMMENT '更新时间',
289
+ del_flag INT DEFAULT 2 COMMENT '删除标识(1-删除,2-正常)',
290
+ PRIMARY KEY (id)
291
+ );
292
+ -- 无需 tenant_id(双库物理隔离)
293
+ ```
294
+
295
+ ---
296
+
297
+ ## 请求响应封装
298
+
299
+ ```java
300
+ // 请求体:LeRequest<T> 包装
301
+ @PostMapping("/add")
302
+ public void add(@Validated @RequestBody LeRequest<XxxDTO> request) {
303
+ XxxDTO dto = request.getContent();
304
+ }
305
+
306
+ // 分页请求
307
+ @PostMapping("/query")
308
+ public Page<XxxVO> query(@Validated @RequestBody LeRequest<PageDTO> request) {
309
+ return xxxService.query(request.getContent());
310
+ }
311
+ ```
312
+
313
+ ### PageDTO
314
+
315
+ ```java
316
+ @Data
317
+ public class PageDTO {
318
+ @NotNull @Min(1)
319
+ private Integer pageNum;
320
+ @NotNull @Min(1)
321
+ private Integer pageSize;
322
+ private String keyword;
323
+
324
+ public Page<Object> getMpPage() {
325
+ return new Page<>(pageNum, pageSize);
326
+ }
327
+ }
328
+ ```
329
+
330
+ ---
331
+
332
+ ## 异常与国际化
333
+
334
+ ```java
335
+ // 业务异常
336
+ throw new LeException("业务错误信息");
337
+
338
+ // 带国际化
339
+ throw new LeException(I18n.getMessage("error.key"));
340
+ ```
341
+
342
+ ---
343
+
344
+ ## 项目模块结构
345
+
346
+ ```
347
+ leniu-tengyun-core/
348
+ ├── core-base/ # 公共基础模块
349
+ ├── sys-common/ # 公共业务(支付、通知、对接)
350
+ ├── sys-canteen/ # 食堂业务
351
+ ├── sys-kitchen/ # 后场厨房
352
+ ├── sys-drp/ # 供应链
353
+ ├── sys-logistics/ # 物流
354
+ └── sys-open/ # 开放接口
355
+ ```
356
+
357
+ ### 标准包结构
358
+
359
+ ```
360
+ net.xnzn.core.[module]/
361
+ ├── controller/ # 按端分:web/mobile/android
362
+ ├── business/impl/ # 业务编排
363
+ ├── service/impl/ # 服务层
364
+ ├── mapper/ # Mapper + XML(同目录)
365
+ ├── model/ # Entity
366
+ ├── vo/ # 响应对象
367
+ ├── dto/ # 请求参数
368
+ ├── constants/ # 枚举和常量
369
+ ├── mq/ # 消息队列
370
+ └── task/ # 定时任务
371
+ ```
372
+
373
+ ---
374
+
375
+ ## 参考代码位置
376
+
377
+ | 类型 | 路径 |
378
+ |------|------|
379
+ | 订单 Controller | `sys-canteen/.../order/web/controller/OrderInfoWebController.java` |
380
+ | 订单 Business | `sys-canteen/.../order/web/business/impl/OrderWebBusiness.java` |
381
+ | 订单 Service | `sys-canteen/.../order/common/service/impl/OrderInfoService.java` |
382
+ | 排班 Controller | `sys-kitchen/.../attendance/scheduling/controller/BackAttendanceWorkShiftController.java` |
383
+ | Bootstrap 配置 | `core-base/src/main/resources/bootstrap.yml` |
@@ -0,0 +1,277 @@
1
+ ---
2
+ name: leniu-backend-annotations
3
+ description: |
4
+ leniu-yunshitang-core 项目后端注解速查指南。包含认证、校验、Swagger、MyBatis-Plus、审计字段等注解的正确用法。
5
+
6
+ 触发场景:
7
+ - 配置 leniu 认证注解(@RequiresAuthentication, @RequiresGuest)
8
+ - 配置参数校验和分组校验(InsertGroup, UpdateGroup)
9
+ - 配置 Swagger 文档注解(@Api, @ApiOperation)
10
+ - 配置 Entity 审计字段注解
11
+ - 排查注解使用错误(javax vs jakarta、AddGroup vs InsertGroup)
12
+
13
+ 适用项目:leniu-tengyun-core(云食堂项目)
14
+
15
+ 触发词:@RequiresAuthentication、@RequiresGuest、@Validated、@NotNull、@Api、@ApiOperation、InsertGroup、UpdateGroup、注解用法、审计字段注解
16
+ ---
17
+
18
+ # leniu 后端注解速查
19
+
20
+ ## 注解总览
21
+
22
+ | 注解 | 作用层 | 包路径 | 场景 |
23
+ |------|--------|--------|------|
24
+ | `@RequiresAuthentication` | Controller 类/方法 | `net.xnzn.framework.secure.filter.annotation` | 需要登录 |
25
+ | `@RequiresGuest` | Controller 类/方法 | `net.xnzn.framework.secure.filter.annotation` | 允许游客 |
26
+ | `@Validated` | Controller 方法参数 | `org.springframework.validation.annotation` | 分组校验 |
27
+ | `@Valid` | Controller 方法参数 | `jakarta.validation` | 简单校验 |
28
+ | `@Api` | Controller 类 | `io.swagger.annotations` | Swagger 类文档 |
29
+ | `@ApiOperation` | Controller 方法 | `io.swagger.annotations` | Swagger 方法文档 |
30
+ | `@ApiModelProperty` | DTO/VO/Entity 字段 | `io.swagger.annotations` | Swagger 字段文档 |
31
+ | `@TableName` | Entity 类 | `com.baomidou.mybatisplus.annotation` | 表名映射 |
32
+ | `@TableId` | Entity 主键字段 | `com.baomidou.mybatisplus.annotation` | 主键策略 |
33
+ | `@TableField` | Entity 字段 | `com.baomidou.mybatisplus.annotation` | 字段映射/自动填充 |
34
+
35
+ ---
36
+
37
+ ## 1. 认证注解
38
+
39
+ ```java
40
+ import net.xnzn.framework.secure.filter.annotation.RequiresAuthentication;
41
+ import net.xnzn.framework.secure.filter.annotation.RequiresGuest;
42
+
43
+ @RestController
44
+ @RequiresAuthentication // 类级别:所有方法默认需登录
45
+ @RequestMapping("/api/v2/web/xxx")
46
+ @Api(tags = "XXX管理")
47
+ public class XxxController {
48
+
49
+ @PostMapping("/add") // 继承类级别:需要登录
50
+ @ApiOperation(value = "XXX-新增")
51
+ public void add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request) {
52
+ xxxService.add(request.getContent());
53
+ }
54
+
55
+ @RequiresGuest // 方法级别覆盖:允许游客
56
+ @GetMapping("/list")
57
+ @ApiOperation(value = "XXX-公开列表")
58
+ public List<XxxVO> list() {
59
+ return xxxService.list();
60
+ }
61
+ }
62
+ ```
63
+
64
+ ---
65
+
66
+ ## 2. 参数校验注解
67
+
68
+ ### 分组校验(新增/修改场景区分)
69
+
70
+ ```java
71
+ // 分组接口
72
+ public interface InsertGroup {}
73
+ public interface UpdateGroup {}
74
+
75
+ // Controller 中使用分组
76
+ @PostMapping("/add")
77
+ public void add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request) {}
78
+
79
+ @PostMapping("/update")
80
+ public void update(@Validated(UpdateGroup.class) @RequestBody LeRequest<XxxDTO> request) {}
81
+
82
+ // 不需要分组时用 @Valid 或 @Validated(不带参数)
83
+ @PostMapping("/query")
84
+ public Page<XxxVO> query(@Valid @RequestBody LeRequest<XxxQueryParam> request) {}
85
+ ```
86
+
87
+ ### DTO 校验字段
88
+
89
+ ```java
90
+ import jakarta.validation.constraints.*; // JDK 21 必须 jakarta
91
+
92
+ @Data
93
+ @ApiModel("XXX DTO")
94
+ public class XxxDTO implements Serializable {
95
+
96
+ @NotNull(message = "ID不能为空", groups = {UpdateGroup.class})
97
+ @ApiModelProperty("主键ID")
98
+ private Long id;
99
+
100
+ @NotBlank(message = "名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
101
+ @Size(max = 100, message = "名称长度不能超过100个字符")
102
+ @ApiModelProperty(value = "名称", required = true)
103
+ private String name;
104
+
105
+ @Min(value = 0, message = "状态不能小于0")
106
+ @Max(value = 1, message = "状态不能大于1")
107
+ @ApiModelProperty("状态")
108
+ private Integer status;
109
+
110
+ @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
111
+ @ApiModelProperty("手机号")
112
+ private String phone;
113
+
114
+ @Email(message = "邮箱格式不正确")
115
+ @ApiModelProperty("邮箱")
116
+ private String email;
117
+
118
+ @NotNull(message = "开始时间不能为空", groups = {InsertGroup.class, UpdateGroup.class})
119
+ @ApiModelProperty(value = "开始时间", required = true)
120
+ private Date startTime;
121
+
122
+ @Size(max = 500, message = "备注长度不能超过500个字符")
123
+ @ApiModelProperty("备注")
124
+ private String remark;
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ ## 3. Swagger 文档注解
131
+
132
+ ```java
133
+ import io.swagger.annotations.Api;
134
+ import io.swagger.annotations.ApiOperation;
135
+ import io.swagger.annotations.ApiModelProperty;
136
+ import io.swagger.annotations.ApiParam;
137
+
138
+ // 类级别
139
+ @Api(value = "XXX管理", tags = "XXX管理")
140
+ public class XxxController {}
141
+
142
+ // 方法级别
143
+ @ApiOperation(value = "XXX-分页查询")
144
+ @PostMapping("/page")
145
+ public Page<XxxVO> page(@Valid @RequestBody LeRequest<XxxDTO> request) {}
146
+
147
+ // 路径参数
148
+ @GetMapping("/get/{id}")
149
+ public XxxVO getById(@ApiParam(value = "主键ID", required = true) @PathVariable Long id) {}
150
+
151
+ // 查询参数
152
+ @PostMapping("/search")
153
+ public List<XxxVO> search(@ApiParam(value = "搜索关键词") @RequestParam(required = false) String keyword) {}
154
+ ```
155
+
156
+ ### VO 字段文档
157
+
158
+ ```java
159
+ @Data
160
+ @ApiModel("XXX VO")
161
+ public class XxxVO implements Serializable {
162
+
163
+ @ApiModelProperty("主键ID")
164
+ private Long id;
165
+
166
+ @ApiModelProperty("名称")
167
+ private String name;
168
+
169
+ @ApiModelProperty("创建时间")
170
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
171
+ private Date crtime;
172
+ }
173
+ ```
174
+
175
+ ---
176
+
177
+ ## 4. Entity 注解(MyBatis-Plus + 审计字段)
178
+
179
+ ```java
180
+ import com.baomidou.mybatisplus.annotation.*;
181
+
182
+ @Data
183
+ @TableName("xxx_table")
184
+ public class XxxEntity implements Serializable {
185
+
186
+ @ApiModelProperty("主键ID")
187
+ @TableId(value = "id", type = IdType.AUTO)
188
+ private Long id;
189
+
190
+ @ApiModelProperty("名称")
191
+ @TableField("name")
192
+ private String name;
193
+
194
+ // ===== 审计字段(leniu 标准) =====
195
+ @ApiModelProperty("创建人")
196
+ @TableField(value = "crby", fill = FieldFill.INSERT)
197
+ private String crby;
198
+
199
+ @ApiModelProperty("创建时间")
200
+ @TableField(value = "crtime", fill = FieldFill.INSERT)
201
+ private LocalDateTime crtime;
202
+
203
+ @ApiModelProperty("更新人")
204
+ @TableField(value = "upby", fill = FieldFill.INSERT_UPDATE)
205
+ private String upby;
206
+
207
+ @ApiModelProperty("更新时间")
208
+ @TableField(value = "uptime", fill = FieldFill.INSERT_UPDATE)
209
+ private LocalDateTime uptime;
210
+
211
+ @ApiModelProperty("删除标识(1-删除,2-正常)")
212
+ private Integer delFlag;
213
+ }
214
+ ```
215
+
216
+ ### Mapper 接口
217
+
218
+ ```java
219
+ import org.apache.ibatis.annotations.Mapper;
220
+ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
221
+
222
+ @Mapper
223
+ public interface XxxMapper extends BaseMapper<XxxEntity> {}
224
+ ```
225
+
226
+ ---
227
+
228
+ ## 5. 注解组合速查
229
+
230
+ | 层级 | 标准注解组合 |
231
+ |------|-------------|
232
+ | Controller 类 | `@Api` + `@RestController` + `@RequiresAuthentication` + `@RequestMapping` |
233
+ | 写操作方法 | `@ApiOperation` + `@PostMapping` + `@Validated(InsertGroup/UpdateGroup.class)` |
234
+ | 查询方法 | `@ApiOperation` + `@PostMapping` + `@Valid` 或 `@Validated` |
235
+ | DTO 字段 | `@ApiModelProperty` + `@NotNull/@NotBlank` + `(groups = {InsertGroup.class})` |
236
+ | Entity 类 | `@Data` + `@TableName` |
237
+ | Entity 主键 | `@ApiModelProperty` + `@TableId(type = IdType.AUTO)` |
238
+ | 审计字段 | `@ApiModelProperty` + `@TableField(fill = FieldFill.INSERT/INSERT_UPDATE)` |
239
+
240
+ ---
241
+
242
+ ## 6. 错误对比
243
+
244
+ | 错误写法 | 正确写法 | 说明 |
245
+ |---------|---------|------|
246
+ | `@SaCheckPermission("xxx")` | `@RequiresAuthentication` | leniu 不用 Sa-Token 细粒度权限 |
247
+ | `import javax.validation.*` | `import jakarta.validation.*` | JDK 21 必须 jakarta |
248
+ | `@Validated(AddGroup.class)` | `@Validated(InsertGroup.class)` | leniu 分组名为 InsertGroup |
249
+ | `import io.swagger.v3.oas.*` | `import io.swagger.annotations.*` | leniu 用 Swagger 2.0 |
250
+ | `@TableField("create_by")` | `@TableField(value = "crby", fill = FieldFill.INSERT)` | leniu 审计字段 |
251
+ | `@TableField("create_time")` | `@TableField(value = "crtime", fill = FieldFill.INSERT)` | leniu 审计字段 |
252
+ | `@TableId(type = IdType.ASSIGN_ID)` | `@TableId(type = IdType.AUTO)` | leniu 用自增主键 |
253
+ | Controller 缺 `@Api` | 必须加 `@Api(tags = "模块名")` | Swagger 文档要求 |
254
+ | 方法缺 `@ApiOperation` | 必须加 `@ApiOperation(value = "描述")` | Swagger 文档要求 |
255
+
256
+ ---
257
+
258
+ ## 检查清单
259
+
260
+ - [ ] 认证注解:`@RequiresAuthentication` 或 `@RequiresGuest`
261
+ - [ ] 校验包:`jakarta.validation`(非 `javax.validation`)
262
+ - [ ] 分组名:`InsertGroup` / `UpdateGroup`(非 `AddGroup` / `EditGroup`)
263
+ - [ ] Swagger 包:`io.swagger.annotations`(非 `io.swagger.v3.oas`)
264
+ - [ ] Controller 有 `@Api`,方法有 `@ApiOperation`
265
+ - [ ] DTO/VO 字段有 `@ApiModelProperty`
266
+ - [ ] Entity 主键:`@TableId(type = IdType.AUTO)`
267
+ - [ ] 审计字段:`crby/crtime/upby/uptime` + 正确的 `FieldFill`
268
+
269
+ ---
270
+
271
+ ## 参考代码位置
272
+
273
+ | 类型 | 路径 |
274
+ |------|------|
275
+ | Controller 示例 | `sys-canteen/.../order/web/controller/OrderInfoWebController.java` |
276
+ | DTO 示例 | `sys-kitchen/.../attendance/.../dto/` |
277
+ | Entity 示例 | `sys-canteen/.../order/common/model/OrderInfo.java` |