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.
- package/.claude/hooks/skill-forced-eval.js +4 -1
- package/.claude/settings.json +3 -3
- package/.claude/skills/add-skill/SKILL.md +252 -116
- package/.claude/skills/api-development/SKILL.md +83 -377
- package/.claude/skills/architecture-design/SKILL.md +138 -632
- package/.claude/skills/backend-annotations/SKILL.md +134 -506
- package/.claude/skills/banana-image/SKILL.md +10 -3
- package/.claude/skills/brainstorm/SKILL.md +103 -535
- package/.claude/skills/bug-detective/SKILL.md +147 -1097
- package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
- package/.claude/skills/code-patterns/SKILL.md +116 -426
- package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/.claude/skills/crud-development/SKILL.md +64 -304
- package/.claude/skills/data-permission/SKILL.md +105 -412
- package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
- package/.claude/skills/file-oss-management/SKILL.md +106 -714
- package/.claude/skills/file-oss-management/references/entities.md +105 -0
- package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
- package/.claude/skills/leniu-api-development/SKILL.md +142 -626
- package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
- package/.claude/skills/leniu-architecture-design/SKILL.md +176 -391
- package/.claude/skills/leniu-backend-annotations/SKILL.md +132 -519
- package/.claude/skills/leniu-brainstorm/SKILL.md +132 -541
- package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/.claude/skills/leniu-crud-development/SKILL.md +232 -938
- package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
- package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
- package/.claude/skills/leniu-data-permission/SKILL.md +70 -0
- package/.claude/skills/leniu-java-entity/SKILL.md +76 -590
- package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
- package/.claude/skills/leniu-java-export/SKILL.md +94 -379
- package/.claude/skills/leniu-java-logging/SKILL.md +106 -709
- package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/.claude/skills/leniu-java-mybatis/SKILL.md +73 -446
- package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/.claude/skills/leniu-report-customization/SKILL.md +111 -325
- package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.claude/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.claude/skills/leniu-security-guard/SKILL.md +133 -347
- package/.claude/skills/mysql-debug/SKILL.md +364 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +10 -1
- package/.claude/skills/openspec-archive-change/SKILL.md +9 -1
- package/.claude/skills/openspec-bulk-archive-change/SKILL.md +9 -1
- package/.claude/skills/openspec-continue-change/SKILL.md +9 -1
- package/.claude/skills/openspec-explore/SKILL.md +10 -1
- package/.claude/skills/openspec-ff-change/SKILL.md +9 -1
- package/.claude/skills/openspec-new-change/SKILL.md +9 -1
- package/.claude/skills/openspec-onboard/SKILL.md +15 -130
- package/.claude/skills/openspec-sync-specs/SKILL.md +9 -1
- package/.claude/skills/openspec-verify-change/SKILL.md +9 -1
- package/.claude/skills/performance-doctor/SKILL.md +110 -434
- package/.claude/skills/redis-cache/SKILL.md +89 -595
- package/.claude/skills/redis-cache/references/listeners.md +23 -0
- package/.claude/skills/scheduled-jobs/SKILL.md +88 -407
- package/.claude/skills/security-guard/SKILL.md +137 -532
- package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
- package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/.claude/skills/sms-mail/SKILL.md +116 -574
- package/.claude/skills/sms-mail/references/mail-config.md +88 -0
- package/.claude/skills/sms-mail/references/sms-config.md +74 -0
- package/.claude/skills/social-login/SKILL.md +112 -514
- package/.claude/skills/social-login/references/provider-configs.md +118 -0
- package/.claude/skills/tenant-management/SKILL.md +129 -444
- package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/.claude/skills/test-development/SKILL.md +86 -540
- package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
- package/.claude/skills/utils-toolkit/SKILL.md +52 -305
- package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/.claude/skills/websocket-sse/SKILL.md +105 -550
- package/.claude/skills/workflow-engine/SKILL.md +147 -502
- package/.codex/skills/add-skill/SKILL.md +252 -116
- package/.codex/skills/api-development/SKILL.md +172 -599
- package/.codex/skills/architecture-design/SKILL.md +138 -504
- package/.codex/skills/backend-annotations/SKILL.md +134 -496
- package/.codex/skills/banana-image/SKILL.md +10 -3
- package/.codex/skills/brainstorm/SKILL.md +103 -535
- package/.codex/skills/bug-detective/SKILL.md +147 -1097
- package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
- package/.codex/skills/code-patterns/SKILL.md +120 -282
- package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/.codex/skills/crud-development/SKILL.md +64 -292
- package/.codex/skills/data-permission/SKILL.md +108 -407
- package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
- package/.codex/skills/database-ops/SKILL.md +8 -154
- package/.codex/skills/error-handler/SKILL.md +10 -0
- package/.codex/skills/file-oss-management/SKILL.md +106 -714
- package/.codex/skills/file-oss-management/references/entities.md +105 -0
- package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
- package/.codex/skills/git-workflow/SKILL.md +27 -5
- package/.codex/skills/leniu-api-development/SKILL.md +142 -626
- package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
- package/.codex/skills/leniu-architecture-design/SKILL.md +176 -391
- package/.codex/skills/leniu-backend-annotations/SKILL.md +132 -519
- package/.codex/skills/leniu-brainstorm/SKILL.md +132 -541
- package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/.codex/skills/leniu-crud-development/SKILL.md +232 -938
- package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
- package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
- package/.codex/skills/leniu-data-permission/SKILL.md +70 -0
- package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.codex/skills/leniu-java-entity/SKILL.md +76 -590
- package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
- package/.codex/skills/leniu-java-export/SKILL.md +94 -379
- package/.codex/skills/leniu-java-logging/SKILL.md +106 -709
- package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/.codex/skills/leniu-java-mybatis/SKILL.md +73 -446
- package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/.codex/skills/leniu-report-customization/SKILL.md +111 -325
- package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.codex/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.codex/skills/leniu-security-guard/SKILL.md +133 -347
- package/.codex/skills/mysql-debug/SKILL.md +364 -0
- package/.codex/skills/openspec-apply-change/SKILL.md +10 -1
- package/.codex/skills/openspec-archive-change/SKILL.md +9 -1
- package/.codex/skills/openspec-bulk-archive-change/SKILL.md +9 -1
- package/.codex/skills/openspec-continue-change/SKILL.md +9 -1
- package/.codex/skills/openspec-explore/SKILL.md +10 -1
- package/.codex/skills/openspec-ff-change/SKILL.md +9 -1
- package/.codex/skills/openspec-new-change/SKILL.md +9 -1
- package/.codex/skills/openspec-onboard/SKILL.md +15 -130
- package/.codex/skills/openspec-sync-specs/SKILL.md +9 -1
- package/.codex/skills/openspec-verify-change/SKILL.md +9 -1
- package/.codex/skills/performance-doctor/SKILL.md +110 -434
- package/.codex/skills/project-navigator/SKILL.md +20 -1
- package/.codex/skills/redis-cache/SKILL.md +93 -589
- package/.codex/skills/redis-cache/references/listeners.md +23 -0
- package/.codex/skills/scheduled-jobs/SKILL.md +88 -407
- package/.codex/skills/security-guard/SKILL.md +141 -527
- package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
- package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/.codex/skills/sms-mail/SKILL.md +116 -574
- package/.codex/skills/sms-mail/references/mail-config.md +88 -0
- package/.codex/skills/sms-mail/references/sms-config.md +74 -0
- package/.codex/skills/social-login/SKILL.md +112 -514
- package/.codex/skills/social-login/references/provider-configs.md +118 -0
- package/.codex/skills/store-pc/SKILL.md +258 -383
- package/.codex/skills/tenant-management/SKILL.md +129 -444
- package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/.codex/skills/test-development/SKILL.md +86 -540
- package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
- package/.codex/skills/ui-pc/SKILL.md +350 -387
- package/.codex/skills/utils-toolkit/SKILL.md +52 -283
- package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/.codex/skills/websocket-sse/SKILL.md +105 -550
- package/.codex/skills/workflow-engine/SKILL.md +147 -502
- package/.cursor/hooks.json +3 -3
- package/.cursor/rules/skill-activation.mdc +2 -0
- package/.cursor/skills/add-skill/SKILL.md +252 -116
- package/.cursor/skills/api-development/SKILL.md +83 -377
- package/.cursor/skills/architecture-design/SKILL.md +138 -632
- package/.cursor/skills/backend-annotations/SKILL.md +134 -506
- package/.cursor/skills/banana-image/SKILL.md +10 -3
- package/.cursor/skills/brainstorm/SKILL.md +103 -535
- package/.cursor/skills/bug-detective/SKILL.md +147 -1097
- package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
- package/.cursor/skills/code-patterns/SKILL.md +116 -426
- package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/.cursor/skills/crud-development/SKILL.md +64 -304
- package/.cursor/skills/data-permission/SKILL.md +105 -412
- package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
- package/.cursor/skills/file-oss-management/SKILL.md +106 -714
- package/.cursor/skills/file-oss-management/references/entities.md +105 -0
- package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
- package/.cursor/skills/git-workflow/SKILL.md +27 -5
- package/.cursor/skills/leniu-api-development/SKILL.md +142 -626
- package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
- package/.cursor/skills/leniu-architecture-design/SKILL.md +176 -391
- package/.cursor/skills/leniu-backend-annotations/SKILL.md +132 -519
- package/.cursor/skills/leniu-brainstorm/SKILL.md +132 -541
- package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/.cursor/skills/leniu-crud-development/SKILL.md +232 -938
- package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
- package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
- package/.cursor/skills/leniu-data-permission/SKILL.md +70 -0
- package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.cursor/skills/leniu-java-entity/SKILL.md +76 -590
- package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +94 -379
- package/.cursor/skills/leniu-java-logging/SKILL.md +106 -709
- package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/.cursor/skills/leniu-java-mybatis/SKILL.md +73 -446
- package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/.cursor/skills/leniu-report-customization/SKILL.md +111 -325
- package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.cursor/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.cursor/skills/leniu-security-guard/SKILL.md +133 -347
- package/.cursor/skills/mysql-debug/SKILL.md +364 -0
- package/.cursor/skills/openspec-apply-change/SKILL.md +10 -1
- package/.cursor/skills/openspec-archive-change/SKILL.md +9 -1
- package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +9 -1
- package/.cursor/skills/openspec-continue-change/SKILL.md +9 -1
- package/.cursor/skills/openspec-explore/SKILL.md +10 -1
- package/.cursor/skills/openspec-ff-change/SKILL.md +9 -1
- package/.cursor/skills/openspec-new-change/SKILL.md +9 -1
- package/.cursor/skills/openspec-onboard/SKILL.md +15 -130
- package/.cursor/skills/openspec-sync-specs/SKILL.md +9 -1
- package/.cursor/skills/openspec-verify-change/SKILL.md +9 -1
- package/.cursor/skills/performance-doctor/SKILL.md +110 -434
- package/.cursor/skills/redis-cache/SKILL.md +89 -595
- package/.cursor/skills/redis-cache/references/listeners.md +23 -0
- package/.cursor/skills/scheduled-jobs/SKILL.md +88 -407
- package/.cursor/skills/security-guard/SKILL.md +137 -532
- package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
- package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/.cursor/skills/sms-mail/SKILL.md +116 -574
- package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
- package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
- package/.cursor/skills/social-login/SKILL.md +112 -514
- package/.cursor/skills/social-login/references/provider-configs.md +118 -0
- package/.cursor/skills/tenant-management/SKILL.md +129 -444
- package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/.cursor/skills/test-development/SKILL.md +86 -540
- package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
- package/.cursor/skills/utils-toolkit/SKILL.md +52 -305
- package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/.cursor/skills/websocket-sse/SKILL.md +105 -550
- package/.cursor/skills/workflow-engine/SKILL.md +147 -502
- package/AGENTS.md +1 -0
- 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
|
+
```
|