datai/docs/skill/phase6-code-generation.md
Kris b7163d555b feat: 实现动态数据源延迟加载功能 (2026-01-21-001)
## 功能概述
- 实现动态数据源的延迟加载机制,支持应用启动时只加载主库,从库按需动态加载和切换
- 从库配置存储在主库中,支持运行时灵活切换从库库名
- 使用现有的 @DataSource 注解进行数据源切换,业务代码无需修改

## 新增功能
- 动态数据源管理接口 IDynamicDataSourceManager
- 动态数据源服务接口 IDynamicDataSourceService
- 动态数据源服务实现 DynamicDataSourceServiceImpl
- 数据源管理控制器 DatasourceController
- 数据源配置表 sys_datasource_config

## 新增文档
- 需求文档: docs/requirements/2026-01-21-001-动态数据源延迟加载.md
- 设计文档: docs/design/2026-01-21-001-动态数据源延迟加载设计.md
- 决策记录: docs/decisions/2026-01-21-001-ADR-动态数据源延迟加载.md
- SQL 脚本: docs/sql/2026-01-21-001-sys_datasource_config.sql
- 提示词: docs/prompts/2026-01-21-001-动态数据源延迟加载代码生成提示词.md
- 会话记录: docs/sessions/2026-01-21-001-session.md
- 变更日志: docs/changelog/2026-01-21-001-changelog.md
- 复盘文档: docs/retros/2026-01-21-001-retro.md
- API 文档: docs/api-docs/2026-01-21-001-api.md
- 根目录变更日志: CHANGELOG.md

## 修改功能
- 扩展 DataSourceManager 类,添加动态数据源管理方法
- 扩展 SysDatasourceConfigMapper 接口,添加 selectSysDatasourceConfigByDsName 方法
- 更新项目索引和 Authentication.canvas

## 修复问题
- 修复循环依赖问题:创建 IDynamicDataSourceManager 接口解决 datai-system 和 datai-framework 互相依赖
- 修复导入错误:删除 DynamicDataSourceServiceImpl 中未使用的导入
- 修复异常处理:将 setFilters() 调用移到 try-catch 块内

## API 接口
- POST /system/datasource/loadSlave - 加载从库数据源
- POST /system/datasource/switchSlave/{dbName} - 切换从库库名
- GET /system/datasource/getSlaveConfig - 获取从库配置
- POST /system/datasource/switch/{dsName} - 切换数据源
- DELETE /system/datasource/{dsName} - 移除数据源
2026-01-21 18:24:24 +08:00

551 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 阶段 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 创建的提示词)
- **创建**: 项目目录下的 Java 代码文件(根据提示词要求)
- **创建**: `docs/reference-code/YYYY-MM-DD-00X-code-功能名.md`
- **创建**: `docs/implementation/YYYY-MM-DD-00X-implementation-功能名.md`
- **更新**: `docs/index.md`
- **更新**: `docs/design/YYYY-MM-DD-00X-设计名.md` (添加代码实现引用)
- **更新**: `docs/sessions/YYYY-MM-DD-00X-session.md`
- **读取**: `.trae/rules/project_rules.md` (项目规则)
- **读取**: `docs/Prompt/0004-单一真源文档驱动架构师.md` (SSOT 架构师提示词)
### SSOT 依赖
必须参考以下"唯一真源"
- [需求文档](file:///d:\idea_demo\datai\docs\requirements\YYYY-MM-DD-00X-需求名.md) - 阶段 1 创建的需求文档
- [设计文档](file:///d:\idea_demo\datai\docs\design\YYYY-MM-DD-00X-设计名.md) - 阶段 2 创建的设计文档
- [决策记录](file:///d:\idea_demo\datai\docs\decisions\YYYY-MM-DD-00X-ADR-决策名.md) - 阶段 3 创建的决策记录
- [提示词](file:///d:\idea_demo\datai\docs\prompts\YYYY-MM-DD-00X-prompt-提示词名.md) - 阶段 5 创建的提示词
- [project_rules.md](file:///d:\idea_demo\datai\.trae\rules\project_rules.md) - 项目规则和阶段定义
- [0004-单一真源文档驱动架构师.md](file:///d:\idea_demo\datai\docs\Prompt\0004-单一真源文档驱动架构师.md) - SSOT 架构师提示词
---
## C. 核心指令集 (Instructions)
### 架构约束
#### 1. 代码生成约束(强制)
- 必须严格按照阶段 5 生成的提示词要求生成代码
- 必须遵循 Spring Boot 最佳实践
- 必须遵循若依框架规范
- 必须使用 MyBatis Plus 进行数据库操作(如果需要)
- 必须使用指定的包结构和文件路径
- 必须包含单元测试
#### 2. 参考代码文档约束(强制)
- 必须在 `docs/reference-code/` 目录下创建参考代码文档
- 文档命名:`YYYY-MM-DD-00X-code-功能名.md`
- 必须包含关键代码片段和说明
- 必须包含代码的使用方法和注意事项
#### 3. 实施方案文档约束(强制)
- 必须在 `docs/implementation/` 目录下创建实施方案文档
- 文档命名:`YYYY-MM-DD-00X-implementation-功能名.md`
- 必须包含实施步骤和注意事项
- 必须包含部署说明和验证方法
#### 4. 索引更新约束(强制)
- 必须在生成代码和文档后立即更新 `docs/index.md`
- 必须更新设计文档,添加代码实现引用
- 采用增量更新策略,**严禁**删除现有内容
- 索引链接格式:`[文档名](./相对路径/文件名.md)`
- 必须在 `docs/index.md` 中添加到"参考代码"和"实施方案"部分
#### 5. 会话记录约束(强制)
- 必须更新 `docs/sessions/YYYY-MM-DD-00X-session.md`
- 必须更新当前阶段为"阶段 6执行代码生成"
- 必须记录生成的代码文件列表
- 必须记录参考代码和实施方案文档链接
- 必须记录 AI 的质疑、替代方案以及最终的复现步骤
### 业务逻辑 SOP标准操作流程
#### 步骤 1代码生成分析Let's think step by step
在生成代码前,必须执行以下分析:
1. **分析需求和设计文档**
- 读取阶段 1 创建的需求文档
- 读取阶段 2 创建的设计文档
- 读取阶段 3 创建的决策记录
- 明确需求的核心功能和非功能需求
- 明确设计的技术方案和架构
2. **确定需要生成的代码文件**
- 读取阶段 5 创建的提示词
- 明确需要生成的代码文件类型和路径
- 明确代码规范和测试要求
3. **遵循 Spring Boot 最佳实践**
- 明确 Spring Boot 的代码结构和规范
- 明确若依框架的代码结构和规范
- 明确 MyBatis Plus 的使用规范
#### 步骤 2首句申明
在生成代码前,必须明确当前"现状"与"目标"
```
现状:已完成需求定义、方案设计、方案决策、数据库结构生成和提示词生成
目标:根据提示词生成符合项目规范的代码文件,创建参考代码文档和实施方案文档
```
#### 步骤 3加载阶段 5 准备的 Prompt观察输出
1. **加载提示词**
- 读取阶段 5 创建的提示词
- 按照提示词的要求生成代码
2. **生成代码**
- 生成 Java 代码文件
- 保存到对应的项目目录
- 确保代码符合项目规范
- 确保代码包含单元测试
3. **观察输出**
- 记录 AI 的质疑
- 记录替代方案
- 记录最终的复现步骤
#### 步骤 4创建参考代码文档
1. **确定文档路径**
- 路径:`docs/reference-code/YYYY-MM-DD-00X-code-功能名.md`
- 使用 Write 工具创建文件
- 确保目录存在(使用 LS 工具检查)
2. **填充文档内容**
- **元数据**:包含需求编号、创建时间、创建人、状态等
- **功能概述**:描述功能的核心内容
- **代码结构**:描述生成的代码文件结构
- **关键代码片段**:包含核心功能的代码片段
- **使用方法**:描述代码的使用方法
- **注意事项**:描述代码的注意事项
3. **文档质量检查**
- 使用 Read 工具读取刚创建的文档
- 检查是否符合参考代码文档约束
- 检查代码片段是否正确
- 检查使用方法是否清晰
#### 步骤 5创建实施方案文档
1. **确定文档路径**
- 路径:`docs/implementation/YYYY-MM-DD-00X-implementation-功能名.md`
- 使用 Write 工具创建文件
- 确保目录存在(使用 LS 工具检查)
2. **填充文档内容**
- **元数据**:包含需求编号、创建时间、创建人、状态等
- **实施概述**:描述实施的核心内容
- **实施步骤**:描述实施的详细步骤
- **注意事项**:描述实施的注意事项
- **部署说明**:描述部署的方法和步骤
- **验证方法**:描述验证的方法和步骤
3. **文档质量检查**
- 使用 Read 工具读取刚创建的文档
- 检查是否符合实施方案文档约束
- 检查实施步骤是否清晰
- 检查部署说明是否详细
#### 步骤 6更新索引和设计文档
1. **读取现有索引**
- 使用 Read 工具读取 `docs/index.md`
- 找到"参考代码"和"实施方案"部分
- 如果不存在,则创建这些部分
2. **添加新文档链接**
- 在"参考代码"部分追加新参考代码
- 格式:`- [参考代码名](./reference-code/YYYY-MM-DD-00X-code-功能名.md) - [描述]`
- 示例:`- [用户登录功能参考代码](./reference-code/2026-01-21-001-code-用户登录功能.md) - 用户登录功能的参考代码`
- 在"实施方案"部分追加新实施方案
- 格式:`- [实施方案名](./implementation/YYYY-MM-DD-00X-implementation-功能名.md) - [描述]`
- 示例:`- [用户登录功能实施方案](./implementation/2026-01-21-001-implementation-用户登录功能.md) - 用户登录功能的实施方案`
3. **更新设计文档**
- 使用 Read 工具读取设计文档
- 在"相关文档"部分添加代码实现引用
- 格式:`- [参考代码](../reference-code/YYYY-MM-DD-00X-code-功能名.md)`
- 格式:`- [实施方案](../implementation/YYYY-MM-DD-00X-implementation-功能名.md)`
- 使用 Write 工具更新设计文档
4. **保存索引**
- 使用 Write 工具更新 `docs/index.md`
- **严禁**删除现有内容,只追加新内容
#### 步骤 7更新会话记录
1. **读取现有会话记录**
- 使用 Read 工具读取 `docs/sessions/YYYY-MM-DD-00X-session.md`
2. **更新阶段 6 信息**
- 更新"当前阶段"为"阶段 6执行代码生成"
- 更新"阶段 6执行代码生成"的状态为"已完成"
- 添加生成的代码文件列表
- 添加参考代码和实施方案文档链接
- 记录 AI 的质疑、替代方案以及最终的复现步骤
3. **保存会话记录**
- 使用 Write 工具更新会话记录
#### 步骤 8确认与询问
1. **向用户确认**
- 显示生成的代码文件列表
- 显示参考代码和实施方案文档的链接
- 询问:"代码是否正确?"
- 询问:"是否进入下一阶段(记录当前会话)?"
2. **等待用户反馈**
- 如果用户不满意,询问具体需要修改的地方
- 如果用户要求回退,执行回退机制(见错误陷阱部分)
- 如果用户确认,标记阶段 6 为已完成,准备进入阶段 7
### 工具调用
#### 必须使用的工具
1. **Read 工具**:读取现有文件
- 使用场景:读取需求文档、设计文档、决策记录、提示词、索引、会话记录
- 命令:`Read(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md")`
2. **Write 工具**:创建或更新文件
- 使用场景:生成代码文件、创建参考代码文档、创建实施方案文档、更新索引、更新设计文档、更新会话记录
- 命令:`Write(file_path="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java", content="...")`
3. **LS 工具**:检查目录是否存在
- 使用场景:创建文档前检查 `docs/reference-code/``docs/implementation/` 目录
- 命令:`LS(path="d:\\idea_demo\\datai\\docs")`
4. **RunCommand 工具**:运行代码验证
- 使用场景:运行单元测试验证代码正确性
- 命令:`RunCommand(command="mvn test", blocking=true, requires_approval=false, target_terminal="new")`
#### 可选使用的工具
1. **SearchCodebase 工具**:搜索现有代码
- 使用场景:查找现有代码作为参考
- 命令:`SearchCodebase(information_request="查找 datai-modules-system 模块下的 Controller 类")`
2. **GetDiagnostics 工具**:获取代码诊断
- 使用场景:检查代码的语法错误和类型错误
- 命令:`GetDiagnostics(uri="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java")`
3. **TodoWrite 工具**:管理任务
- 使用场景:跟踪阶段执行进度
- 命令:`TodoWrite(todos=[...])`
---
## D. 错误陷阱与验证 (Anti-Patterns & Checklist)
### 常见错误Anti-Patterns
#### 错误 1不按提示词要求生成代码
**错误示例**
```
AI读取提示词要求生成 Controller、Service、Mapper、Entity
AI只生成了 Controller 和 Service没有生成 Mapper 和 Entity
```
**问题**
- 没有按照提示词要求生成所有代码文件
- 违反了阶段 5 生成的提示词约束
**正确示例**
```
AI读取提示词要求生成 Controller、Service、Mapper、Entity
AI按照提示词要求生成了所有代码文件
AI确保代码符合提示词的代码规范和测试要求
```
#### 错误 2不包含单元测试
**错误示例**
```
AI生成代码不包含单元测试
AI违反了提示词的测试要求
```
**正确示例**
```
AI生成代码包含单元测试
AI确保单元测试覆盖率不低于 80%
AI确保测试用例包含正常场景和异常场景
```
#### 错误 3代码不符合项目规范
**错误示例**
```java
// 违反若依框架规范的代码
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);
}
}
```
#### 错误 4不创建参考代码文档和实施方案文档
**错误示例**
```
AI生成代码
AI更新索引和会话记录
AI完成忘记创建参考代码文档和实施方案文档
```
**问题**
- 违反了阶段 6 的要求
- 缺少代码的参考文档和实施方案
**正确示例**
```
AI生成代码
AI创建参考代码文档
AI创建实施方案文档
AI更新索引和会话记录
AI完成
```
#### 错误 5不更新设计文档的代码实现引用
**错误示例**
```
AI生成代码
AI创建参考代码文档和实施方案文档
AI更新 docs/index.md
AI完成忘记更新设计文档
```
**正确示例**
```
AI生成代码
AI创建参考代码文档和实施方案文档
AI更新 docs/index.md
AI更新设计文档添加代码实现引用
AI完成
```
#### 错误 6不询问用户确认就进入下一阶段
**错误示例**
```
AI生成代码
AI进入阶段 7记录当前会话未询问用户
```
**正确示例**
```
AI生成代码
AI代码已生成参考代码和实施方案文档已创建
AI代码是否正确
AI是否进入下一阶段记录当前会话
```
### 验收清单Checklist
在完成阶段 6 前,必须检查以下项目:
#### 代码生成检查
- [ ] 已按照提示词要求生成所有代码文件
- [ ] 代码文件保存到了正确的项目目录
- [ ] 代码符合 Spring Boot 最佳实践
- [ ] 代码符合若依框架规范
- [ ] 代码符合 MyBatis Plus 使用规范
- [ ] 代码包含单元测试
- [ ] 单元测试覆盖率不低于 80%
- [ ] 测试用例包含正常场景和异常场景
- [ ] 代码没有语法错误和类型错误
#### 参考代码文档检查
- [ ] 参考代码文档已创建在 `docs/reference-code/` 目录下
- [ ] 文档命名符合 `YYYY-MM-DD-00X-code-功能名.md` 格式
- [ ] 文档包含元数据
- [ ] 文档包含功能概述
- [ ] 文档包含代码结构
- [ ] 文档包含关键代码片段
- [ ] 文档包含代码的使用方法和注意事项
#### 实施方案文档检查
- [ ] 实施方案文档已创建在 `docs/implementation/` 目录下
- [ ] 文档命名符合 `YYYY-MM-DD-00X-implementation-功能名.md` 格式
- [ ] 文档包含元数据
- [ ] 文档包含实施概述
- [ ] 文档包含实施步骤
- [ ] 文档包含注意事项
- [ ] 文档包含部署说明
- [ ] 文档包含验证方法
#### 索引更新检查
- [ ] `docs/index.md` 已更新
- [ ] 新参考代码链接已添加到"参考代码"部分
- [ ] 新实施方案链接已添加到"实施方案"部分
- [ ] 索引链接格式正确:`[文档名](./相对路径/文件名.md)`
- [ ] 索引更新采用增量策略,未删除现有内容
#### 设计文档更新检查
- [ ] 设计文档已更新
- [ ] 设计文档的"相关文档"部分已添加参考代码和实施方案引用
- [ ] 引用格式正确:`[参考代码](../reference-code/YYYY-MM-DD-00X-code-功能名.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`
- 提示词:`docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md`
- 参考代码文档:`docs/reference-code/YYYY-MM-DD-00X-code-功能名.md`
- 实施方案文档:`docs/implementation/YYYY-MM-DD-00X-implementation-功能名.md`
- 主索引:`docs/index.md`
- 会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
- 项目规则:`.trae/rules/project_rules.md`
- SSOT 架构师提示词:`docs/Prompt/0004-单一真源文档驱动架构师.md`
### 工具命令速查
```powershell
# 读取提示词
Read(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md")
# 生成代码文件
Write(file_path="d:\\idea_demo\\datai\\datai-modules-system\\src\\main\\java\\com\\datai\\modules\\system\\controller\\SysLoginController.java", content="...")
# 创建参考代码文档
Write(file_path="d:\\idea_demo\\datai\\docs\\reference-code\\2026-01-21-001-code-用户登录功能.md", content="...")
# 创建实施方案文档
Write(file_path="d:\\idea_demo\\datai\\docs\\implementation\\2026-01-21-001-implementation-用户登录功能.md", 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")
```
### 阶段 6 输出清单
- [ ] 代码文件:项目目录下的 Java 文件
- [ ] 参考代码文档:`docs/reference-code/YYYY-MM-DD-00X-code-功能名.md`
- [ ] 实施方案文档:`docs/implementation/YYYY-MM-DD-00X-implementation-功能名.md`
- [ ] 更新的索引:`docs/index.md`
- [ ] 更新的设计文档:`docs/design/YYYY-MM-DD-00X-设计名.md`
- [ ] 更新的会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
### 下一阶段提示
如果用户确认进入下一阶段,请参考:
- [project_rules.md](file:///d:\idea_demo\datai\.trae\rules\project_rules.md) 的"阶段 7记录当前会话"
- 准备回顾整个会话过程
- 准备更新会话记录
- 准备更新索引