ai-engineering-init 1.10.0 → 1.11.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/agents/code-scanner.md +145 -0
- package/.claude/hooks/skill-forced-eval.js +2 -0
- package/.claude/skills/analyze-requirements/SKILL.md +112 -0
- package/.claude/skills/fix-bug/SKILL.md +166 -0
- package/.claude/skills/yunxiao-task-management/SKILL.md +170 -258
- package/.claude/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
- package/.codex/skills/analyze-requirements/SKILL.md +112 -0
- package/.codex/skills/dev/SKILL.md +131 -476
- package/.codex/skills/fix-bug/SKILL.md +166 -0
- package/.codex/skills/next/SKILL.md +42 -186
- package/.codex/skills/progress/SKILL.md +76 -147
- package/.codex/skills/yunxiao-task-management/SKILL.md +170 -258
- package/.codex/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
- package/.cursor/agents/code-scanner.md +145 -0
- package/.cursor/hooks/cursor-skill-eval.js +10 -0
- package/.cursor/rules/skill-activation.mdc +7 -0
- package/.cursor/skills/analyze-requirements/SKILL.md +112 -0
- package/.cursor/skills/fix-bug/SKILL.md +166 -0
- package/.cursor/skills/yunxiao-task-management/SKILL.md +170 -258
- package/.cursor/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
- package/AGENTS.md +44 -21
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/skills/analyze-requirements/SKILL.md +112 -0
- package/src/skills/fix-bug/SKILL.md +166 -0
- package/src/skills/yunxiao-task-management/SKILL.md +170 -258
- package/src/skills/yunxiao-task-management/templates//346/217/220/346/265/213/345/215/225/346/250/241/346/235/277.html +17 -0
|
@@ -1,532 +1,187 @@
|
|
|
1
|
-
# /dev - 开发新功能
|
|
2
|
-
|
|
3
|
-
智能开发向导,专为 leniu-tengyun-core(云食堂)四层架构设计。包含表结构设计、代码生成全流程。
|
|
4
|
-
|
|
5
|
-
## 适用场景
|
|
6
|
-
|
|
7
|
-
- ✅ 从零开始开发新业务功能
|
|
8
|
-
- ✅ 需要数据库表设计
|
|
9
|
-
- ✅ 需要完整的四层代码(Controller → Business → Service → Mapper)
|
|
10
|
-
|
|
11
1
|
---
|
|
2
|
+
name: dev
|
|
3
|
+
description: |
|
|
4
|
+
当需要从零开始开发新功能、完整开发流程时自动使用此 Skill。
|
|
12
5
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| 维度 | 轻量(直接开发) | 中等 | 复杂(建议 OpenSpec) |
|
|
20
|
-
|------|-----------------|------|---------------------|
|
|
21
|
-
| **表数量** | 1 张表 | 2-3 张表 | 4+ 张表 |
|
|
22
|
-
| **跨模块** | 单模块内 | 偶尔跨模块 | 多模块协作 |
|
|
23
|
-
| **业务流程** | 简单 CRUD | 状态流转 | 多步骤审批/复杂流程 |
|
|
24
|
-
| **接口数量** | ≤5 个 | 6-10 个 | >10 个 |
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要从零开始开发一个新功能
|
|
8
|
+
- 需要设计数据库表并生成代码
|
|
9
|
+
- 需要完整的开发流程引导
|
|
10
|
+
- 需要配置代码生成器并生成后端代码
|
|
25
11
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- **轻量/中等** → 继续本流程(`/dev`),直接进入第一步
|
|
29
|
-
- **复杂** → 提示用户:
|
|
30
|
-
```
|
|
31
|
-
此功能涉及 [X 张表 / 多模块协作 / 复杂流程],建议先用 OpenSpec 进行需求拆解:
|
|
32
|
-
- 快速拆解:/opsx:ff [功能名](一键生成 proposal → specs → design → tasks)
|
|
33
|
-
- 逐步拆解:/opsx:new [功能名](交互式逐步创建)
|
|
12
|
+
触发词:开发功能、dev、新功能、功能开发、从零开发、完整开发、开发新模块
|
|
13
|
+
---
|
|
34
14
|
|
|
35
|
-
|
|
15
|
+
# /dev - 开发新功能(RuoYi-Vue-Plus 纯后端版)
|
|
36
16
|
|
|
37
|
-
|
|
38
|
-
```
|
|
17
|
+
智能代码生成器配置助手,专为 RuoYi-Vue-Plus 三层架构(Controller→Service→Mapper)设计。
|
|
39
18
|
|
|
40
|
-
|
|
19
|
+
## 🎯 核心优势
|
|
20
|
+
- ✅ **纯后端专注**:无前端,专注后端 CRUD 代码生成
|
|
21
|
+
- ✅ **包名适配**:`org.dromara.*`
|
|
22
|
+
- ✅ **智能推断**:模块 → 表前缀 → 包名 → 图标自动识别
|
|
23
|
+
- ✅ **全自动配置**:代码生成器配置完整(gen_table + gen_table_column)
|
|
24
|
+
- ✅ **菜单权限**:自动生成完整的菜单和权限配置
|
|
41
25
|
|
|
42
|
-
|
|
26
|
+
## 🚀 执行流程
|
|
43
27
|
|
|
44
28
|
### 第一步:需求确认
|
|
45
29
|
|
|
46
|
-
询问用户:
|
|
47
|
-
|
|
48
30
|
```
|
|
49
31
|
请告诉我要开发的功能:
|
|
50
32
|
|
|
51
|
-
1.
|
|
52
|
-
2.
|
|
53
|
-
3. 端类型?(web管理端 / mobile移动端 / android设备端 / open开放接口)
|
|
33
|
+
1. **功能名称**?(如:广告管理、反馈管理)
|
|
34
|
+
2. **所属模块**?(system/business/其他)
|
|
54
35
|
```
|
|
55
36
|
|
|
56
|
-
|
|
37
|
+
**自动推断**:
|
|
57
38
|
|
|
58
|
-
| 模块 |
|
|
59
|
-
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
| sys-common | `net.xnzn.core.common` | `/api/v2/web/common` |
|
|
39
|
+
| 模块 | 表前缀 | 包名 | 上级菜单 |
|
|
40
|
+
|------|--------|------|---------|
|
|
41
|
+
| system | `sys_` | `org.dromara.system` | 系统管理 |
|
|
42
|
+
| business | `b_` | `org.dromara.business` | 业务管理 |
|
|
43
|
+
| 其他(如 demo) | `demo_` | `org.dromara.demo` | [模块]管理 |
|
|
64
44
|
|
|
65
45
|
---
|
|
66
46
|
|
|
67
|
-
###
|
|
47
|
+
### 第二步:功能重复检查(强制执行)⭐⭐⭐⭐⭐
|
|
48
|
+
|
|
49
|
+
**⚠️ 重要**:检查功能是否已存在,避免重复开发
|
|
68
50
|
|
|
69
51
|
```bash
|
|
70
|
-
#
|
|
71
|
-
Grep pattern: "[功能名]
|
|
52
|
+
# 1. 检查后端代码
|
|
53
|
+
Grep pattern: "[功能名]Service" path: ruoyi-modules/ output_mode: files_with_matches
|
|
54
|
+
Grep pattern: "[功能名]Controller" path: ruoyi-modules/ output_mode: files_with_matches
|
|
55
|
+
|
|
56
|
+
# 2. 检查数据库表
|
|
57
|
+
SHOW TABLES LIKE '[表前缀]%';
|
|
72
58
|
|
|
73
|
-
#
|
|
74
|
-
|
|
59
|
+
# 3. 检查菜单
|
|
60
|
+
SELECT menu_name FROM sys_menu WHERE menu_name LIKE '%[功能名]%';
|
|
75
61
|
```
|
|
76
62
|
|
|
77
|
-
|
|
78
|
-
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### 第三步:数据库现状分析(自动执行)
|
|
66
|
+
|
|
67
|
+
从 `ruoyi-admin/src/main/resources/application-dev.yml` 动态读取数据库配置。
|
|
79
68
|
|
|
80
69
|
---
|
|
81
70
|
|
|
82
|
-
###
|
|
71
|
+
### 第四步:智能表结构设计
|
|
83
72
|
|
|
84
|
-
####
|
|
73
|
+
#### 智能字段命名和推断
|
|
85
74
|
|
|
86
|
-
| 字段后缀 |
|
|
87
|
-
|
|
88
|
-
| `xxx_name`
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `is_xxx` |
|
|
75
|
+
| 字段后缀 | 推断结果 | 控件类型 | 查询方式 |
|
|
76
|
+
|---------|---------|---------|---------|
|
|
77
|
+
| `xxx_name` | 名称 | input | LIKE |
|
|
78
|
+
| `xxx_title` | 标题 | input | LIKE |
|
|
79
|
+
| `xxx_content` | 内容 | editor | 富文本 |
|
|
80
|
+
| `status` | 状态 | select | EQ + sys_normal_disable |
|
|
81
|
+
| `xxx_type` | 分类 | select | EQ + 自定义字典 |
|
|
82
|
+
| `is_xxx` | 是否 | radio | EQ + sys_boolean_flag |
|
|
83
|
+
| `xxx_amount` / `xxx_price` | 金额 | numberInput | EQ |
|
|
84
|
+
| `xxx_time` / `xxx_date` | 时间 | datetime | BETWEEN |
|
|
94
85
|
|
|
95
|
-
####
|
|
86
|
+
#### 标准表结构模板
|
|
96
87
|
|
|
97
88
|
```sql
|
|
98
|
-
CREATE TABLE
|
|
99
|
-
|
|
89
|
+
CREATE TABLE [表前缀]_[功能名] (
|
|
90
|
+
id BIGINT(20) NOT NULL COMMENT '主键ID',
|
|
91
|
+
tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
|
|
100
92
|
|
|
101
93
|
-- 业务字段
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
--
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
KEY `idx_status` (`status`),
|
|
117
|
-
KEY `idx_crtime` (`crtime`),
|
|
118
|
-
KEY `idx_del_flag` (`del_flag`)
|
|
119
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='[功能说明]表';
|
|
94
|
+
xxx_name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
95
|
+
xxx_type CHAR(1) DEFAULT '1' COMMENT '类型',
|
|
96
|
+
status CHAR(1) DEFAULT '1' COMMENT '状态(0停用 1正常)',
|
|
97
|
+
|
|
98
|
+
-- 审计字段
|
|
99
|
+
create_by BIGINT(20) DEFAULT NULL COMMENT '创建人',
|
|
100
|
+
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
101
|
+
update_by BIGINT(20) DEFAULT NULL COMMENT '更新人',
|
|
102
|
+
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
103
|
+
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
104
|
+
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志',
|
|
105
|
+
|
|
106
|
+
PRIMARY KEY (id)
|
|
107
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx表';
|
|
120
108
|
```
|
|
121
109
|
|
|
122
|
-
**⚠️ 重要规范**:
|
|
123
|
-
- `id` 使用雪花ID(`Id.next()`),不使用 `AUTO_INCREMENT`
|
|
124
|
-
- `del_flag`:`2=正常,1=删除`(与 RuoYi 的 `0=正常` 相反)
|
|
125
|
-
- 无需 `tenant_id` 字段(双库物理隔离)
|
|
126
|
-
- 无需 `create_dept` 字段(leniu 不使用)
|
|
127
|
-
|
|
128
110
|
---
|
|
129
111
|
|
|
130
|
-
###
|
|
112
|
+
### 第五步:生成方案并确认(仅此一次确认)
|
|
131
113
|
|
|
132
114
|
```markdown
|
|
133
|
-
## 代码生成方案
|
|
115
|
+
## 📋 代码生成方案
|
|
134
116
|
|
|
135
117
|
### 基本配置
|
|
136
|
-
-
|
|
137
|
-
- **模块**:
|
|
138
|
-
- **表名**:
|
|
139
|
-
- **Java
|
|
140
|
-
- **包名**:
|
|
141
|
-
-
|
|
142
|
-
|
|
143
|
-
###
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
| Mapper | `common/mapper/XxxMapper.java` | ORM 映射 |
|
|
150
|
-
| Entity | `common/model/Xxx.java` | 实体类 |
|
|
151
|
-
| DTO | `web/dto/XxxDTO.java` | 请求参数 |
|
|
152
|
-
| VO | `web/vo/XxxVO.java` | 返回对象 |
|
|
153
|
-
|
|
154
|
-
**确认开始生成?**(回复"确认"或"开始")
|
|
118
|
+
- **功能名称**:广告管理
|
|
119
|
+
- **模块**:business
|
|
120
|
+
- **表名**:b_ad
|
|
121
|
+
- **Java类名**:Ad
|
|
122
|
+
- **包名**:org.dromara.business
|
|
123
|
+
- **接口路径**:/business/ad
|
|
124
|
+
|
|
125
|
+
### 菜单配置
|
|
126
|
+
- **上级菜单**:业务管理 (menu_id: 1001)
|
|
127
|
+
- **菜单顺序**:20
|
|
128
|
+
- **菜单图标**:ad (自动匹配)
|
|
129
|
+
|
|
130
|
+
**确认开始生成?**
|
|
155
131
|
```
|
|
156
132
|
|
|
157
133
|
---
|
|
158
134
|
|
|
159
|
-
###
|
|
160
|
-
|
|
161
|
-
用户确认后,按以下顺序生成所有文件:
|
|
162
|
-
|
|
163
|
-
#### 5.1 Entity 实体类
|
|
164
|
-
|
|
165
|
-
```java
|
|
166
|
-
package net.xnzn.core.[模块].[功能].common.model;
|
|
167
|
-
|
|
168
|
-
import com.baomidou.mybatisplus.annotation.*;
|
|
169
|
-
import io.swagger.annotations.ApiModel;
|
|
170
|
-
import io.swagger.annotations.ApiModelProperty;
|
|
171
|
-
import lombok.Data;
|
|
172
|
-
import lombok.experimental.Accessors;
|
|
173
|
-
import java.io.Serializable;
|
|
174
|
-
import java.time.LocalDateTime;
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* [功能名称] 实体
|
|
178
|
-
*
|
|
179
|
-
* @author [作者]
|
|
180
|
-
* @date [日期]
|
|
181
|
-
*/
|
|
182
|
-
@Data
|
|
183
|
-
@Accessors(chain = true)
|
|
184
|
-
@TableName("[表名]")
|
|
185
|
-
@ApiModel("[功能名称]")
|
|
186
|
-
public class [实体名] implements Serializable {
|
|
187
|
-
|
|
188
|
-
@ApiModelProperty("主键ID")
|
|
189
|
-
@TableId(value = "id", type = IdType.INPUT)
|
|
190
|
-
private Long id;
|
|
191
|
-
|
|
192
|
-
@ApiModelProperty("名称")
|
|
193
|
-
@TableField("xxx_name")
|
|
194
|
-
private String xxxName;
|
|
195
|
-
|
|
196
|
-
// 审计字段
|
|
197
|
-
@ApiModelProperty("删除标识(1删除,2正常)")
|
|
198
|
-
@TableField("del_flag")
|
|
199
|
-
private Integer delFlag;
|
|
200
|
-
|
|
201
|
-
@ApiModelProperty("创建人")
|
|
202
|
-
@TableField(value = "crby", fill = FieldFill.INSERT)
|
|
203
|
-
private String crby;
|
|
204
|
-
|
|
205
|
-
@ApiModelProperty("创建时间")
|
|
206
|
-
@TableField(value = "crtime", fill = FieldFill.INSERT)
|
|
207
|
-
private LocalDateTime crtime;
|
|
208
|
-
|
|
209
|
-
@ApiModelProperty("更新人")
|
|
210
|
-
@TableField(value = "upby", fill = FieldFill.INSERT_UPDATE)
|
|
211
|
-
private String upby;
|
|
212
|
-
|
|
213
|
-
@ApiModelProperty("更新时间")
|
|
214
|
-
@TableField(value = "uptime", fill = FieldFill.INSERT_UPDATE)
|
|
215
|
-
private LocalDateTime uptime;
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
#### 5.2 DTO 请求参数
|
|
220
|
-
|
|
221
|
-
```java
|
|
222
|
-
package net.xnzn.core.[模块].[功能].web.dto;
|
|
223
|
-
|
|
224
|
-
import io.swagger.annotations.ApiModel;
|
|
225
|
-
import io.swagger.annotations.ApiModelProperty;
|
|
226
|
-
import lombok.Data;
|
|
227
|
-
import jakarta.validation.constraints.*;
|
|
228
|
-
import java.io.Serializable;
|
|
229
|
-
|
|
230
|
-
@Data
|
|
231
|
-
@ApiModel("[功能名称] 请求参数")
|
|
232
|
-
public class [实体名]DTO implements Serializable {
|
|
233
|
-
|
|
234
|
-
@ApiModelProperty("主键ID(修改时必填)")
|
|
235
|
-
@NotNull(message = "ID不能为空", groups = {UpdateGroup.class})
|
|
236
|
-
private Long id;
|
|
237
|
-
|
|
238
|
-
@ApiModelProperty("名称")
|
|
239
|
-
@NotBlank(message = "名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
|
|
240
|
-
@Size(max = 100, message = "名称不能超过100个字符")
|
|
241
|
-
private String xxxName;
|
|
242
|
-
|
|
243
|
-
// 分页参数(查询接口使用)
|
|
244
|
-
@ApiModelProperty("页码")
|
|
245
|
-
private Integer pageNum = 1;
|
|
246
|
-
|
|
247
|
-
@ApiModelProperty("每页条数")
|
|
248
|
-
private Integer pageSize = 10;
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
#### 5.3 VO 返回对象
|
|
135
|
+
### 第六步:自动执行生成(无需确认)
|
|
253
136
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
import io.swagger.annotations.ApiModel;
|
|
259
|
-
import io.swagger.annotations.ApiModelProperty;
|
|
260
|
-
import lombok.Data;
|
|
261
|
-
import java.io.Serializable;
|
|
262
|
-
import java.time.LocalDateTime;
|
|
263
|
-
|
|
264
|
-
@Data
|
|
265
|
-
@ApiModel("[功能名称] 返回对象")
|
|
266
|
-
public class [实体名]VO implements Serializable {
|
|
267
|
-
|
|
268
|
-
@ApiModelProperty("主键ID")
|
|
269
|
-
private Long id;
|
|
270
|
-
|
|
271
|
-
@ApiModelProperty("名称")
|
|
272
|
-
private String xxxName;
|
|
273
|
-
|
|
274
|
-
@ApiModelProperty("创建时间")
|
|
275
|
-
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
|
276
|
-
private LocalDateTime crtime;
|
|
277
|
-
}
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
#### 5.4 Mapper 接口(与 XML 同目录)
|
|
281
|
-
|
|
282
|
-
```java
|
|
283
|
-
package net.xnzn.core.[模块].[功能].common.mapper;
|
|
284
|
-
|
|
285
|
-
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
286
|
-
import net.xnzn.core.[模块].[功能].common.model.[实体名];
|
|
287
|
-
import org.apache.ibatis.annotations.Mapper;
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* [功能名称] Mapper
|
|
291
|
-
*/
|
|
292
|
-
@Mapper
|
|
293
|
-
public interface [实体名]Mapper extends BaseMapper<[实体名]> {
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
#### 5.5 Service 实现
|
|
298
|
-
|
|
299
|
-
```java
|
|
300
|
-
package net.xnzn.core.[模块].[功能].common.service.impl;
|
|
301
|
-
|
|
302
|
-
import cn.hutool.core.bean.BeanUtil;
|
|
303
|
-
import cn.hutool.core.util.ObjectUtil;
|
|
304
|
-
import cn.hutool.core.util.StrUtil;
|
|
305
|
-
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
306
|
-
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
307
|
-
import com.pig4cloud.pigx.common.core.exception.LeException;
|
|
308
|
-
import lombok.extern.slf4j.Slf4j;
|
|
309
|
-
import net.xnzn.core.[模块].[功能].web.dto.[实体名]DTO;
|
|
310
|
-
import net.xnzn.core.[模块].[功能].common.mapper.[实体名]Mapper;
|
|
311
|
-
import net.xnzn.core.[模块].[功能].common.model.[实体名];
|
|
312
|
-
import net.xnzn.core.[模块].[功能].web.vo.[实体名]VO;
|
|
313
|
-
import net.xnzn.framework.id.Id;
|
|
314
|
-
import org.springframework.stereotype.Service;
|
|
315
|
-
import org.springframework.transaction.annotation.Transactional;
|
|
316
|
-
|
|
317
|
-
import javax.annotation.Resource;
|
|
318
|
-
import java.util.Collections;
|
|
319
|
-
import java.util.List;
|
|
320
|
-
import java.util.Optional;
|
|
321
|
-
|
|
322
|
-
@Slf4j
|
|
323
|
-
@Service
|
|
324
|
-
public class [实体名]Service {
|
|
325
|
-
|
|
326
|
-
@Resource
|
|
327
|
-
private [实体名]Mapper [实体名小写]Mapper;
|
|
328
|
-
|
|
329
|
-
@Transactional(rollbackFor = Exception.class)
|
|
330
|
-
public Long add([实体名]DTO dto) {
|
|
331
|
-
[实体名] entity = BeanUtil.copyProperties(dto, [实体名].class);
|
|
332
|
-
entity.setId(Id.next());
|
|
333
|
-
entity.setDelFlag(2); // 2=正常
|
|
334
|
-
[实体名小写]Mapper.insert(entity);
|
|
335
|
-
return entity.getId();
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
@Transactional(rollbackFor = Exception.class)
|
|
339
|
-
public void update([实体名]DTO dto) {
|
|
340
|
-
Optional.ofNullable([实体名小写]Mapper.selectById(dto.getId()))
|
|
341
|
-
.orElseThrow(() -> new LeException("记录不存在"));
|
|
342
|
-
[实体名] entity = BeanUtil.copyProperties(dto, [实体名].class);
|
|
343
|
-
[实体名小写]Mapper.updateById(entity);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
@Transactional(rollbackFor = Exception.class)
|
|
347
|
-
public void delete(Long id) {
|
|
348
|
-
Optional.ofNullable([实体名小写]Mapper.selectById(id))
|
|
349
|
-
.orElseThrow(() -> new LeException("记录不存在"));
|
|
350
|
-
[实体名] entity = new [实体名]().setId(id).setDelFlag(1); // 1=删除
|
|
351
|
-
[实体名小写]Mapper.updateById(entity);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
public [实体名]VO getById(Long id) {
|
|
355
|
-
[实体名] entity = Optional.ofNullable([实体名小写]Mapper.selectById(id))
|
|
356
|
-
.orElseThrow(() -> new LeException("记录不存在"));
|
|
357
|
-
return BeanUtil.copyProperties(entity, [实体名]VO.class);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
public List<[实体名]VO> list([实体名]DTO dto) {
|
|
361
|
-
LambdaQueryWrapper<[实体名]> wrapper = buildWrapper(dto);
|
|
362
|
-
List<[实体名]> list = [实体名小写]Mapper.selectList(wrapper);
|
|
363
|
-
if (list == null || list.isEmpty()) {
|
|
364
|
-
return Collections.emptyList();
|
|
365
|
-
}
|
|
366
|
-
return BeanUtil.copyToList(list, [实体名]VO.class);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
private LambdaQueryWrapper<[实体名]> buildWrapper([实体名]DTO dto) {
|
|
370
|
-
LambdaQueryWrapper<[实体名]> wrapper = Wrappers.lambdaQuery();
|
|
371
|
-
wrapper.eq([实体名]::getDelFlag, 2); // 只查正常数据
|
|
372
|
-
if (StrUtil.isNotBlank(dto.getXxxName())) {
|
|
373
|
-
wrapper.like([实体名]::getXxxName, dto.getXxxName());
|
|
374
|
-
}
|
|
375
|
-
wrapper.orderByDesc([实体名]::getCrtime);
|
|
376
|
-
return wrapper;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
#### 5.6 Business 业务层
|
|
382
|
-
|
|
383
|
-
```java
|
|
384
|
-
package net.xnzn.core.[模块].[功能].web.business.impl;
|
|
385
|
-
|
|
386
|
-
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
387
|
-
import com.github.pagehelper.page.PageMethod;
|
|
388
|
-
import net.xnzn.core.[模块].[功能].web.dto.[实体名]DTO;
|
|
389
|
-
import net.xnzn.core.[模块].[功能].common.service.impl.[实体名]Service;
|
|
390
|
-
import net.xnzn.core.[模块].[功能].web.vo.[实体名]VO;
|
|
391
|
-
import lombok.extern.slf4j.Slf4j;
|
|
392
|
-
import org.springframework.stereotype.Service;
|
|
393
|
-
|
|
394
|
-
import javax.annotation.Resource;
|
|
395
|
-
import java.util.List;
|
|
396
|
-
|
|
397
|
-
@Slf4j
|
|
398
|
-
@Service
|
|
399
|
-
public class [实体名]WebBusiness {
|
|
400
|
-
|
|
401
|
-
@Resource
|
|
402
|
-
private [实体名]Service [实体名小写]Service;
|
|
403
|
-
|
|
404
|
-
public Long add([实体名]DTO dto) {
|
|
405
|
-
return [实体名小写]Service.add(dto);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
public void update([实体名]DTO dto) {
|
|
409
|
-
[实体名小写]Service.update(dto);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
public void delete(Long id) {
|
|
413
|
-
[实体名小写]Service.delete(id);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
public [实体名]VO getById(Long id) {
|
|
417
|
-
return [实体名小写]Service.getById(id);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
public List<[实体名]VO> page([实体名]DTO dto) {
|
|
421
|
-
PageMethod.startPage(dto.getPageNum(), dto.getPageSize());
|
|
422
|
-
return [实体名小写]Service.list(dto);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
#### 5.7 Controller 接口层
|
|
428
|
-
|
|
429
|
-
```java
|
|
430
|
-
package net.xnzn.core.[模块].[功能].web.controller;
|
|
431
|
-
|
|
432
|
-
import com.pig4cloud.pigx.common.core.util.LeRequest;
|
|
433
|
-
import io.swagger.annotations.Api;
|
|
434
|
-
import io.swagger.annotations.ApiOperation;
|
|
435
|
-
import lombok.extern.slf4j.Slf4j;
|
|
436
|
-
import net.xnzn.core.[模块].[功能].web.business.impl.[实体名]WebBusiness;
|
|
437
|
-
import net.xnzn.core.[模块].[功能].web.dto.[实体名]DTO;
|
|
438
|
-
import net.xnzn.core.[模块].[功能].web.vo.[实体名]VO;
|
|
439
|
-
import net.xnzn.framework.secure.filter.annotation.RequiresAuthentication;
|
|
440
|
-
import org.springframework.validation.annotation.Validated;
|
|
441
|
-
import org.springframework.web.bind.annotation.*;
|
|
442
|
-
|
|
443
|
-
import javax.annotation.Resource;
|
|
444
|
-
import java.util.List;
|
|
445
|
-
|
|
446
|
-
@Slf4j
|
|
447
|
-
@RestController
|
|
448
|
-
@RequestMapping("/api/v2/web/[模块]/[功能]")
|
|
449
|
-
@Api(tags = "[功能名称]管理")
|
|
450
|
-
public class [实体名]WebController {
|
|
451
|
-
|
|
452
|
-
@Resource
|
|
453
|
-
private [实体名]WebBusiness [实体名小写]Business;
|
|
454
|
-
|
|
455
|
-
@PostMapping("/add")
|
|
456
|
-
@ApiOperation("新增")
|
|
457
|
-
@RequiresAuthentication
|
|
458
|
-
public Long add(@Validated(InsertGroup.class) @RequestBody LeRequest<[实体名]DTO> request) {
|
|
459
|
-
return [实体名小写]Business.add(request.getContent());
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
@PostMapping("/update")
|
|
463
|
-
@ApiOperation("修改")
|
|
464
|
-
@RequiresAuthentication
|
|
465
|
-
public void update(@Validated(UpdateGroup.class) @RequestBody LeRequest<[实体名]DTO> request) {
|
|
466
|
-
[实体名小写]Business.update(request.getContent());
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
@PostMapping("/delete")
|
|
470
|
-
@ApiOperation("删除")
|
|
471
|
-
@RequiresAuthentication
|
|
472
|
-
public void delete(@RequestBody LeRequest<Long> request) {
|
|
473
|
-
[实体名小写]Business.delete(request.getContent());
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
@GetMapping("/get/{id}")
|
|
477
|
-
@ApiOperation("获取详情")
|
|
478
|
-
@RequiresAuthentication
|
|
479
|
-
public [实体名]VO getById(@PathVariable Long id) {
|
|
480
|
-
return [实体名小写]Business.getById(id);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
@PostMapping("/page")
|
|
484
|
-
@ApiOperation("分页查询")
|
|
485
|
-
@RequiresAuthentication
|
|
486
|
-
public List<[实体名]VO> page(@RequestBody LeRequest<[实体名]DTO> request) {
|
|
487
|
-
return [实体名小写]Business.page(request.getContent());
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
```
|
|
137
|
+
用户确认后,AI 自动执行:
|
|
138
|
+
1. 建表 SQL
|
|
139
|
+
2. 创建字典(如需要)
|
|
140
|
+
3. 生成代码生成器配置 SQL
|
|
491
141
|
|
|
492
142
|
---
|
|
493
143
|
|
|
494
|
-
###
|
|
144
|
+
### 第七步:完成报告
|
|
495
145
|
|
|
496
146
|
```markdown
|
|
497
|
-
##
|
|
498
|
-
|
|
499
|
-
###
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
147
|
+
## 🎉 代码生成方案配置完成!
|
|
148
|
+
|
|
149
|
+
### 已完成
|
|
150
|
+
- ✅ 数据库表创建:b_ad
|
|
151
|
+
- ✅ 业务字典创建:b_ad_type(3 个字典项)
|
|
152
|
+
- ✅ 菜单配置:广告管理(自动导入启用)
|
|
153
|
+
- ✅ 代码生成配置:表 + 11 个字段
|
|
154
|
+
|
|
155
|
+
## 🚀 下一步:前往代码生成器生成代码
|
|
156
|
+
|
|
157
|
+
1. **登录系统后台**:http://localhost:8080
|
|
158
|
+
2. **导航**:系统工具 → 代码生成
|
|
159
|
+
3. **查找表**:找到 `b_ad` 表
|
|
160
|
+
4. **生成代码**:点击【生成代码】按钮
|
|
161
|
+
5. **重启服务**:代码生成后需重启后端服务
|
|
162
|
+
|
|
163
|
+
### 生成后的文件结构
|
|
164
|
+
|
|
165
|
+
\`\`\`
|
|
166
|
+
ruoyi-system/
|
|
167
|
+
├── controller/business/AdController.java
|
|
168
|
+
├── domain/Ad.java
|
|
169
|
+
├── domain/bo/AdBo.java
|
|
170
|
+
├── domain/vo/AdVo.java
|
|
171
|
+
├── mapper/AdMapper.java
|
|
172
|
+
├── service/IAdService.java
|
|
173
|
+
└── service/impl/AdServiceImpl.java
|
|
174
|
+
\`\`\`
|
|
517
175
|
```
|
|
518
176
|
|
|
519
177
|
---
|
|
520
178
|
|
|
521
|
-
## 执行规则
|
|
522
|
-
|
|
523
|
-
1. ✅
|
|
524
|
-
2. ✅
|
|
525
|
-
3. ✅
|
|
526
|
-
4. ✅ **
|
|
527
|
-
5. ✅
|
|
528
|
-
6. ✅
|
|
529
|
-
7. ✅
|
|
530
|
-
8. ✅ **LeException**:异常用 `LeException`(不用 ServiceException)
|
|
531
|
-
9. ✅ **Id.next()**:主键用雪花 ID(不用 AUTO_INCREMENT)
|
|
532
|
-
10. ✅ **Mapper XML**:与 Java 文件放同一目录(不在 resources/mapper/)
|
|
179
|
+
## ⚠️ AI 执行规则
|
|
180
|
+
|
|
181
|
+
1. ✅ **仅后端**:三层架构(Controller→Service→Mapper)
|
|
182
|
+
2. ✅ **包名**:必须是 `org.dromara.*`
|
|
183
|
+
3. ✅ **一次确认**:第五步确认后全自动执行
|
|
184
|
+
4. ✅ **tenant_id**:框架自动处理,所有权限配置为 0
|
|
185
|
+
5. ✅ **检查功能重复**:禁止重复开发相同功能
|
|
186
|
+
6. ✅ **智能字段推断**:根据字段名后缀自动推断控件和查询方式
|
|
187
|
+
7. ✅ **字典智能处理**:检查字典存在性,不存在则创建
|