datai/docs/skill/phase5-prompt-engineering.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

595 lines
21 KiB
Markdown
Raw 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.

# 阶段 5提示词生成技能书
## A. 元数据 (Metadata)
**name**: `phase5-prompt-engineering`
**description**: 在 Datai 项目中,基于已创建的需求文档和设计文档,生成针对当前需求的提示词,引用真源,定义输出格式,并更新索引和会话记录。此技能确保 AI 生成的代码符合项目规范和需求。
---
## B. 触发与定位 (Triggers & Scope)
### 触发关键词
当用户输入包含以下关键词时,必须觉醒此技能:
- "提示词"、"Prompt"、"提示词生成"
- "工程化提示词"、"执行提示词"
- "进入阶段 5"、"下一阶段"
- "Prompt 设计"、"提示词设计"
### 触发场景
- 用户确认阶段 4 完成,要求进入阶段 5
- 用户要求生成提示词
- 用户询问如何设计提示词
- 用户提到"按照项目规则"或"SSOT 流程"进行提示词设计
### 操作路径
此技能涉及以下文件和目录的操作:
- **读取**: `docs/requirements/YYYY-MM-DD-00X-需求名.md` (阶段 1 创建的需求文档)
- **读取**: `docs/design/YYYY-MM-DD-00X-设计名.md` (阶段 2 创建的设计文档)
- **创建**: `docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md`
- **更新**: `docs/index.md`
- **更新**: `docs/requirements/YYYY-MM-DD-00X-需求名.md` (添加提示词引用)
- **更新**: `docs/sessions/YYYY-MM-DD-00X-session.md`
- **读取**: `.trae/rules/project_rules.md` (项目规则)
- **读取**: `docs/Prompt/0004-单一真源文档驱动架构师.md` (SSOT 架构师提示词)
- **读取**: `docs/Prompt/0000-template.md` (提示词模板)
### 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 创建的设计文档
- [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 架构师提示词
- [0000-template.md](file:///d:\idea_demo\datai\docs\Prompt\0000-template.md) - 提示词模板
---
## C. 核心指令集 (Instructions)
### 架构约束
#### 1. 提示词命名规范(强制)
- 必须使用格式:`YYYY-MM-DD-00X-prompt-提示词名.md`
- `YYYY-MM-DD`:当前日期(如 2026-01-21
- `00X`:需求编号(与阶段 1-4 保持一致)
- `提示词名`:简洁描述,使用中文,如"用户登录功能"
- **严禁**使用英文、拼音或无意义的文件名
#### 2. 提示词内容约束(强制)
提示词必须包含以下内容:
- 引用真源(需求文档和设计文档的链接)
- 需求描述
- 设计方案
- 输出格式要求
- 代码规范要求
- 测试要求
#### 3. 引用真源约束(强制)
- 提示词开头必须引用 `docs/requirements/``docs/design/` 的文件链接
- 引用格式:`[需求文档](../requirements/YYYY-MM-DD-00X-需求名.md)`
- 引用格式:`[设计文档](../design/YYYY-MM-DD-00X-设计名.md)`
#### 4. 输出格式约束(强制)
- 必须定义输出格式,如:必须包含单元测试,必须符合某设计模式
- 必须定义代码结构Controller、Service、Mapper、Entity 分层
- 必须定义命名规范,如:类名、方法名、变量名的命名规则
- 必须定义注释规范,如:类注释、方法注释、字段注释
#### 5. 索引更新约束(强制)
- 必须在生成提示词后立即更新 `docs/index.md`
- 必须更新需求文档,添加提示词引用
- 采用增量更新策略,**严禁**删除现有内容
- 索引链接格式:`[文档名](./相对路径/文件名.md)`
- 必须在 `docs/index.md` 中添加到"提示词"部分
#### 6. 会话记录约束(强制)
- 必须更新 `docs/sessions/YYYY-MM-DD-00X-session.md`
- 必须更新当前阶段为"阶段 5提示词生成"
- 必须记录提示词内容摘要
- 必须记录提示词链接
### 业务逻辑 SOP标准操作流程
#### 步骤 1提示词分析Let's think step by step
在生成提示词前,必须执行以下分析:
1. **分析需求的核心任务**
- 读取阶段 1 创建的需求文档
- 识别需求的核心功能和非功能需求
- 确定需要生成的代码类型Controller、Service、Mapper、Entity 等)
2. **确定需要生成的提示词类型**
- 根据需求类型确定提示词类型:
- 功能开发提示词
- Bug 修复提示词
- 性能优化提示词
- 重构提示词
- 根据技术栈确定提示词类型:
- Spring Boot 提示词
- MyBatis Plus 提示词
- 若依框架提示词
- Salesforce API 提示词
3. **设计提示词的结构和内容**
- 引用真源(需求文档和设计文档)
- 需求描述
- 设计方案
- 输出格式要求
- 代码规范要求
- 测试要求
#### 步骤 2生成提示词
1. **确定文档路径**
- 路径:`docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md`
- 使用 Write 工具创建文件
- 确保目录存在(使用 LS 工具检查)
2. **填充提示词内容**
- **引用真源**
```markdown
# 提示词:用户登录功能
## 引用真源
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
```
- **需求描述**
```markdown
## 需求描述
根据需求文档,实现用户登录功能,包括:
1. 用户名和密码验证
2. 记住密码功能
3. 自动登录功能
4. 登录失败提示
5. 登录成功后跳转到首页
```
- **设计方案**
```markdown
## 设计方案
根据设计文档,采用以下技术方案:
1. 认证框架Spring Security 6.x
2. Token 生成JWT
3. 密码加密BCrypt
4. 会话管理Redis 存储 Token
5. 权限框架:若依权限系统
```
- **输出格式要求**
```markdown
## 输出格式要求
1. 必须包含以下文件:
- Controller`SysLoginController.java`
- Service`SysLoginService.java`
- Mapper`SysUserMapper.java`
- Entity`SysUser.java`
- 配置类:`SecurityConfig.java`
2. 必须包含单元测试:
- `SysLoginServiceTest.java`
3. 必须符合 Spring Boot 最佳实践
4. 必须遵循若依框架规范
```
- **代码规范要求**
```markdown
## 代码规范要求
1. 类命名:首字母大写,驼峰命名,如 `SysLoginController`
2. 方法命名:首字母小写,驼峰命名,如 `login`
3. 变量命名:首字母小写,驼峰命名,如 `userName`
4. 注释规范:
- 类注释:使用 `/** */`,包含类功能描述
- 方法注释:使用 `/** */`,包含方法功能、参数、返回值描述
- 字段注释:使用 `/** */`,包含字段功能描述
```
- **测试要求**
```markdown
## 测试要求
1. 单元测试覆盖率不低于 80%
2. 测试用例包含正常场景和异常场景
3. 使用 JUnit 5 和 Mockito 进行测试
4. 测试用例命名规范:`test+方法名+场景`,如 `testLoginSuccess`
```
3. **提示词质量检查**
- 使用 Read 工具读取刚创建的提示词
- 检查是否符合提示词内容约束
- 检查是否引用了真源
- 检查输出格式要求是否明确
- 检查代码规范要求是否明确
- 检查测试要求是否明确
#### 步骤 3更新索引和需求文档
1. **读取现有索引**
- 使用 Read 工具读取 `docs/index.md`
- 找到"提示词"部分
- 如果不存在,则创建该部分
2. **添加新提示词链接**
- 在"提示词"部分追加新提示词
- 格式:`- [提示词名](./prompts/YYYY-MM-DD-00X-prompt-提示词名.md) - [描述]`
- 示例:`- [用户登录功能提示词](./prompts/2026-01-21-001-prompt-用户登录功能.md) - 用户登录功能的执行提示词`
3. **更新需求文档**
- 使用 Read 工具读取需求文档
- 在"相关文档"部分添加提示词引用
- 格式:`- [提示词文档](../prompts/YYYY-MM-DD-00X-prompt-提示词名.md)`
- 使用 Write 工具更新需求文档
4. **保存索引**
- 使用 Write 工具更新 `docs/index.md`
- **严禁**删除现有内容,只追加新内容
#### 步骤 4更新会话记录
1. **读取现有会话记录**
- 使用 Read 工具读取 `docs/sessions/YYYY-MM-DD-00X-session.md`
2. **更新阶段 5 信息**
- 更新"当前阶段"为"阶段 5提示词生成"
- 更新"阶段 5提示词生成"的状态为"已完成"
- 添加生成的提示词链接
- 记录提示词内容摘要
3. **保存会话记录**
- 使用 Write 工具更新会话记录
#### 步骤 5确认与询问
1. **向用户确认**
- 显示提示词的链接
- 询问:"提示词是否合适?"
- 询问:"是否进入下一阶段(执行代码生成)?"
2. **等待用户反馈**
- 如果用户不满意,询问具体需要修改的地方
- 如果用户要求回退,执行回退机制(见错误陷阱部分)
- 如果用户确认,标记阶段 5 为已完成,准备进入阶段 6
### 工具调用
#### 必须使用的工具
1. **Read 工具**:读取现有文件
- 使用场景:读取需求文档、设计文档、索引、会话记录、提示词模板
- 命令:`Read(file_path="d:\\idea_demo\\datai\\docs\\requirements\\2026-01-21-001-用户登录功能.md")`
2. **Write 工具**:创建或更新文件
- 使用场景:生成提示词、更新索引、更新需求文档、更新会话记录
- 命令:`Write(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md", content="...")`
3. **LS 工具**:检查目录是否存在
- 使用场景:创建提示词前检查 `docs/prompts/` 目录
- 命令:`LS(path="d:\\idea_demo\\datai\\docs")`
4. **SearchCodebase 工具**:搜索现有提示词
- 使用场景:查找现有提示词作为参考
- 命令:`SearchCodebase(information_request="查找 docs/prompts 目录下的所有提示词")`
#### 可选使用的工具
1. **Glob 工具**:查找文件
- 使用场景:查找所有提示词
- 命令:`Glob(pattern="docs/prompts/*.md")`
2. **TodoWrite 工具**:管理任务
- 使用场景:跟踪阶段执行进度
- 命令:`TodoWrite(todos=[...])`
---
## D. 错误陷阱与验证 (Anti-Patterns & Checklist)
### 常见错误Anti-Patterns
#### 错误 1不引用真源
**错误示例**
```markdown
# 提示词:用户登录功能
## 需求描述
实现用户登录功能...
```
**问题**
- 没有引用真源(需求文档和设计文档)
- 违反了 SSOT 原则
**正确示例**
```markdown
# 提示词:用户登录功能
## 引用真源
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
## 需求描述
实现用户登录功能...
```
#### 错误 2输出格式要求不明确
**错误示例**
```markdown
## 输出格式要求
请生成用户登录功能的代码。
```
**问题**
- 输出格式要求不明确
- 没有指定需要生成的文件
- 没有指定代码规范
- 没有指定测试要求
**正确示例**
```markdown
## 输出格式要求
1. 必须包含以下文件:
- Controller`SysLoginController.java`
- Service`SysLoginService.java`
- Mapper`SysUserMapper.java`
- Entity`SysUser.java`
- 配置类:`SecurityConfig.java`
2. 必须包含单元测试:
- `SysLoginServiceTest.java`
3. 必须符合 Spring Boot 最佳实践
4. 必须遵循若依框架规范
```
#### 错误 3代码规范要求不明确
**错误示例**
```markdown
## 代码规范要求
请遵循项目代码规范。
```
**问题**
- 代码规范要求不明确
- 没有指定具体的命名规范
- 没有指定具体的注释规范
**正确示例**
```markdown
## 代码规范要求
1. 类命名:首字母大写,驼峰命名,如 `SysLoginController`
2. 方法命名:首字母小写,驼峰命名,如 `login`
3. 变量命名:首字母小写,驼峰命名,如 `userName`
4. 注释规范:
- 类注释:使用 `/** */`,包含类功能描述
- 方法注释:使用 `/** */`,包含方法功能、参数、返回值描述
- 字段注释:使用 `/** */`,包含字段功能描述
```
#### 错误 4测试要求不明确
**错误示例**
```markdown
## 测试要求
请添加单元测试。
```
**问题**
- 测试要求不明确
- 没有指定测试覆盖率
- 没有指定测试框架
- 没有指定测试用例规范
**正确示例**
```markdown
## 测试要求
1. 单元测试覆盖率不低于 80%
2. 测试用例包含正常场景和异常场景
3. 使用 JUnit 5 和 Mockito 进行测试
4. 测试用例命名规范:`test+方法名+场景`,如 `testLoginSuccess`
```
#### 错误 5不更新需求文档的提示词引用
**错误示例**
```
AI生成提示词
AI更新 docs/index.md
AI完成忘记更新需求文档
```
**正确示例**
```
AI生成提示词
AI更新 docs/index.md
AI更新需求文档添加提示词引用
AI完成
```
#### 错误 6不询问用户确认就进入下一阶段
**错误示例**
```
AI生成提示词
AI进入阶段 6执行代码生成未询问用户
```
**正确示例**
```
AI生成提示词
AI提示词已生成[链接]
AI提示词是否合适
AI是否进入下一阶段执行代码生成
```
### 验收清单Checklist
在完成阶段 5 前,必须检查以下项目:
#### 提示词完整性检查
- [ ] 提示词已创建在 `docs/prompts/` 目录下
- [ ] 提示词命名符合 `YYYY-MM-DD-00X-prompt-提示词名.md` 格式
- [ ] 提示词包含引用真源(需求文档和设计文档的链接)
- [ ] 提示词包含需求描述
- [ ] 提示词包含设计方案
- [ ] 提示词包含输出格式要求
- [ ] 提示词包含代码规范要求
- [ ] 提示词包含测试要求
#### 提示词质量检查
- [ ] 引用真源格式正确
- [ ] 需求描述清晰、准确
- [ ] 设计方案完整、准确
- [ ] 输出格式要求明确、具体
- [ ] 代码规范要求明确、具体
- [ ] 测试要求明确、具体
#### 索引更新检查
- [ ] `docs/index.md` 已更新
- [ ] 新提示词链接已添加到"提示词"部分
- [ ] 索引链接格式正确:`[文档名](./相对路径/文件名.md)`
- [ ] 索引更新采用增量策略,未删除现有内容
#### 需求文档更新检查
- [ ] 需求文档已更新
- [ ] 需求文档的"相关文档"部分已添加提示词引用
- [ ] 提示词引用格式正确:`[提示词文档](../prompts/YYYY-MM-DD-00X-prompt-提示词名.md)`
#### 会话记录更新检查
- [ ] 会话记录已更新
- [ ] 会话记录的"当前阶段"已更新为"阶段 5提示词生成"
- [ ] 会话记录的"阶段 5提示词生成"状态已更新为"已完成"
- [ ] 会话记录包含提示词链接
- [ ] 会话记录包含提示词内容摘要
#### 用户确认检查
- [ ] 已向用户显示提示词链接
- [ ] 已询问用户"提示词是否合适?"
- [ ] 已询问用户"是否进入下一阶段?"
- [ ] 已等待用户反馈
#### 回退机制检查(如果需要)
- [ ] 如果用户不满意,已询问具体需要修改的地方
- [ ] 如果用户要求回退,已删除相关文档
- [ ] 如果用户要求回退,已撤销索引更新
- [ ] 如果用户要求回退,已撤销需求文档更新
- [ ] 如果用户要求回退,已更新会话记录
### Correct vs Incorrect 代码对比
#### Incorrect错误示例
```markdown
# 提示词:用户登录功能
## 需求描述
实现用户登录功能,包括用户名和密码验证、记住密码、自动登录等。
## 设计方案
使用 Spring Security 和 JWT。
## 输出格式要求
请生成代码。
```
#### Correct正确示例
```markdown
# 提示词:用户登录功能
## 引用真源
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
## 需求描述
根据需求文档,实现用户登录功能,包括:
1. 用户名和密码验证
2. 记住密码功能
3. 自动登录功能
4. 登录失败提示
5. 登录成功后跳转到首页
## 设计方案
根据设计文档,采用以下技术方案:
1. 认证框架Spring Security 6.x
2. Token 生成JWT
3. 密码加密BCrypt
4. 会话管理Redis 存储 Token
5. 权限框架:若依权限系统
## 输出格式要求
1. 必须包含以下文件:
- Controller`SysLoginController.java`(路径:`datai-modules-system/src/main/java/com/datai/modules/system/controller/SysLoginController.java`
- Service`SysLoginService.java`(路径:`datai-modules-system/src/main/java/com/datai/modules/system/service/SysLoginService.java`
- Mapper`SysUserMapper.java`(路径:`datai-modules-system/src/main/java/com/datai/modules/system/mapper/SysUserMapper.java`
- Entity`SysUser.java`(路径:`datai-modules-system/src/main/java/com/datai/modules/system/domain/SysUser.java`
- 配置类:`SecurityConfig.java`(路径:`datai-modules-system/src/main/java/com/datai/modules/system/config/SecurityConfig.java`
2. 必须包含单元测试:
- `SysLoginServiceTest.java`(路径:`datai-modules-system/src/test/java/com/datai/modules/system/service/SysLoginServiceTest.java`
3. 必须符合 Spring Boot 最佳实践
4. 必须遵循若依框架规范
5. 必须使用 MyBatis Plus 进行数据库操作
## 代码规范要求
1. 类命名:首字母大写,驼峰命名,如 `SysLoginController`
2. 方法命名:首字母小写,驼峰命名,如 `login`
3. 变量命名:首字母小写,驼峰命名,如 `userName`
4. 注释规范:
- 类注释:使用 `/** */`,包含类功能描述、作者、创建时间
- 方法注释:使用 `/** */`,包含方法功能、参数、返回值、异常描述
- 字段注释:使用 `/** */`,包含字段功能描述
5. 代码格式:使用 4 个空格缩进,行宽不超过 120 字符
6. 导入规范:使用 import 静态导入,避免通配符导入
## 测试要求
1. 单元测试覆盖率不低于 80%
2. 测试用例包含以下场景:
- 正常登录成功
- 用户名不存在
- 密码错误
- 用户已停用
- 验证码错误
3. 使用 JUnit 5 和 Mockito 进行测试
4. 测试用例命名规范:`test+方法名+场景`,如 `testLoginSuccess`
5. 测试数据使用 Mockito 模拟
## 注意事项
1. 必须处理 Salesforce API 的空值情况
2. 必须使用若依的 `@DataScope` 注解进行数据权限控制
3. 必须使用若依的 `@Log` 注解记录操作日志
4. 必须使用若依的 `GlobalExceptionHandler` 处理异常
```
---
## 附录:快速参考
### 文件路径速查
- 需求文档:`docs/requirements/YYYY-MM-DD-00X-需求名.md`
- 设计文档:`docs/design/YYYY-MM-DD-00X-设计名.md`
- 提示词:`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`
- 提示词模板:`docs/Prompt/0000-template.md`
### 工具命令速查
```powershell
# 读取需求文档
Read(file_path="d:\\idea_demo\\datai\\docs\\requirements\\2026-01-21-001-用户登录功能.md")
# 读取设计文档
Read(file_path="d:\\idea_demo\\datai\\docs\\design\\2026-01-21-001-用户登录功能-设计.md")
# 生成提示词
Write(file_path="d:\\idea_demo\\datai\\docs\\prompts\\2026-01-21-001-prompt-用户登录功能.md", content="...")
# 读取索引
Read(file_path="d:\\idea_demo\\datai\\docs\\index.md")
# 更新索引
Write(file_path="d:\\idea_demo\\datai\\docs\\index.md", content="...")
# 搜索现有提示词
SearchCodebase(information_request="查找 docs/prompts 目录下的所有提示词")
# 查找所有提示词
Glob(pattern="docs/prompts/*.md")
```
### 阶段 5 输出清单
- [ ] 提示词文档:`docs/prompts/YYYY-MM-DD-00X-prompt-提示词名.md`
- [ ] 更新的索引:`docs/index.md`
- [ ] 更新的需求文档:`docs/requirements/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) 的"阶段 6执行代码生成"
- 准备分析需求和设计文档
- 准备确定需要生成的代码文件
- 准备加载阶段 5 生成的提示词
- 准备生成代码