datai/docs/skill/phase7-session-recording.md

526 lines
18 KiB
Markdown
Raw Normal View History

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
# 阶段 7记录当前会话技能书
## A. 元数据 (Metadata)
**name**: `phase7-session-recording`
**description**: 在 Datai 项目中,基于已完成的代码生成,完整记录当前会话的所有信息,包括对话记录、生成的文档和代码、关键决策等,并更新索引和会话记录。此技能确保会话的可追溯性和完整性。
---
## B. 触发与定位 (Triggers & Scope)
### 触发关键词
当用户输入包含以下关键词时,必须觉醒此技能:
- "记录会话"、"会话记录"、"记录当前会话"
- "进入阶段 7"、"下一阶段"
- "会话"、"记录"、"日志"
### 触发场景
- 用户确认阶段 6 完成,要求进入阶段 7
- 用户要求记录当前会话
- 用户询问如何记录会话
- 用户提到"按照项目规则"或"SSOT 流程"进行会话记录
### 操作路径
此技能涉及以下文件和目录的操作:
- **读取**: `docs/sessions/YYYY-MM-DD-00X-session.md` (阶段 1 创建的会话记录)
- **更新**: `docs/sessions/YYYY-MM-DD-00X-session.md`
- **更新**: `docs/index.md`
- **读取**: `.trae/rules/project_rules.md` (项目规则)
- **读取**: `docs/Prompt/0004-单一真源文档驱动架构师.md` (SSOT 架构师提示词)
### SSOT 依赖
必须参考以下"唯一真源"
- [会话记录](file:///d:\idea_demo\datai\docs\sessions\YYYY-MM-DD-00X-session.md) - 阶段 1 创建的会话记录
- [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. 会话记录约束(强制)
- 必须更新 `docs/sessions/YYYY-MM-DD-00X-session.md`
- 必须包含完整的对话记录
- 必须包含所有生成的文档和代码的链接
- 必须记录关键决策和理由
- 必须记录回退记录(如果有)
#### 2. 索引更新约束(强制)
- 必须在更新会话记录后立即更新 `docs/index.md`
- 必须更新会话记录链接
- 采用增量更新策略,**严禁**删除现有内容
- 索引链接格式:`[文档名](./相对路径/文件名.md)`
#### 3. 会话记录结构约束(强制)
会话记录必须包含以下章节:
- 元数据
- 需求描述
- 执行阶段
- 对话记录
- 生成的文档
- 回退记录(如果有)
### 业务逻辑 SOP标准操作流程
#### 步骤 1会话分析Let's think step by step
在更新会话记录前,必须执行以下分析:
1. **回顾整个会话过程**
- 从阶段 1 到阶段 6 的完整过程
- 识别关键节点和里程碑
- 识别会话的起止时间
2. **识别关键决策和讨论点**
- 需求分析阶段的关键决策
- 设计阶段的关键决策
- 决策记录阶段的关键决策
- 代码生成阶段的关键决策
- 任何讨论和争议点
3. **整理所有生成的文档和代码**
- 需求文档
- 设计文档
- 决策记录
- SQL 脚本(如果有)
- 提示词
- 代码文件
- 参考代码文档
- 实施方案文档
#### 步骤 2更新会话记录
1. **读取现有会话记录**
- 使用 Read 工具读取 `docs/sessions/YYYY-MM-DD-00X-session.md`
- 了解现有会话记录的内容和结构
2. **更新元数据**
- 更新"结束时间"为当前时间
- 更新"当前阶段"为"阶段 7记录当前会话"
- 更新"状态"为"已完成"
3. **更新执行阶段**
- 更新所有阶段的状态:
- 阶段 1已完成
- 阶段 2已完成
- 阶段 3已完成
- 阶段 4已完成/跳过
- 阶段 5已完成
- 阶段 6已完成
- 阶段 7已完成
- 阶段 8未开始
- 阶段 9未开始
- 阶段 10未开始
- 为每个已完成的阶段添加:
- 生成的文档链接
- 关键决策
- 状态
4. **添加完整的对话记录**
- 记录用户的原始需求
- 记录 AI 的分析和决策
- 记录用户的反馈和确认
- 记录任何回退操作和原因
- 记录关键讨论和争议点
5. **添加所有生成的文档**
- 需求文档
- 设计文档
- 决策记录
- SQL 脚本(如果有)
- 提示词
- 参考代码文档
- 实施方案文档
- API 文档(如果有)
- 复盘文档(如果有)
6. **添加回退记录(如果有)**
- 记录回退的阶段
- 记录回退的原因
- 记录回退的操作
- 记录回退后的处理
7. **会话记录质量检查**
- 使用 Read 工具读取更新后的会话记录
- 检查是否包含所有必需章节
- 检查是否包含完整的对话记录
- 检查是否包含所有生成的文档和代码的链接
- 检查是否包含关键决策和理由
- 检查是否包含回退记录(如果有)
#### 步骤 3更新索引
1. **读取现有索引**
- 使用 Read 工具读取 `docs/index.md`
- 找到"会话记录"部分
- 如果不存在,则创建该部分
2. **更新会话记录链接**
- 更新"会话记录"部分的会话记录链接
- 确保链接指向最新的会话记录
- 格式:`- [会话记录](./sessions/YYYY-MM-DD-00X-session.md) - [需求名]`
- 示例:`- [会话记录](./sessions/2026-01-21-001-session.md) - 用户登录功能`
3. **保存索引**
- 使用 Write 工具更新 `docs/index.md`
- **严禁**删除现有内容,只更新会话记录链接
#### 步骤 4确认与询问
1. **向用户确认**
- 显示更新后的会话记录的链接
- 询问:"会话记录是否完整?"
- 询问:"是否进入下一阶段(变更记录与归档)?"
2. **等待用户反馈**
- 如果用户不满意,询问具体需要修改的地方
- 如果用户要求回退,执行回退机制(见错误陷阱部分)
- 如果用户确认,标记阶段 7 为已完成,准备进入阶段 8
### 工具调用
#### 必须使用的工具
1. **Read 工具**:读取现有文件
- 使用场景:读取会话记录、读取索引
- 命令:`Read(file_path="d:\\idea_demo\\datai\\docs\\sessions\\2026-01-21-001-session.md")`
2. **Write 工具**:创建或更新文件
- 使用场景:更新会话记录、更新索引
- 命令:`Write(file_path="d:\\idea_demo\\datai\\docs\\sessions\\2026-01-21-001-session.md", content="...")`
3. **LS 工具**:检查目录是否存在
- 使用场景:确认 `docs/sessions/` 目录存在
- 命令:`LS(path="d:\\idea_demo\\datai\\docs")`
#### 可选使用的工具
1. **TodoWrite 工具**:管理任务
- 使用场景:跟踪阶段执行进度
- 命令:`TodoWrite(todos=[...])`
---
## D. 错误陷阱与验证 (Anti-Patterns & Checklist)
### 常见错误Anti-Patterns
#### 错误 1不完整记录对话
**错误示例**
```markdown
## 对话记录
用户:实现用户登录功能
AI好的开始执行...
AI完成
```
**问题**
- 对话记录过于简单
- 没有记录具体的分析过程
- 没有记录关键决策
- 没有记录用户的反馈和确认
**正确示例**
```markdown
## 对话记录
2026-01-21 10:00:00 用户:请实现一个用户登录功能,包括用户名和密码验证、记住密码、自动登录等功能。
2026-01-21 10:01:00 AI好的我将按照 SSOT 流程执行。首先进入阶段 1需求定义与入库。
2026-01-21 10:02:00 AI我需要分析您的需求将其拆解为用户故事和验收标准。
2026-01-21 10:03:00 用户:好的,麻烦了。
2026-01-21 10:10:00 AI已创建需求文档[链接],需求文档是否符合预期?
2026-01-21 10:11:00 用户:符合预期,可以进入下一阶段。
2026-01-21 10:12:00 AI好的进入阶段 2方案设计。
...(完整的对话记录)
```
#### 错误 2不记录生成的文档和代码
**错误示例**
```markdown
## 生成的文档
```
**问题**
- 没有记录生成的文档和代码
- 违反了 SSOT 原则
- 无法追溯生成的内容
**正确示例**
```markdown
## 生成的文档
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
- [决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
- [提示词](../prompts/2026-01-21-001-prompt-用户登录功能.md)
- [参考代码文档](../reference-code/2026-01-21-001-code-用户登录功能.md)
- [实施方案文档](../implementation/2026-01-21-001-implementation-用户登录功能.md)
## 生成的代码文件
- `datai-modules-system/src/main/java/com/datai/modules/system/controller/SysLoginController.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/service/SysLoginService.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/mapper/SysUserMapper.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/domain/SysUser.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/config/SecurityConfig.java`
- `datai-modules-system/src/test/java/com/datai/modules/system/service/SysLoginServiceTest.java`
```
#### 错误 3不记录关键决策
**错误示例**
```markdown
## 执行阶段
### 阶段 3方案决策
- 状态:已完成
- 生成文档:[决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
- 关键决策:无
```
**问题**
- 没有记录关键决策
- 无法追溯决策的理由和过程
- 违反了 SSOT 原则
**正确示例**
```markdown
## 执行阶段
### 阶段 3方案决策
- 状态:已完成
- 生成文档:[决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
- 关键决策:
1. 选择 Spring Security + JWT 作为认证方案
2. 拒绝 Shiro + Redis 方案,因为与 Spring Boot 集成不如 Spring Security 紧密
3. 拒绝自定义认证方案,因为开发成本高,安全性难以保证
```
#### 错误 4不更新索引
**错误示例**
```
AI更新会话记录
AI完成忘记更新索引
```
**正确示例**
```
AI更新会话记录
AI更新 docs/index.md更新会话记录链接
AI完成
```
#### 错误 5不询问用户确认就进入下一阶段
**错误示例**
```
AI更新会话记录
AI进入阶段 8变更记录与归档未询问用户
```
**正确示例**
```
AI更新会话记录
AI会话记录已更新[链接]
AI会话记录是否完整
AI是否进入下一阶段变更记录与归档
```
### 验收清单Checklist
在完成阶段 7 前,必须检查以下项目:
#### 会话记录完整性检查
- [ ] 会话记录已更新
- [ ] 会话记录包含完整的元数据(需求编号、开始时间、结束时间、当前阶段、状态)
- [ ] 会话记录包含完整的需求描述
- [ ] 会话记录包含所有执行阶段的状态和生成文档
- [ ] 会话记录包含完整的对话记录
- [ ] 会话记录包含所有生成的文档和代码的链接
- [ ] 会话记录包含关键决策和理由
- [ ] 会话记录包含回退记录(如果有)
#### 会话记录质量检查
- [ ] 对话记录按时间顺序排列
- [ ] 对话记录包含用户和 AI 的所有交流
- [ ] 生成的文档和代码链接正确
- [ ] 关键决策描述清晰、准确
- [ ] 会话记录格式规范、易读
#### 索引更新检查
- [ ] `docs/index.md` 已更新
- [ ] 会话记录链接已更新
- [ ] 索引链接格式正确:`[文档名](./相对路径/文件名.md)`
- [ ] 索引更新采用增量策略,未删除现有内容
#### 用户确认检查
- [ ] 已向用户显示更新后的会话记录链接
- [ ] 已询问用户"会话记录是否完整?"
- [ ] 已询问用户"是否进入下一阶段?"
- [ ] 已等待用户反馈
#### 回退机制检查(如果需要)
- [ ] 如果用户不满意,已询问具体需要修改的地方
- [ ] 如果用户要求回退,已删除相关文档
- [ ] 如果用户要求回退,已撤销索引更新
- [ ] 如果用户要求回退,已更新会话记录
### Correct vs Incorrect 代码对比
#### Incorrect错误示例
```markdown
# 会话记录
## 元数据
- 需求编号001
- 开始时间2026-01-21 10:00:00
- 结束时间2026-01-21 12:00:00
- 当前阶段:阶段 7记录当前会话
## 需求描述
实现用户登录功能
## 执行阶段
### 阶段 1需求定义与入库
- 状态:已完成
- 生成文档:[需求文档](../requirements/2026-01-21-001-用户登录功能.md)
### 阶段 2方案设计
- 状态:已完成
- 生成文档:[设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
## 对话记录
用户:实现用户登录功能
AI好的开始执行...
AI完成
## 生成的文档
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
```
#### Correct正确示例
```markdown
# 会话记录
## 元数据
- 需求编号001
- 开始时间2026-01-21 10:00:00
- 结束时间2026-01-21 12:00:00
- 当前阶段:阶段 7记录当前会话
- 状态:已完成
## 需求描述
实现用户登录功能,包括用户名和密码验证、记住密码、自动登录、登录失败提示、登录成功后跳转到首页等功能。
## 执行阶段
### 阶段 1需求定义与入库
- 状态:已完成
- 生成文档:[需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- 关键决策:确定需求优先级为高,复杂度为中等
### 阶段 2方案设计
- 状态:已完成
- 生成文档:[设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
- 关键决策:
1. 采用 Spring Security + JWT 作为认证方案
2. 采用 Redis 存储 Token
3. 采用 BCrypt 进行密码加密
### 阶段 3方案决策
- 状态:已完成
- 生成文档:[决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
- 关键决策:
1. 选择 Spring Security + JWT 作为认证方案
2. 拒绝 Shiro + Redis 方案,因为与 Spring Boot 集成不如 Spring Security 紧密
3. 拒绝自定义认证方案,因为开发成本高,安全性难以保证
### 阶段 4数据库结构生成
- 状态:已完成
- 生成文档:[SQL 脚本](../sql/2026-01-21-001-user-login.sql)
- 关键决策:修改 sys_user 表,添加 login_ip 和 login_date 字段
### 阶段 5提示词生成
- 状态:已完成
- 生成文档:[提示词](../prompts/2026-01-21-001-prompt-用户登录功能.md)
- 关键决策:定义了详细的输出格式要求和代码规范
### 阶段 6执行代码生成
- 状态:已完成
- 生成文档:
- [参考代码文档](../reference-code/2026-01-21-001-code-用户登录功能.md)
- [实施方案文档](../implementation/2026-01-21-001-implementation-用户登录功能.md)
- 生成代码文件:
- `SysLoginController.java`
- `SysLoginService.java`
- `SysUserMapper.java`
- `SysUser.java`
- `SecurityConfig.java`
- `SysLoginServiceTest.java`
- 关键决策:按照提示词要求生成了所有代码文件和单元测试
### 阶段 7记录当前会话
- 状态:已完成
- 生成文档:无
- 关键决策:完整记录了当前会话的所有信息
## 对话记录
2026-01-21 10:00:00 用户:请实现一个用户登录功能,包括用户名和密码验证、记住密码、自动登录等功能。
2026-01-21 10:01:00 AI好的我将按照 SSOT 流程执行。首先进入阶段 1需求定义与入库。
2026-01-21 10:02:00 AI我需要分析您的需求将其拆解为用户故事和验收标准。
2026-01-21 10:03:00 用户:好的,麻烦了。
2026-01-21 10:10:00 AI已创建需求文档[链接],需求文档是否符合预期?
2026-01-21 10:11:00 用户:符合预期,可以进入下一阶段。
2026-01-21 10:12:00 AI好的进入阶段 2方案设计。
...(完整的对话记录)
2026-01-21 12:00:00 AI会话记录已更新[链接],会话记录是否完整?
## 生成的文档
- [需求文档](../requirements/2026-01-21-001-用户登录功能.md)
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
- [决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
- [SQL 脚本](../sql/2026-01-21-001-user-login.sql)
- [提示词](../prompts/2026-01-21-001-prompt-用户登录功能.md)
- [参考代码文档](../reference-code/2026-01-21-001-code-用户登录功能.md)
- [实施方案文档](../implementation/2026-01-21-001-implementation-用户登录功能.md)
## 生成的代码文件
- `datai-modules-system/src/main/java/com/datai/modules/system/controller/SysLoginController.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/service/SysLoginService.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/mapper/SysUserMapper.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/domain/SysUser.java`
- `datai-modules-system/src/main/java/com/datai/modules/system/config/SecurityConfig.java`
- `datai-modules-system/src/test/java/com/datai/modules/system/service/SysLoginServiceTest.java`
## 回退记录
```
---
## 附录:快速参考
### 文件路径速查
- 会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
- 主索引:`docs/index.md`
- 项目规则:`.trae/rules/project_rules.md`
- SSOT 架构师提示词:`docs/Prompt/0004-单一真源文档驱动架构师.md`
### 工具命令速查
```powershell
# 读取会话记录
Read(file_path="d:\\idea_demo\\datai\\docs\\sessions\\2026-01-21-001-session.md")
# 更新会话记录
Write(file_path="d:\\idea_demo\\datai\\docs\\sessions\\2026-01-21-001-session.md", content="...")
# 读取索引
Read(file_path="d:\\idea_demo\\datai\\docs\\index.md")
# 更新索引
Write(file_path="d:\\idea_demo\\datai\\docs\\index.md", content="...")
```
### 阶段 7 输出清单
- [ ] 完整的会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
- [ ] 更新的索引:`docs/index.md`
### 下一阶段提示
如果用户确认进入下一阶段,请参考:
- [project_rules.md](file:///d:\idea_demo\datai\.trae\rules\project_rules.md) 的"阶段 8变更记录与归档"
- 准备创建变更日志
- 准备更新 CHANGELOG.md 和 docs/changelog/
- 准备在 docs/index.md 中标注该需求已完成