datai/docs/skill/phase7-session-recording.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

526 lines
18 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.

# 阶段 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 中标注该需求已完成