- 更新 environment.js 中 initSlaveDatasource 函数参数从 environmentCode 改为 environmentId - 更新 SourceEnvironmentTab.vue 中的初始化从库功能以使用 environmentId - 在 TargetEnvironmentTab.vue 中添加完整的初始化从库功能 - 初始化项目单一真源(SSOT)文档结构,包括: - 创建主 index.md 作为项目单一真源 - 创建 Authentication.canvas 可视化文件 - 创建所有必需的文档目录和 README.md 文件 - 建立完整的双向索引关系
25 KiB
| name | description |
|---|---|
| phase6-code-generation | 在 Datai 项目中,基于已创建的需求文档、设计文档、决策记录和提示词,生成符合项目规范的代码文件,并更新索引和会话记录。此技能确保代码生成的准确性和规范性。 |
阶段 6:执行代码生成技能书
A. 元数据 (Metadata)
name: phase6-code-generation
description: 在 Datai 项目中,基于已创建的需求文档、设计文档、决策记录和提示词,生成符合项目规范的代码文件,并更新索引和会话记录。此技能确保代码生成的准确性和规范性。
B. 触发与定位 (Triggers & Scope)
触发关键词
当用户输入包含以下关键词时,必须觉醒此技能:
- "执行代码生成"、"生成代码"、"代码生成"
- "进入阶段 6"、"下一阶段"
- "代码"、"实现"、"开发"
触发场景
- 用户确认阶段 5 完成,要求进入阶段 6
- 用户要求生成代码
- 用户询问如何执行代码生成
- 用户提到"按照项目规则"或"SSOT 流程"进行代码生成
操作路径
此技能涉及以下文件和目录的操作:
- 读取:
docs/requirements/YYYY-MM-DD-00X-需求名.md(阶段 1 创建的需求文档) - 读取:
docs/design/YYYY-MM-DD-00X-设计名.md(阶段 2 创建的设计文档) - 读取:
docs/decisions/YYYY-MM-DD-00X-ADR-决策名.md(阶段 3 创建的决策记录) - 读取:
docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md(阶段 5 创建的提示词) - 读取:
docs/sql/YYYY-MM-DD-00X-表名.sql(阶段 4 创建的 SQL 文件) - 读取:
datai-models/datai-generator/目录下的代码生成器模板 - 扫描: 项目目录下已生成的代码文件(检查代码生成器是否已生成基础代码)
- 创建: 项目目录下的 Java 代码文件(根据提示词要求)
- 更新:
docs/index.md - 更新:
docs/design/YYYY-MM-DD-00X-设计名.md(标记代码实现状态) - 更新:
docs/sessions/YYYY-MM-DD-00X-session.md - 读取:
.trae/rules/project_rules.md(项目规则)
SSOT 依赖
必须参考以下"唯一真源":
- 需求文档 - 阶段 1 创建的需求文档
- 设计文档 - 阶段 2 创建的设计文档
- 决策记录 - 阶段 3 创建的决策记录
- SQL 文件 - 阶段 4 创建的 SQL 文件
- 提示词 - 阶段 5 创建的提示词
- project_rules.md - 项目规则和阶段定义
C. 核心指令集 (Instructions)
架构约束
1. 代码生成约束(强制)
- 必须严格按照阶段 5 生成的提示词要求生成代码
- 必须遵循 Spring Boot 最佳实践
- 必须遵循若依框架规范
- 必须使用 MyBatis Plus 进行数据库操作(如果需要)
- 必须使用指定的包结构和文件路径
- 必须包含单元测试
2. 代码生成器使用约束(强制)
- 对于涉及数据库表新增的需求,必须先询问用户是否使用代码生成器
- 代码生成器路径:
datai-models/datai-generator/ - 代码生成器可以生成的基础代码包括:
- 实体类(Entity)
- Mapper 接口
- Mapper XML
- Service 接口
- Service 实现类
- Controller
- 前端 Vue 页面(可选)
- 如果使用代码生成器,必须先扫描项目目录,检查代码生成器是否已生成基础代码
- 如果代码生成器已生成基础代码,则从提示词要求中排除这些基础代码,生成其他代码
- 如果代码生成器未生成基础代码,则直接提示用户使用代码生成器生成基础代码,不继续生成其他代码
- 排除后,明确列出还需要手动实现的代码
3. 索引更新约束(强制)
- 必须在生成代码后立即更新
docs/index.md - 采用增量更新策略,严禁删除现有内容
4. 会话记录约束(强制)
- 必须更新
docs/sessions/YYYY-MM-DD-00X-session.md - 必须更新当前阶段为"阶段 6:执行代码生成"
- 必须记录生成的代码文件列表
- 必须记录是否使用代码生成器
- 必须记录代码生成器扫描结果(如果使用)
- 必须记录 AI 的质疑、替代方案以及最终的复现步骤
业务逻辑 SOP(标准操作流程)
步骤 1:代码生成分析(Let's think step by step)
在生成代码前,必须执行以下分析:
-
分析需求和设计文档
- 读取阶段 1 创建的需求文档
- 读取阶段 2 创建的设计文档
- 读取阶段 3 创建的决策记录
- 明确需求的核心功能和非功能需求
- 明确设计的技术方案和架构
-
确定是否涉及数据库表新增
- 读取阶段 4 创建的 SQL 文件
- 检查是否包含
CREATE TABLE语句 - 如果涉及表新增,标记需要使用代码生成器确认
- 如果不涉及表新增,直接进入步骤 4
-
确定需要生成的代码文件
- 读取阶段 5 创建的提示词
- 明确需要生成的代码文件类型和路径
- 明确代码规范和测试要求
-
遵循 Spring Boot 最佳实践
- 明确 Spring Boot 的代码结构和规范
- 明确若依框架的代码结构和规范
- 明确 MyBatis Plus 的使用规范
步骤 2:首句申明
在生成代码前,必须明确当前"现状"与"目标":
现状:已完成需求定义、方案设计、方案决策、数据库结构生成和提示词生成 目标:根据提示词生成符合项目规范的代码文件
步骤 3:代码生成器确认(新增步骤)
如果需求涉及数据库表新增,必须执行此步骤:
-
检测是否涉及表新增
- 检查阶段 4 创建的 SQL 文件
- 如果包含
CREATE TABLE语句,则涉及表新增 - 如果不涉及表新增,跳过此步骤,直接进入步骤 4
-
询问用户是否使用代码生成器
- 向用户说明代码生成器的位置和功能
- 说明代码生成器可以生成的基础代码类型
- 询问:"是否使用代码生成器生成基础代码?"
- 等待用户确认
-
如果用户选择使用代码生成器
- 读取
datai-models/datai-generator/目录下的代码生成器模板 - 分析代码生成器可以生成的基础代码:
- 实体类(Entity):
vm/java/domain.java.vm - Mapper 接口:
vm/java/mapper.java.vm - Mapper XML:
vm/xml/mapper.xml.vm - Service 接口:
vm/java/service.java.vm - Service 实现类:
vm/java/serviceImpl.java.vm - Controller:
vm/java/controller.java.vm
- 实体类(Entity):
- 扫描项目目录,检查代码生成器是否已生成基础代码
- 使用 SearchCodebase 或 Glob 工具扫描项目目录
- 根据表名(从 SQL 文件中提取)查找对应的实体类、Mapper、Service、Controller
- 检查这些文件是否存在
- 记录扫描结果:哪些基础代码已生成,哪些未生成
- 如果代码生成器已生成所有基础代码
- 从提示词要求中排除这些基础代码
- 明确列出还需要手动实现的代码
- 记录用户选择使用代码生成器,且基础代码已生成
- 继续进入步骤 4
- 如果代码生成器未生成基础代码或部分生成
- 直接提示用户:"代码生成器未生成基础代码,请先使用代码生成器生成基础代码(Entity、Mapper、Service、Controller),然后再继续生成其他代码。"
- 列出未生成的基础代码文件
- 提供代码生成器的使用方法
- 记录用户选择使用代码生成器,但基础代码未生成
- 不继续进入步骤 4,等待用户完成代码生成器生成后再继续
- 读取
-
如果用户选择不使用代码生成器
- 按照提示词要求生成所有代码
- 记录用户选择不使用代码生成器
-
如果需求不涉及表新增
- 直接按照提示词要求生成所有代码
- 不需要询问用户是否使用代码生成器
步骤 4:加载阶段 5 准备的 Prompt,观察输出
-
加载提示词
- 读取阶段 5 创建的提示词
- 如果步骤 3 确认使用代码生成器且基础代码已生成,从提示词要求中排除基础代码
- 按照提示词的要求生成代码
-
生成代码
- 生成 Java 代码文件
- 保存到对应的项目目录
- 确保代码符合项目规范
- 确保代码包含单元测试
-
观察输出
- 记录 AI 的质疑
- 记录替代方案
- 记录最终的复现步骤
步骤 5:更新索引和设计文档
-
更新设计文档
- 使用 Read 工具读取设计文档
- 更新文档状态,标记代码已实现
- 使用 Write 工具更新设计文档
-
保存索引
- 使用 Write 工具更新
docs/index.md - 确保索引文件是最新的,严禁删除现有内容
- 使用 Write 工具更新
步骤 6:更新会话记录
-
读取现有会话记录
- 使用 Read 工具读取
docs/sessions/YYYY-MM-DD-00X-session.md
- 使用 Read 工具读取
-
更新阶段 6 信息
- 更新"当前阶段"为"阶段 6:执行代码生成"
- 更新"阶段 6:执行代码生成"的状态为"已完成"或"待继续"(如果基础代码未生成)
- 添加生成的代码文件列表
- 记录是否使用代码生成器
- 如果使用代码生成器,记录代码生成器扫描结果
- 如果基础代码未生成,记录提示用户使用代码生成器的信息
- 记录 AI 的质疑、替代方案以及最终的复现步骤
-
保存会话记录
- 使用 Write 工具更新会话记录
步骤 7:确认与询问
-
向用户确认
- 显示生成的代码文件列表
- 如果使用代码生成器,说明哪些代码由代码生成器生成,哪些代码手动实现
- 如果代码生成器未生成基础代码,提示用户使用代码生成器
- 询问:"代码是否正确?"
- 如果基础代码未生成,询问:"是否已使用代码生成器生成基础代码?是否继续生成其他代码?"
- 如果基础代码已生成,询问:"是否进入下一阶段(记录当前会话)?"
-
等待用户反馈
- 如果用户不满意,询问具体需要修改的地方
- 如果用户要求回退,执行回退机制(见错误陷阱部分)
- 如果用户确认,标记阶段 6 为已完成,准备进入阶段 7
工具调用
必须使用的工具
-
Read 工具:读取现有文件
- 使用场景:读取需求文档、设计文档、决策记录、提示词、SQL 文件、索引、会话记录
- 命令:
Read(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md")
-
Write 工具:创建或更新文件
- 使用场景:生成代码文件、更新索引、更新设计文档、更新会话记录
- 命令:
Write(file_path="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java", content="...")
-
RunCommand 工具:运行代码验证
- 使用场景:运行单元测试验证代码正确性
- 命令:
RunCommand(command="mvn test", blocking=true, requires_approval=false, target_terminal="new")
可选使用的工具
-
SearchCodebase 工具:搜索现有代码
- 使用场景:查找现有代码作为参考、扫描代码生成器生成的文件
- 命令:
SearchCodebase(information_request="查找 datai-modules-system 模块下的 Controller 类")
-
Glob 工具:搜索文件
- 使用场景:扫描代码生成器生成的文件
- 命令:
Glob(path="d:\\idea_demo\\datai", pattern="**/SysDatasourceConfig.java")
-
GetDiagnostics 工具:获取代码诊断
- 使用场景:检查代码的语法错误和类型错误
- 命令:
GetDiagnostics(uri="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java")
-
TodoWrite 工具:管理任务
- 使用场景:跟踪阶段执行进度
- 命令:
TodoWrite(todos=[...])
D. 错误陷阱与验证 (Anti-Patterns & Checklist)
常见错误(Anti-Patterns)
错误 1:不询问用户是否使用代码生成器
错误示例:
AI:检测到需求涉及表新增 AI:直接按照提示词生成所有代码 AI:跳过代码生成器确认步骤
问题:
- 没有询问用户是否使用代码生成器
- 违反了代码生成器使用约束
- 可能导致重复生成基础代码
正确示例:
AI:检测到需求涉及表新增 AI:询问用户是否使用代码生成器生成基础代码 AI:根据用户选择,排除或包含基础代码 AI:生成剩余代码
错误 2:不扫描代码生成器生成的文件
错误示例:
AI:用户选择使用代码生成器 AI:直接从提示词要求中排除基础代码 AI:没有扫描项目目录检查基础代码是否已生成 AI:可能生成重复代码或遗漏代码
问题:
- 没有扫描代码生成器生成的文件
- 无法确定基础代码是否已生成
- 可能导致重复生成代码或遗漏代码
正确示例:
AI:用户选择使用代码生成器 AI:扫描项目目录,检查代码生成器是否已生成基础代码 AI:如果基础代码已生成,从提示词要求中排除 AI:如果基础代码未生成,提示用户使用代码生成器
错误 3:代码生成器未生成基础代码时继续生成其他代码
错误示例:
AI:用户选择使用代码生成器 AI:扫描项目目录,发现基础代码未生成 AI:仍然继续生成其他代码 AI:导致代码不完整
问题:
- 代码生成器未生成基础代码时继续生成其他代码
- 导致代码不完整,缺少基础代码
正确示例:
AI:用户选择使用代码生成器 AI:扫描项目目录,发现基础代码未生成 AI:直接提示用户使用代码生成器生成基础代码 AI:不继续生成其他代码,等待用户完成代码生成器生成后再继续
错误 4:不按提示词要求生成代码
错误示例:
AI:读取提示词,要求生成 Controller、Service、Mapper、Entity AI:只生成了 Controller 和 Service,没有生成 Mapper 和 Entity
问题:
- 没有按照提示词要求生成所有代码文件
- 违反了阶段 5 生成的提示词约束
正确示例:
AI:读取提示词,要求生成 Controller、Service、Mapper、Entity AI:按照提示词要求,生成了所有代码文件 AI:确保代码符合提示词的代码规范和测试要求
错误 5:不排除代码生成器生成的基础代码
错误示例:
AI:用户选择使用代码生成器 AI:仍然手动生成了 Entity、Mapper、Service、Controller AI:导致代码重复
问题:
- 没有排除代码生成器生成的基础代码
- 导致代码重复和维护困难
正确示例:
AI:用户选择使用代码生成器 AI:扫描项目目录,确认基础代码已生成 AI:从提示词要求中排除 Entity、Mapper、Service、Controller AI:只生成代码生成器无法生成的代码
错误 6:不包含单元测试
错误示例:
AI:生成代码,不包含单元测试 AI:违反了提示词的测试要求
正确示例:
AI:生成代码,包含单元测试 AI:确保单元测试覆盖率不低于 80% AI:确保测试用例包含正常场景和异常场景
错误 7:代码不符合项目规范
错误示例:
// 违反若依框架规范的代码
public class loginController {
public String login(String username, String password) {
// 代码逻辑
}
}
问题:
-
类名不符合规范(首字母小写,驼峰命名错误)
-
方法参数不符合规范(没有使用 DTO 类)
-
没有使用若依框架的注解
-
没有异常处理
正确示例:
Java
// 符合若依框架规范的代码
@RestController
@RequestMapping("/system/auth")
public class SysLoginController {
@Autowired
private SysLoginService loginService;
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) {
// 代码逻辑
return AjaxResult.success(token);
}
}
错误 8:不询问用户确认就进入下一阶段
错误示例:
AI:生成代码
AI:进入阶段 7:记录当前会话(未询问用户)
正确示例:
AI:生成代码
AI:代码已生成
AI:代码是否正确?
AI:是否进入下一阶段(记录当前会话)?
验收清单(Checklist)
在完成阶段 6 前,必须检查以下项目:
代码生成器确认检查
-
已检测需求是否涉及数据库表新增
-
如果涉及表新增,已询问用户是否使用代码生成器
-
已记录用户的选择(使用或不使用代码生成器)
-
如果使用代码生成器,已扫描项目目录检查基础代码是否已生成
-
已记录代码生成器扫描结果(哪些基础代码已生成,哪些未生成)
-
如果基础代码已生成,已从提示词要求中排除基础代码
-
如果基础代码未生成,已提示用户使用代码生成器,不继续生成其他代码
-
已明确列出还需要手动实现的代码
代码生成检查
-
已按照提示词要求生成所有代码文件(排除代码生成器生成的基础代码)
-
代码文件保存到了正确的项目目录
-
代码符合 Spring Boot 最佳实践
-
代码符合若依框架规范
-
代码符合 MyBatis Plus 使用规范
-
代码包含单元测试
-
单元测试覆盖率不低于 80%
-
测试用例包含正常场景和异常场景
-
代码没有语法错误和类型错误
索引与文档更新检查
-
docs/index.md已更新 -
索引更新采用增量策略,未删除现有内容
-
设计文档已更新,标记代码实现完成状态
会话记录更新检查
-
会话记录已更新
-
会话记录的"当前阶段"已更新为"阶段 6:执行代码生成"
-
会话记录的"阶段 6:执行代码生成"状态已更新为"已完成"或"待继续"
-
会话记录包含生成的代码文件列表
-
会话记录记录是否使用代码生成器
-
如果使用代码生成器,会话记录记录代码生成器扫描结果
-
如果基础代码未生成,会话记录记录提示用户使用代码生成器的信息
-
会话记录包含 AI 的质疑、替代方案以及最终的复现步骤
用户确认检查
-
已向用户显示生成的代码文件列表
-
如果使用代码生成器,已向用户说明哪些代码由代码生成器生成,哪些代码手动实现
-
如果代码生成器未生成基础代码,已向用户提示使用代码生成器
-
已询问用户"代码是否正确?"
-
如果基础代码未生成,已询问用户"是否已使用代码生成器生成基础代码?是否继续生成其他代码?"
-
如果基础代码已生成,已询问用户"是否进入下一阶段?"
-
已等待用户反馈
回退机制检查(如果需要)
-
如果用户不满意,已询问具体需要修改的地方
-
如果用户要求回退,已删除相关代码文件
-
如果用户要求回退,已撤销索引更新
-
如果用户要求回退,已撤销设计文档更新
-
如果用户要求回退,已更新会话记录
Correct vs Incorrect 代码对比
Incorrect(错误示例)
Java
// 违反若依框架规范的代码
public class loginController {
public String login(String username, String password) {
// 简单的用户名密码验证
if ("admin".equals(username) && "123456".equals(password)) {
return "success";
} else {
return "failure";
}
}
}
Correct(正确示例)
Java
// 符合若依框架规范的代码
@RestController
@RequestMapping("/system/auth")
public class SysLoginController {
private static final Logger log = LoggerFactory.getLogger(SysLoginController.class);
@Autowired
private SysLoginService loginService;
/**
* 登录方法
* * @param loginBody 登录信息
* @return 结果
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) {
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
}
附录:快速参考
文件路径速查
-
需求文档:
docs/requirements/YYYY-MM-DD-00X-需求名.md -
设计文档:
docs/design/YYYY-MM-DD-00X-设计名.md -
决策记录:
docs/decisions/YYYY-MM-DD-00X-ADR-决策名.md -
SQL 文件:
docs/sql/YYYY-MM-DD-00X-表名.sql -
提示词:
docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md -
主索引:
docs/index.md -
会话记录:
docs/sessions/YYYY-MM-DD-00X-session.md -
项目规则:
.trae/rules/project_rules.md -
SSOT 架构师提示词:
docs/Prompt/0004-单一真源文档驱动架构师.md -
代码生成器:
datai-models/datai-generator/
代码生成器模板速查
-
实体类模板:
datai-models/datai-generator/src/main/resources/vm/java/domain.java.vm -
Mapper 接口模板:
datai-models/datai-generator/src/main/resources/vm/java/mapper.java.vm -
Mapper XML 模板:
datai-models/datai-generator/src/main/resources/vm/xml/mapper.xml.vm -
Service 接口模板:
datai-models/datai-generator/src/main/resources/vm/java/service.java.vm -
Service 实现类模板:
datai-models/datai-generator/src/main/resources/vm/java/serviceImpl.java.vm -
Controller 模板:
datai-models/datai-generator/src/main/resources/vm/java/controller.java.vm
工具命令速查
PowerShell
# 读取提示词
Read(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md")
# 读取 SQL 文件
Read(file_path="d:\\idea_demo\\datai\\docs\\sql\\2026-01-21-001-sys_user.sql")
# 扫描代码生成器生成的文件
Glob(path="d:\\idea_demo\\datai", pattern="**/SysDatasourceConfig.java")
SearchCodebase(information_request="查找 SysDatasourceConfig 相关的文件")
# 生成代码文件
Write(file_path="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java", content="...")
# 运行单元测试
RunCommand(command="mvn test", blocking=true, requires_approval=false, target_terminal="new")
# 检查代码诊断
GetDiagnostics(uri="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java")
代码生成器使用流程
-
检测需求是否涉及数据库表新增
-
如果涉及表新增,询问用户是否使用代码生成器
-
如果用户选择使用代码生成器:
-
扫描项目目录,检查代码生成器是否已生成基础代码
-
如果基础代码已生成:
-
从提示词要求中排除基础代码(Entity、Mapper、Service、Controller)
-
明确列出还需要手动实现的代码
-
继续生成其他代码
-
-
如果基础代码未生成:
-
直接提示用户使用代码生成器生成基础代码
-
列出未生成的基础代码文件
-
提供代码生成器的使用方法
-
不继续生成其他代码,等待用户完成代码生成器生成后再继续
-
-
-
如果用户选择不使用代码生成器:
- 按照提示词要求生成所有代码
代码生成器扫描方法
-
从 SQL 文件中提取表名
-
根据表名生成对应的实体类名、Mapper 接口名、Service 接口名、Controller 类名
-
使用 Glob 或 SearchCodebase 工具扫描项目目录
-
检查这些文件是否存在
-
记录扫描结果:哪些基础代码已生成,哪些未生成
-
根据扫描结果决定后续操作