ai-engineering-init 1.3.3 → 1.4.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 (228) hide show
  1. package/.claude/hooks/skill-forced-eval.js +4 -1
  2. package/.claude/settings.json +3 -3
  3. package/.claude/skills/add-skill/SKILL.md +252 -116
  4. package/.claude/skills/api-development/SKILL.md +83 -377
  5. package/.claude/skills/architecture-design/SKILL.md +138 -632
  6. package/.claude/skills/backend-annotations/SKILL.md +134 -506
  7. package/.claude/skills/banana-image/SKILL.md +10 -3
  8. package/.claude/skills/brainstorm/SKILL.md +103 -535
  9. package/.claude/skills/bug-detective/SKILL.md +147 -1097
  10. package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
  11. package/.claude/skills/code-patterns/SKILL.md +116 -426
  12. package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  13. package/.claude/skills/crud-development/SKILL.md +64 -304
  14. package/.claude/skills/data-permission/SKILL.md +105 -412
  15. package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
  16. package/.claude/skills/file-oss-management/SKILL.md +106 -714
  17. package/.claude/skills/file-oss-management/references/entities.md +105 -0
  18. package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
  19. package/.claude/skills/leniu-api-development/SKILL.md +142 -626
  20. package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
  21. package/.claude/skills/leniu-architecture-design/SKILL.md +176 -391
  22. package/.claude/skills/leniu-backend-annotations/SKILL.md +132 -519
  23. package/.claude/skills/leniu-brainstorm/SKILL.md +132 -541
  24. package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  25. package/.claude/skills/leniu-crud-development/SKILL.md +232 -938
  26. package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
  27. package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
  28. package/.claude/skills/leniu-data-permission/SKILL.md +70 -0
  29. package/.claude/skills/leniu-java-entity/SKILL.md +76 -590
  30. package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
  31. package/.claude/skills/leniu-java-export/SKILL.md +94 -379
  32. package/.claude/skills/leniu-java-logging/SKILL.md +106 -709
  33. package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
  34. package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  35. package/.claude/skills/leniu-java-mybatis/SKILL.md +73 -446
  36. package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  37. package/.claude/skills/leniu-report-customization/SKILL.md +111 -325
  38. package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
  39. package/.claude/skills/leniu-report-standard-customization/SKILL.md +328 -0
  40. package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  41. package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  42. package/.claude/skills/leniu-security-guard/SKILL.md +133 -347
  43. package/.claude/skills/mysql-debug/SKILL.md +364 -0
  44. package/.claude/skills/openspec-apply-change/SKILL.md +10 -1
  45. package/.claude/skills/openspec-archive-change/SKILL.md +9 -1
  46. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  47. package/.claude/skills/openspec-continue-change/SKILL.md +9 -1
  48. package/.claude/skills/openspec-explore/SKILL.md +10 -1
  49. package/.claude/skills/openspec-ff-change/SKILL.md +9 -1
  50. package/.claude/skills/openspec-new-change/SKILL.md +9 -1
  51. package/.claude/skills/openspec-onboard/SKILL.md +15 -130
  52. package/.claude/skills/openspec-sync-specs/SKILL.md +9 -1
  53. package/.claude/skills/openspec-verify-change/SKILL.md +9 -1
  54. package/.claude/skills/performance-doctor/SKILL.md +110 -434
  55. package/.claude/skills/redis-cache/SKILL.md +89 -595
  56. package/.claude/skills/redis-cache/references/listeners.md +23 -0
  57. package/.claude/skills/scheduled-jobs/SKILL.md +88 -407
  58. package/.claude/skills/security-guard/SKILL.md +137 -532
  59. package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
  60. package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
  61. package/.claude/skills/sms-mail/SKILL.md +116 -574
  62. package/.claude/skills/sms-mail/references/mail-config.md +88 -0
  63. package/.claude/skills/sms-mail/references/sms-config.md +74 -0
  64. package/.claude/skills/social-login/SKILL.md +112 -514
  65. package/.claude/skills/social-login/references/provider-configs.md +118 -0
  66. package/.claude/skills/tenant-management/SKILL.md +129 -444
  67. package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
  68. package/.claude/skills/test-development/SKILL.md +86 -540
  69. package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
  70. package/.claude/skills/utils-toolkit/SKILL.md +52 -305
  71. package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  72. package/.claude/skills/websocket-sse/SKILL.md +105 -550
  73. package/.claude/skills/workflow-engine/SKILL.md +147 -502
  74. package/.codex/skills/add-skill/SKILL.md +252 -116
  75. package/.codex/skills/api-development/SKILL.md +172 -599
  76. package/.codex/skills/architecture-design/SKILL.md +138 -504
  77. package/.codex/skills/backend-annotations/SKILL.md +134 -496
  78. package/.codex/skills/banana-image/SKILL.md +10 -3
  79. package/.codex/skills/brainstorm/SKILL.md +103 -535
  80. package/.codex/skills/bug-detective/SKILL.md +147 -1097
  81. package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
  82. package/.codex/skills/code-patterns/SKILL.md +120 -282
  83. package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  84. package/.codex/skills/crud-development/SKILL.md +64 -292
  85. package/.codex/skills/data-permission/SKILL.md +108 -407
  86. package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
  87. package/.codex/skills/database-ops/SKILL.md +8 -154
  88. package/.codex/skills/error-handler/SKILL.md +10 -0
  89. package/.codex/skills/file-oss-management/SKILL.md +106 -714
  90. package/.codex/skills/file-oss-management/references/entities.md +105 -0
  91. package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
  92. package/.codex/skills/git-workflow/SKILL.md +27 -5
  93. package/.codex/skills/leniu-api-development/SKILL.md +142 -626
  94. package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
  95. package/.codex/skills/leniu-architecture-design/SKILL.md +176 -391
  96. package/.codex/skills/leniu-backend-annotations/SKILL.md +132 -519
  97. package/.codex/skills/leniu-brainstorm/SKILL.md +132 -541
  98. package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  99. package/.codex/skills/leniu-crud-development/SKILL.md +232 -938
  100. package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
  101. package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
  102. package/.codex/skills/leniu-data-permission/SKILL.md +70 -0
  103. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  104. package/.codex/skills/leniu-java-entity/SKILL.md +76 -590
  105. package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
  106. package/.codex/skills/leniu-java-export/SKILL.md +94 -379
  107. package/.codex/skills/leniu-java-logging/SKILL.md +106 -709
  108. package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
  109. package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  110. package/.codex/skills/leniu-java-mybatis/SKILL.md +73 -446
  111. package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  112. package/.codex/skills/leniu-report-customization/SKILL.md +111 -325
  113. package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
  114. package/.codex/skills/leniu-report-standard-customization/SKILL.md +328 -0
  115. package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  116. package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  117. package/.codex/skills/leniu-security-guard/SKILL.md +133 -347
  118. package/.codex/skills/mysql-debug/SKILL.md +364 -0
  119. package/.codex/skills/openspec-apply-change/SKILL.md +10 -1
  120. package/.codex/skills/openspec-archive-change/SKILL.md +9 -1
  121. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  122. package/.codex/skills/openspec-continue-change/SKILL.md +9 -1
  123. package/.codex/skills/openspec-explore/SKILL.md +10 -1
  124. package/.codex/skills/openspec-ff-change/SKILL.md +9 -1
  125. package/.codex/skills/openspec-new-change/SKILL.md +9 -1
  126. package/.codex/skills/openspec-onboard/SKILL.md +15 -130
  127. package/.codex/skills/openspec-sync-specs/SKILL.md +9 -1
  128. package/.codex/skills/openspec-verify-change/SKILL.md +9 -1
  129. package/.codex/skills/performance-doctor/SKILL.md +110 -434
  130. package/.codex/skills/project-navigator/SKILL.md +20 -1
  131. package/.codex/skills/redis-cache/SKILL.md +93 -589
  132. package/.codex/skills/redis-cache/references/listeners.md +23 -0
  133. package/.codex/skills/scheduled-jobs/SKILL.md +88 -407
  134. package/.codex/skills/security-guard/SKILL.md +141 -527
  135. package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
  136. package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
  137. package/.codex/skills/sms-mail/SKILL.md +116 -574
  138. package/.codex/skills/sms-mail/references/mail-config.md +88 -0
  139. package/.codex/skills/sms-mail/references/sms-config.md +74 -0
  140. package/.codex/skills/social-login/SKILL.md +112 -514
  141. package/.codex/skills/social-login/references/provider-configs.md +118 -0
  142. package/.codex/skills/store-pc/SKILL.md +258 -383
  143. package/.codex/skills/tenant-management/SKILL.md +129 -444
  144. package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
  145. package/.codex/skills/test-development/SKILL.md +86 -540
  146. package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
  147. package/.codex/skills/ui-pc/SKILL.md +350 -387
  148. package/.codex/skills/utils-toolkit/SKILL.md +52 -283
  149. package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  150. package/.codex/skills/websocket-sse/SKILL.md +105 -550
  151. package/.codex/skills/workflow-engine/SKILL.md +147 -502
  152. package/.cursor/hooks.json +3 -3
  153. package/.cursor/rules/skill-activation.mdc +2 -0
  154. package/.cursor/skills/add-skill/SKILL.md +252 -116
  155. package/.cursor/skills/api-development/SKILL.md +83 -377
  156. package/.cursor/skills/architecture-design/SKILL.md +138 -632
  157. package/.cursor/skills/backend-annotations/SKILL.md +134 -506
  158. package/.cursor/skills/banana-image/SKILL.md +10 -3
  159. package/.cursor/skills/brainstorm/SKILL.md +103 -535
  160. package/.cursor/skills/bug-detective/SKILL.md +147 -1097
  161. package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
  162. package/.cursor/skills/code-patterns/SKILL.md +116 -426
  163. package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  164. package/.cursor/skills/crud-development/SKILL.md +64 -304
  165. package/.cursor/skills/data-permission/SKILL.md +105 -412
  166. package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
  167. package/.cursor/skills/file-oss-management/SKILL.md +106 -714
  168. package/.cursor/skills/file-oss-management/references/entities.md +105 -0
  169. package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
  170. package/.cursor/skills/git-workflow/SKILL.md +27 -5
  171. package/.cursor/skills/leniu-api-development/SKILL.md +142 -626
  172. package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
  173. package/.cursor/skills/leniu-architecture-design/SKILL.md +176 -391
  174. package/.cursor/skills/leniu-backend-annotations/SKILL.md +132 -519
  175. package/.cursor/skills/leniu-brainstorm/SKILL.md +132 -541
  176. package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  177. package/.cursor/skills/leniu-crud-development/SKILL.md +232 -938
  178. package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
  179. package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
  180. package/.cursor/skills/leniu-data-permission/SKILL.md +70 -0
  181. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  182. package/.cursor/skills/leniu-java-entity/SKILL.md +76 -590
  183. package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
  184. package/.cursor/skills/leniu-java-export/SKILL.md +94 -379
  185. package/.cursor/skills/leniu-java-logging/SKILL.md +106 -709
  186. package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
  187. package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  188. package/.cursor/skills/leniu-java-mybatis/SKILL.md +73 -446
  189. package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  190. package/.cursor/skills/leniu-report-customization/SKILL.md +111 -325
  191. package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
  192. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +328 -0
  193. package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  194. package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  195. package/.cursor/skills/leniu-security-guard/SKILL.md +133 -347
  196. package/.cursor/skills/mysql-debug/SKILL.md +364 -0
  197. package/.cursor/skills/openspec-apply-change/SKILL.md +10 -1
  198. package/.cursor/skills/openspec-archive-change/SKILL.md +9 -1
  199. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  200. package/.cursor/skills/openspec-continue-change/SKILL.md +9 -1
  201. package/.cursor/skills/openspec-explore/SKILL.md +10 -1
  202. package/.cursor/skills/openspec-ff-change/SKILL.md +9 -1
  203. package/.cursor/skills/openspec-new-change/SKILL.md +9 -1
  204. package/.cursor/skills/openspec-onboard/SKILL.md +15 -130
  205. package/.cursor/skills/openspec-sync-specs/SKILL.md +9 -1
  206. package/.cursor/skills/openspec-verify-change/SKILL.md +9 -1
  207. package/.cursor/skills/performance-doctor/SKILL.md +110 -434
  208. package/.cursor/skills/redis-cache/SKILL.md +89 -595
  209. package/.cursor/skills/redis-cache/references/listeners.md +23 -0
  210. package/.cursor/skills/scheduled-jobs/SKILL.md +88 -407
  211. package/.cursor/skills/security-guard/SKILL.md +137 -532
  212. package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
  213. package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
  214. package/.cursor/skills/sms-mail/SKILL.md +116 -574
  215. package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
  216. package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
  217. package/.cursor/skills/social-login/SKILL.md +112 -514
  218. package/.cursor/skills/social-login/references/provider-configs.md +118 -0
  219. package/.cursor/skills/tenant-management/SKILL.md +129 -444
  220. package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
  221. package/.cursor/skills/test-development/SKILL.md +86 -540
  222. package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
  223. package/.cursor/skills/utils-toolkit/SKILL.md +52 -305
  224. package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  225. package/.cursor/skills/websocket-sse/SKILL.md +105 -550
  226. package/.cursor/skills/workflow-engine/SKILL.md +147 -502
  227. package/AGENTS.md +1 -0
  228. package/package.json +1 -1
@@ -0,0 +1,597 @@
1
+ # leniu CRUD 完整代码模板
2
+
3
+ > 本文件是 `leniu-crud-development` 技能的参考文档,包含完整的代码模板。
4
+
5
+ ## 1. Entity 完整模板
6
+
7
+ ```java
8
+ package net.xnzn.core.xxx.model;
9
+
10
+ import com.baomidou.mybatisplus.annotation.*;
11
+ import io.swagger.annotations.ApiModel;
12
+ import io.swagger.annotations.ApiModelProperty;
13
+ import lombok.Data;
14
+ import lombok.experimental.Accessors;
15
+
16
+ import java.io.Serializable;
17
+ import java.time.LocalDateTime;
18
+
19
+ /**
20
+ * XXX 对象
21
+ */
22
+ @Data
23
+ @Accessors(chain = true)
24
+ @TableName("xxx_table")
25
+ @ApiModel(value = "XXX对象", description = "XXX表")
26
+ public class XxxEntity implements Serializable {
27
+
28
+ private static final long serialVersionUID = 1L;
29
+
30
+ @ApiModelProperty("主键ID")
31
+ @TableId(value = "id", type = IdType.AUTO)
32
+ private Long id;
33
+
34
+ @ApiModelProperty("名称")
35
+ @TableField("name")
36
+ private String name;
37
+
38
+ @ApiModelProperty("状态")
39
+ @TableField("status")
40
+ private Integer status;
41
+
42
+ @ApiModelProperty("删除标识(1删除,2正常)")
43
+ @TableField("del_flag")
44
+ private Integer delFlag;
45
+
46
+ @ApiModelProperty("乐观锁")
47
+ @TableField("revision")
48
+ private Integer revision;
49
+
50
+ @ApiModelProperty("创建人")
51
+ @TableField(value = "crby", fill = FieldFill.INSERT)
52
+ private String crby;
53
+
54
+ @ApiModelProperty("创建时间")
55
+ @TableField(value = "crtime", fill = FieldFill.INSERT)
56
+ private LocalDateTime crtime;
57
+
58
+ @ApiModelProperty("更新人")
59
+ @TableField(value = "upby", fill = FieldFill.INSERT_UPDATE)
60
+ private String upby;
61
+
62
+ @ApiModelProperty("更新时间")
63
+ @TableField(value = "uptime", fill = FieldFill.INSERT_UPDATE)
64
+ private LocalDateTime uptime;
65
+ }
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 2. DTO 完整模板
71
+
72
+ ```java
73
+ package net.xnzn.core.xxx.dto;
74
+
75
+ import io.swagger.annotations.ApiModel;
76
+ import io.swagger.annotations.ApiModelProperty;
77
+ import lombok.Data;
78
+
79
+ import jakarta.validation.constraints.*;
80
+ import java.io.Serializable;
81
+ import java.util.Date;
82
+
83
+ /**
84
+ * XXX DTO
85
+ */
86
+ @Data
87
+ @ApiModel("XXX DTO")
88
+ public class XxxDTO implements Serializable {
89
+
90
+ private static final long serialVersionUID = 1L;
91
+
92
+ @ApiModelProperty(value = "主键ID")
93
+ @NotNull(message = "主键ID不能为空", groups = {UpdateGroup.class})
94
+ private Long id;
95
+
96
+ @ApiModelProperty(value = "名称", required = true)
97
+ @NotBlank(message = "名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
98
+ @Size(max = 100, message = "名称长度不能超过100个字符")
99
+ private String name;
100
+
101
+ @ApiModelProperty(value = "状态")
102
+ private Integer status;
103
+
104
+ @ApiModelProperty(value = "开始时间", required = true)
105
+ @NotNull(message = "开始时间不能为空", groups = {InsertGroup.class, UpdateGroup.class})
106
+ private Date startTime;
107
+
108
+ @ApiModelProperty(value = "结束时间", required = true)
109
+ @NotNull(message = "结束时间不能为空", groups = {InsertGroup.class, UpdateGroup.class})
110
+ private Date endTime;
111
+ }
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 3. VO 完整模板
117
+
118
+ ```java
119
+ package net.xnzn.core.xxx.vo;
120
+
121
+ import com.fasterxml.jackson.annotation.JsonFormat;
122
+ import io.swagger.annotations.ApiModel;
123
+ import io.swagger.annotations.ApiModelProperty;
124
+ import lombok.Data;
125
+
126
+ import java.io.Serializable;
127
+ import java.util.Date;
128
+
129
+ /**
130
+ * XXX VO
131
+ */
132
+ @Data
133
+ @ApiModel("XXX VO")
134
+ public class XxxVO implements Serializable {
135
+
136
+ private static final long serialVersionUID = 1L;
137
+
138
+ @ApiModelProperty("主键ID")
139
+ private Long id;
140
+
141
+ @ApiModelProperty("名称")
142
+ private String name;
143
+
144
+ @ApiModelProperty("状态")
145
+ private String status;
146
+
147
+ @ApiModelProperty("状态描述")
148
+ private String statusDesc;
149
+
150
+ @ApiModelProperty(value = "创建时间")
151
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
152
+ private Date crtime;
153
+
154
+ @ApiModelProperty(value = "更新时间")
155
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
156
+ private Date uptime;
157
+ }
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 4. Service 接口完整模板
163
+
164
+ ```java
165
+ package net.xnzn.core.xxx.service;
166
+
167
+ import net.xnzn.core.xxx.dto.XxxDTO;
168
+ import net.xnzn.core.xxx.vo.XxxVO;
169
+ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
170
+
171
+ import java.util.List;
172
+
173
+ /**
174
+ * XXX 服务接口
175
+ */
176
+ public interface XxxService {
177
+
178
+ Long add(XxxDTO dto);
179
+
180
+ void update(XxxDTO dto);
181
+
182
+ void delete(Long id);
183
+
184
+ XxxVO getById(Long id);
185
+
186
+ Page<XxxVO> page(XxxDTO dto);
187
+
188
+ List<XxxVO> list(XxxDTO dto);
189
+ }
190
+ ```
191
+
192
+ ---
193
+
194
+ ## 5. Service 实现完整模板
195
+
196
+ ```java
197
+ package net.xnzn.core.xxx.service.impl;
198
+
199
+ import cn.hutool.core.bean.BeanUtil;
200
+ import cn.hutool.core.collection.CollUtil;
201
+ import cn.hutool.core.util.ObjectUtil;
202
+ import cn.hutool.core.util.StrUtil;
203
+ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
204
+ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
205
+ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
206
+ import com.pig4cloud.pigx.common.core.exception.LeException;
207
+ import lombok.extern.slf4j.Slf4j;
208
+ import net.xnzn.core.xxx.dto.XxxDTO;
209
+ import net.xnzn.core.xxx.mapper.XxxMapper;
210
+ import net.xnzn.core.xxx.model.XxxEntity;
211
+ import net.xnzn.core.xxx.service.XxxService;
212
+ import net.xnzn.core.xxx.vo.XxxVO;
213
+ import org.springframework.stereotype.Service;
214
+ import org.springframework.transaction.annotation.Transactional;
215
+
216
+ import javax.annotation.Resource;
217
+ import java.util.Collections;
218
+ import java.util.List;
219
+ import java.util.Optional;
220
+ import java.util.stream.Collectors;
221
+
222
+ /**
223
+ * XXX 服务实现
224
+ */
225
+ @Slf4j
226
+ @Service
227
+ public class XxxServiceImpl implements XxxService {
228
+
229
+ @Resource
230
+ private XxxMapper xxxMapper;
231
+
232
+ @Override
233
+ @Transactional(rollbackFor = Exception.class)
234
+ public Long add(XxxDTO dto) {
235
+ log.info("开始新增XXX,名称: {}", dto.getName());
236
+
237
+ // 参数校验
238
+ if (StrUtil.isBlank(dto.getName())) {
239
+ throw new LeException("名称不能为空");
240
+ }
241
+
242
+ // 唯一性检查
243
+ LambdaQueryWrapper<XxxEntity> wrapper = Wrappers.lambdaQuery();
244
+ wrapper.eq(XxxEntity::getName, dto.getName());
245
+ wrapper.eq(XxxEntity::getDelFlag, 2);
246
+ Long count = xxxMapper.selectCount(wrapper);
247
+ if (count > 0) {
248
+ throw new LeException("名称已存在");
249
+ }
250
+
251
+ // 转换并保存
252
+ XxxEntity entity = BeanUtil.copyProperties(dto, XxxEntity.class);
253
+ entity.setDelFlag(2); // 正常状态
254
+
255
+ xxxMapper.insert(entity);
256
+
257
+ log.info("新增XXX成功,ID: {}", entity.getId());
258
+ return entity.getId();
259
+ }
260
+
261
+ @Override
262
+ @Transactional(rollbackFor = Exception.class)
263
+ public void update(XxxDTO dto) {
264
+ if (ObjectUtil.isNull(dto.getId())) {
265
+ throw new LeException("ID不能为空");
266
+ }
267
+
268
+ Optional.ofNullable(xxxMapper.selectById(dto.getId()))
269
+ .orElseThrow(() -> new LeException("记录不存在"));
270
+
271
+ XxxEntity entity = BeanUtil.copyProperties(dto, XxxEntity.class);
272
+ xxxMapper.updateById(entity);
273
+
274
+ log.info("更新XXX成功,ID: {}", dto.getId());
275
+ }
276
+
277
+ @Override
278
+ @Transactional(rollbackFor = Exception.class)
279
+ public void delete(Long id) {
280
+ if (ObjectUtil.isNull(id)) {
281
+ throw new LeException("ID不能为空");
282
+ }
283
+
284
+ Optional.ofNullable(xxxMapper.selectById(id))
285
+ .orElseThrow(() -> new LeException("记录不存在"));
286
+
287
+ // 逻辑删除
288
+ XxxEntity entity = new XxxEntity();
289
+ entity.setId(id);
290
+ entity.setDelFlag(1); // 删除状态
291
+
292
+ xxxMapper.updateById(entity);
293
+
294
+ log.info("删除XXX成功,ID: {}", id);
295
+ }
296
+
297
+ @Override
298
+ public XxxVO getById(Long id) {
299
+ if (ObjectUtil.isNull(id)) {
300
+ throw new LeException("ID不能为空");
301
+ }
302
+
303
+ XxxEntity entity = Optional.ofNullable(xxxMapper.selectById(id))
304
+ .orElseThrow(() -> new LeException("记录不存在"));
305
+
306
+ return BeanUtil.copyProperties(entity, XxxVO.class);
307
+ }
308
+
309
+ @Override
310
+ public Page<XxxVO> page(XxxDTO dto) {
311
+ LambdaQueryWrapper<XxxEntity> wrapper = buildWrapper(dto);
312
+
313
+ Page<XxxEntity> page = new Page<>(dto.getPageNum(), dto.getPageSize());
314
+ Page<XxxEntity> result = xxxMapper.selectPage(page, wrapper);
315
+
316
+ Page<XxxVO> voPage = new Page<>();
317
+ BeanUtil.copyProperties(result, voPage, "records");
318
+ voPage.setRecords(BeanUtil.copyToList(result.getRecords(), XxxVO.class));
319
+
320
+ return voPage;
321
+ }
322
+
323
+ @Override
324
+ public List<XxxVO> list(XxxDTO dto) {
325
+ LambdaQueryWrapper<XxxEntity> wrapper = buildWrapper(dto);
326
+ List<XxxEntity> list = xxxMapper.selectList(wrapper);
327
+
328
+ if (CollUtil.isEmpty(list)) {
329
+ return Collections.emptyList();
330
+ }
331
+
332
+ return list.stream()
333
+ .map(entity -> BeanUtil.copyProperties(entity, XxxVO.class))
334
+ .collect(Collectors.toList());
335
+ }
336
+
337
+ /**
338
+ * 构建查询条件
339
+ */
340
+ private LambdaQueryWrapper<XxxEntity> buildWrapper(XxxDTO dto) {
341
+ LambdaQueryWrapper<XxxEntity> wrapper = Wrappers.lambdaQuery();
342
+ wrapper.eq(XxxEntity::getDelFlag, 2);
343
+
344
+ if (StrUtil.isNotBlank(dto.getName())) {
345
+ wrapper.like(XxxEntity::getName, dto.getName());
346
+ }
347
+ if (ObjectUtil.isNotNull(dto.getStatus())) {
348
+ wrapper.eq(XxxEntity::getStatus, dto.getStatus());
349
+ }
350
+
351
+ wrapper.orderByDesc(XxxEntity::getCrtime);
352
+ return wrapper;
353
+ }
354
+ }
355
+ ```
356
+
357
+ ---
358
+
359
+ ## 6. Mapper 接口完整模板
360
+
361
+ ```java
362
+ package net.xnzn.core.xxx.mapper;
363
+
364
+ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
365
+ import net.xnzn.core.xxx.model.XxxEntity;
366
+ import org.apache.ibatis.annotations.Mapper;
367
+
368
+ /**
369
+ * XXX Mapper 接口
370
+ */
371
+ @Mapper
372
+ public interface XxxMapper extends BaseMapper<XxxEntity> {
373
+ // 继承 BaseMapper,自定义 SQL 在此添加方法并在 XML 中实现
374
+ }
375
+ ```
376
+
377
+ ---
378
+
379
+ ## 7. Mapper XML 完整模板(与 Java 同目录)
380
+
381
+ ```xml
382
+ <?xml version="1.0" encoding="UTF-8"?>
383
+ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
384
+ <mapper namespace="net.xnzn.core.xxx.mapper.XxxMapper">
385
+
386
+ <!-- 禁止使用 SELECT *,明确指定查询字段 -->
387
+ <select id="selectCustom" resultType="net.xnzn.core.xxx.model.XxxEntity">
388
+ SELECT id, name, status, del_flag, crby, crtime, upby, uptime
389
+ FROM xxx_table
390
+ WHERE del_flag = 2
391
+ </select>
392
+
393
+ </mapper>
394
+ ```
395
+
396
+ ---
397
+
398
+ ## 8. Controller 完整模板
399
+
400
+ ```java
401
+ package net.xnzn.core.xxx.controller;
402
+
403
+ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
404
+ import com.pig4cloud.pigx.common.core.util.LeRequest;
405
+ import io.swagger.annotations.Api;
406
+ import io.swagger.annotations.ApiOperation;
407
+ import lombok.extern.slf4j.Slf4j;
408
+ import net.xnzn.core.xxx.dto.XxxDTO;
409
+ import net.xnzn.core.xxx.service.XxxService;
410
+ import net.xnzn.core.xxx.vo.XxxVO;
411
+ import net.xnzn.framework.secure.filter.annotation.RequiresAuthentication;
412
+ import net.xnzn.framework.secure.filter.annotation.RequiresGuest;
413
+ import org.springframework.validation.annotation.Validated;
414
+ import org.springframework.web.bind.annotation.*;
415
+
416
+ import javax.annotation.Resource;
417
+ import java.util.List;
418
+
419
+ /**
420
+ * XXX 管理控制器
421
+ */
422
+ @Slf4j
423
+ @RestController
424
+ @RequestMapping("/api/v2/web/xxx")
425
+ @Api(tags = "XXX管理")
426
+ public class XxxWebController {
427
+
428
+ @Resource
429
+ private XxxService xxxService;
430
+
431
+ @PostMapping("/add")
432
+ @ApiOperation(value = "XXX-新增")
433
+ @RequiresAuthentication
434
+ public Long add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request) {
435
+ return xxxService.add(request.getContent());
436
+ }
437
+
438
+ @PostMapping("/update")
439
+ @ApiOperation(value = "XXX-修改")
440
+ @RequiresAuthentication
441
+ public void update(@Validated(UpdateGroup.class) @RequestBody LeRequest<XxxDTO> request) {
442
+ xxxService.update(request.getContent());
443
+ }
444
+
445
+ @PostMapping("/delete")
446
+ @ApiOperation(value = "XXX-删除")
447
+ @RequiresAuthentication
448
+ public void delete(@RequestBody LeRequest<Long> request) {
449
+ xxxService.delete(request.getContent());
450
+ }
451
+
452
+ @GetMapping("/get/{id}")
453
+ @ApiOperation(value = "XXX-获取详情")
454
+ @RequiresGuest
455
+ public XxxVO getById(@PathVariable Long id) {
456
+ return xxxService.getById(id);
457
+ }
458
+
459
+ @PostMapping("/page")
460
+ @ApiOperation(value = "XXX-分页查询")
461
+ @RequiresAuthentication
462
+ public Page<XxxVO> page(@Validated @RequestBody LeRequest<XxxDTO> request) {
463
+ return xxxService.page(request.getContent());
464
+ }
465
+
466
+ @PostMapping("/list")
467
+ @ApiOperation(value = "XXX-查询列表")
468
+ @RequiresGuest
469
+ public List<XxxVO> list(@RequestBody LeRequest<XxxDTO> request) {
470
+ return xxxService.list(request.getContent());
471
+ }
472
+ }
473
+ ```
474
+
475
+ ---
476
+
477
+ ## 9. 建表 SQL 完整模板
478
+
479
+ ```sql
480
+ CREATE TABLE `xxx_table` (
481
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
482
+
483
+ -- 业务字段
484
+ `name` VARCHAR(100) NOT NULL COMMENT '名称',
485
+ `status` TINYINT(1) DEFAULT 1 COMMENT '状态(0停用 1启用)',
486
+
487
+ -- 删除标识(注意:1=删除,2=正常)
488
+ `del_flag` TINYINT(1) DEFAULT 2 COMMENT '删除标识(1删除 2正常)',
489
+ `revision` INT DEFAULT 0 COMMENT '乐观锁版本号',
490
+
491
+ -- 审计字段
492
+ `crby` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
493
+ `crtime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
494
+ `upby` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
495
+ `uptime` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
496
+
497
+ PRIMARY KEY (`id`),
498
+ KEY `idx_status` (`status`),
499
+ KEY `idx_crtime` (`crtime`),
500
+ KEY `idx_del_flag` (`del_flag`)
501
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='XXX表';
502
+ -- 无需 tenant_id(双库物理隔离)
503
+ ```
504
+
505
+ ---
506
+
507
+ ## 10. 分组校验接口
508
+
509
+ ```java
510
+ // InsertGroup.java
511
+ public interface InsertGroup {}
512
+
513
+ // UpdateGroup.java
514
+ public interface UpdateGroup {}
515
+ ```
516
+
517
+ ---
518
+
519
+ ## 11. 多表事务操作模板
520
+
521
+ ```java
522
+ @Transactional(rollbackFor = Exception.class)
523
+ public void createOrderWithStock(OrderDTO dto) {
524
+ // 操作订单表
525
+ OrderEntity order = BeanUtil.copyProperties(dto, OrderEntity.class);
526
+ orderMapper.insert(order);
527
+
528
+ // 操作订单明细表
529
+ List<OrderDetailEntity> details = dto.getDetails().stream()
530
+ .map(d -> BeanUtil.copyProperties(d, OrderDetailEntity.class))
531
+ .collect(Collectors.toList());
532
+ orderDetailMapper.insert(details);
533
+
534
+ // 操作库存表
535
+ stockMapper.deduct(dto.getStockId(), dto.getQuantity());
536
+ }
537
+ ```
538
+
539
+ ---
540
+
541
+ ## 12. 代码质量模板
542
+
543
+ ### 空指针防护
544
+
545
+ ```java
546
+ // Optional 链式处理
547
+ XxxEntity entity = Optional.ofNullable(xxxMapper.selectById(id))
548
+ .orElseThrow(() -> new LeException("数据不存在"));
549
+ ```
550
+
551
+ ### 返回值兜底
552
+
553
+ ```java
554
+ public List<XxxVO> listByParam(XxxDTO dto) {
555
+ List<XxxEntity> list = xxxMapper.selectList(buildWrapper(dto));
556
+ if (CollUtil.isEmpty(list)) {
557
+ return Collections.emptyList();
558
+ }
559
+ return BeanUtil.copyToList(list, XxxVO.class);
560
+ }
561
+ ```
562
+
563
+ ### 集合参数防御
564
+
565
+ ```java
566
+ public List<XxxVO> selectByIds(List<Long> ids) {
567
+ if (CollUtil.isEmpty(ids)) {
568
+ return Collections.emptyList();
569
+ }
570
+ return BeanUtil.copyToList(xxxMapper.selectBatchIds(ids), XxxVO.class);
571
+ }
572
+ ```
573
+
574
+ ### 级联调用防护
575
+
576
+ ```java
577
+ String city = Optional.ofNullable(user)
578
+ .map(User::getAddress)
579
+ .map(Address::getCity)
580
+ .map(City::getName)
581
+ .orElse("未知");
582
+ ```
583
+
584
+ ### Stream 操作
585
+
586
+ ```java
587
+ // Java 21 使用 toList()
588
+ List<Long> ids = list.stream().map(XxxVO::getId).distinct().toList();
589
+
590
+ // 转 Map
591
+ Map<Long, XxxVO> map = list.stream()
592
+ .collect(Collectors.toMap(XxxVO::getId, Function.identity()));
593
+
594
+ // 分组
595
+ Map<Integer, List<XxxVO>> grouped = list.stream()
596
+ .collect(Collectors.groupingBy(XxxVO::getStatus));
597
+ ```