datai/docs/skill/phase1-requirement-definition.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

509 lines
16 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.

# 阶段 1需求定义与入库技能书
## A. 元数据 (Metadata)
**name**: `phase1-requirement-definition`
**description**: 在 Datai 项目中当用户提出新功能、Bug 修复、性能优化或重构需求时,负责创建标准化的需求文档、更新索引、建立需求追踪,并初始化会话记录。此技能是 SSOT 架构的起点,确保所有开发活动都有文档依据。
---
## B. 触发与定位 (Triggers & Scope)
### 触发关键词
当用户输入包含以下关键词时,必须觉醒此技能:
- "新增功能"、"添加功能"、"实现功能"
- "修复 bug"、"修复问题"、"解决错误"
- "优化性能"、"性能调优"
- "重构"、"重构代码"
- "需求"、"需求文档"、"PRD"
- "开发任务"、"开发需求"
### 触发场景
- 用户首次提出新的开发需求
- 用户要求创建需求文档
- 用户提到"按照项目规则"或"SSOT 流程"
- 用户询问如何开始一个开发任务
### 操作路径
此技能涉及以下文件和目录的操作:
- **创建**: `docs/requirements/YYYY-MM-DD-00X-需求名.md`
- **更新**: `docs/index.md`
- **创建**: `docs/sessions/YYYY-MM-DD-00X-session.md`
- **读取**: `.trae/rules/project_rules.md` (项目规则)
- **读取**: `docs/Prompt/0004-单一真源文档驱动架构师.md` (SSOT 架构师提示词)
### SSOT 依赖
必须参考以下"唯一真源"
- [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 架构师提示词
- `docs/requirements/` 目录下的现有需求文档(作为格式参考)
---
## C. 核心指令集 (Instructions)
### 架构约束
#### 1. 文档命名规范(强制)
- 必须使用格式:`YYYY-MM-DD-00X-需求名.md`
- `YYYY-MM-DD`:当前日期(如 2026-01-21
- `00X`:需求编号,从 001 开始递增
- `需求名`:简洁描述,使用中文,如"用户登录功能"、"订单导出优化"
- **严禁**使用英文、拼音或无意义的文件名
#### 2. 文档结构约束(强制)
需求文档必须包含以下章节,顺序不能改变:
```markdown
# 需求文档
## 元数据
- 需求编号001
- 创建时间YYYY-MM-DD
- 创建人AI Assistant
- 状态:进行中
- 优先级:高/中/低
## 需求概述
[需求描述]
## 目标
[需求目标]
## 功能需求
### 核心功能
- [功能1]
- [功能2]
### 次要功能
- [功能1]
- [功能2]
## 非功能需求
### 性能要求
[性能要求]
### 安全要求
[安全要求]
### 兼容性要求
[兼容性要求]
## 技术约束
[技术约束]
## 成功标准
[成功标准]
## 相关文档
- [设计文档](../design/YYYY-MM-DD-00X-设计名.md)
- [决策记录](../decisions/YYYY-MM-DD-00X-ADR-决策名.md)
```
#### 3. 索引更新约束(强制)
- 必须在创建需求文档后立即更新 `docs/index.md`
- 采用增量更新策略,**严禁**删除现有内容
- 索引链接格式:`[文档名](./相对路径/文件名.md)`
- 必须在 `docs/index.md` 中添加到"需求文档"部分
#### 4. 会话记录约束(强制)
- 必须在 `docs/sessions/` 目录下创建会话记录
- 文件命名:`YYYY-MM-DD-00X-session.md`
- 必须记录需求编号和当前阶段(阶段 1
- 必须包含用户原始需求的完整描述
### 业务逻辑 SOP标准操作流程
#### 步骤 1需求分析Let's think step by step
在创建文档前,必须执行以下分析:
1. **分析用户需求的核心目标**
- 识别用户真正想要解决的问题
- 区分表面需求和深层需求
- 提炼出 1-2 句简洁的需求概述
2. **识别需求的关键要素**
- 涉及哪些业务模块(如 `datai-modules-salesforce`、`datai-modules-system`
- 涉及哪些技术组件(如 Salesforce API、MyBatis Plus、若依权限
- 是否涉及数据库变更
- 是否涉及外部接口调用
3. **确定需求的优先级和复杂度**
- 优先级:高(阻塞功能)/ 中(重要功能)/ 低(优化改进)
- 复杂度简单1-2 天)/ 中等3-5 天)/ 复杂5 天以上)
- 根据复杂度预估是否需要拆分为多个子需求
#### 步骤 2创建需求文档
1. **确定文档路径**
- 路径:`docs/requirements/YYYY-MM-DD-00X-需求名.md`
- 使用 Write 工具创建文件
- 确保目录存在(使用 LS 工具检查)
2. **填充文档内容**
- **元数据**:填写需求编号、创建时间、状态、优先级
- **需求概述**:用 2-3 句话描述需求的核心内容
- **目标**:列出 1-3 个明确的、可衡量的目标
- **功能需求**
- 核心功能必须实现的功能2-5 项)
- 次要功能可选或后续迭代的功能1-3 项)
- **非功能需求**
- 性能要求:响应时间、并发数等
- 安全要求:权限控制、数据加密等
- 兼容性要求:浏览器、操作系统、数据库版本等
- **技术约束**
- 必须使用的框架或库
- 必须遵循的设计模式
- 必须继承的基类
- **成功标准**:列出 3-5 个可验证的验收标准
- **相关文档**:暂时为空,后续阶段会填充
3. **文档质量检查**
- 使用 Read 工具读取刚创建的文档
- 检查是否符合文档结构约束
- 检查是否有遗漏的章节
- 检查语言是否清晰、无歧义
#### 步骤 3更新索引
1. **读取现有索引**
- 使用 Read 工具读取 `docs/index.md`
- 找到"需求文档"部分
- 如果不存在,则创建该部分
2. **添加新需求链接**
- 在"需求文档"部分追加新需求
- 格式:`- [需求名](./requirements/YYYY-MM-DD-00X-需求名.md) - [状态] - [优先级]`
- 示例:`- [用户登录功能](./requirements/2026-01-21-001-用户登录功能.md) - 进行中 - 高`
3. **保存索引**
- 使用 Write 工具更新 `docs/index.md`
- **严禁**删除现有内容,只追加新内容
#### 步骤 4创建会话记录
1. **创建会话文件**
- 路径:`docs/sessions/YYYY-MM-DD-00X-session.md`
- 使用 Write 工具创建文件
2. **填充会话内容**
```markdown
# 会话记录
## 元数据
- 需求编号001
- 开始时间YYYY-MM-DD HH:MM:SS
- 结束时间YYYY-MM-DD HH:MM:SS
- 当前阶段:阶段 1需求定义与入库
## 需求描述
[用户原始需求的完整描述]
## 执行阶段
### 阶段 1需求定义与入库
- 状态:已完成
- 生成文档:[需求文档](../requirements/YYYY-MM-DD-00X-需求名.md)
- 关键决策:[记录关键决策,如优先级、复杂度等]
### 阶段 2方案设计
- 状态:未开始
...(后续阶段初始状态)
## 对话记录
[记录完整的对话过程]
## 生成的文档
- [需求文档](../requirements/YYYY-MM-DD-00X-需求名.md)
## 回退记录
[如果有回退,记录回退操作]
```
3. **记录对话**
- 将用户原始需求完整记录在"需求描述"部分
- 将 AI 的分析和决策记录在"对话记录"部分
#### 步骤 5确认与询问
1. **向用户确认**
- 显示需求文档的链接
- 询问:"需求文档是否符合预期?"
- 询问:"是否进入下一阶段(方案设计)?"
2. **等待用户反馈**
- 如果用户不满意,询问具体需要修改的地方
- 如果用户要求回退,执行回退机制(见错误陷阱部分)
- 如果用户确认,标记阶段 1 为已完成,准备进入阶段 2
### 工具调用
#### 必须使用的工具
1. **LS 工具**:检查目录是否存在
- 使用场景:创建文档前检查 `docs/requirements/`、`docs/sessions/` 目录
- 命令:`LS(path="d:\\idea_demo\\datai\\docs")`
2. **Write 工具**:创建新文件
- 使用场景:创建需求文档、更新索引、创建会话记录
- 命令:`Write(file_path="d:\\idea_demo\\datai\\docs\\requirements\\YYYY-MM-DD-00X-需求名.md", content="...")`
3. **Read 工具**:读取现有文件
- 使用场景:读取 `docs/index.md`、读取刚创建的文档进行验证
- 命令:`Read(file_path="d:\\idea_demo\\datai\\docs\\index.md")`
4. **SearchCodebase 工具**:搜索现有需求
- 使用场景:确定需求编号(避免重复)
- 命令:`SearchCodebase(information_request="查找 docs/requirements 目录下的所有需求文档")`
#### 可选使用的工具
1. **Glob 工具**:查找文件
- 使用场景:查找所有需求文档
- 命令:`Glob(pattern="docs/requirements/*.md")`
2. **TodoWrite 工具**:管理任务
- 使用场景:跟踪阶段执行进度
- 命令:`TodoWrite(todos=[...])`
---
## D. 错误陷阱与验证 (Anti-Patterns & Checklist)
### 常见错误Anti-Patterns
#### 错误 1跳过需求分析直接创建文档
**错误示例**
```
用户:帮我实现一个用户登录功能
AI直接创建文档不分析需求
```
**正确示例**
```
用户:帮我实现一个用户登录功能
AI让我先分析一下这个需求
1. 核心目标:实现用户身份验证
2. 关键要素:涉及 datai-modules-system 模块,使用若依权限系统
3. 优先级:高(核心功能)
4. 复杂度:中等(需要考虑安全性)
```
#### 错误 2文档命名不符合规范
**错误示例**
- `user-login.md`(使用英文)
- `001.md`(缺少日期和描述)
- `需求.md`(无意义)
**正确示例**
- `2026-01-21-001-用户登录功能.md`
- `2026-01-21-002-订单导出优化.md`
#### 错误 3忘记更新索引
**错误示例**
```
AI创建需求文档
AI创建会话记录
AI完成忘记更新 docs/index.md
```
**正确示例**
```
AI创建需求文档
AI更新 docs/index.md添加需求链接
AI创建会话记录
AI完成
```
#### 错误 4需求描述模糊不清
**错误示例**
```
## 需求概述
用户需要一个功能
```
**正确示例**
```
## 需求概述
实现基于用户名和密码的用户登录功能,支持记住密码和自动登录,集成若依权限系统,确保登录过程的安全性。
```
#### 错误 5不询问用户确认就进入下一阶段
**错误示例**
```
AI创建需求文档
AI进入阶段 2方案设计未询问用户
```
**正确示例**
```
AI创建需求文档
AI需求文档已创建[链接]
AI需求文档是否符合预期
AI是否进入下一阶段方案设计
```
### 验收清单Checklist
在完成阶段 1 前,必须检查以下项目:
#### 文档完整性检查
- [ ] 需求文档已创建在 `docs/requirements/` 目录下
- [ ] 文档命名符合 `YYYY-MM-DD-00X-需求名.md` 格式
- [ ] 文档包含所有必需章节(元数据、需求概述、目标、功能需求、非功能需求、技术约束、成功标准、相关文档)
- [ ] 元数据已正确填写(需求编号、创建时间、状态、优先级)
- [ ] 需求概述清晰、无歧义
- [ ] 目标明确、可衡量
- [ ] 功能需求区分核心功能和次要功能
- [ ] 非功能需求包含性能、安全、兼容性要求
- [ ] 技术约束明确(框架、设计模式、基类)
- [ ] 成功标准可验证3-5 条)
#### 索引更新检查
- [ ] `docs/index.md` 已更新
- [ ] 新需求链接已添加到"需求文档"部分
- [ ] 索引链接格式正确:`[文档名](./相对路径/文件名.md)`
- [ ] 索引更新采用增量策略,未删除现有内容
#### 会话记录检查
- [ ] 会话记录已创建在 `docs/sessions/` 目录下
- [ ] 会话记录文件命名符合 `YYYY-MM-DD-00X-session.md` 格式
- [ ] 会话记录包含元数据(需求编号、开始时间、结束时间、当前阶段)
- [ ] 会话记录包含用户原始需求的完整描述
- [ ] 会话记录包含阶段 1 的执行状态
- [ ] 会话记录包含生成的文档链接
#### 用户确认检查
- [ ] 已向用户显示需求文档链接
- [ ] 已询问用户"需求文档是否符合预期?"
- [ ] 已询问用户"是否进入下一阶段?"
- [ ] 已等待用户反馈
#### 回退机制检查(如果需要)
- [ ] 如果用户不满意,已询问具体需要修改的地方
- [ ] 如果用户要求回退,已删除相关文档
- [ ] 如果用户要求回退,已撤销索引更新
- [ ] 如果用户要求回退,已更新会话记录
### Correct vs Incorrect 代码对比
#### Incorrect错误示例
```markdown
# 需求文档
## 需求概述
用户登录
## 目标
实现登录
## 功能需求
- 登录功能
```
**问题**
- 缺少元数据
- 需求概述过于简单
- 目标不明确
- 功能需求未区分核心和次要
- 缺少非功能需求、技术约束、成功标准
#### Correct正确示例
```markdown
# 需求文档
## 元数据
- 需求编号001
- 创建时间2026-01-21
- 创建人AI Assistant
- 状态:进行中
- 优先级:高
## 需求概述
实现基于用户名和密码的用户登录功能,支持记住密码和自动登录,集成若依权限系统,确保登录过程的安全性。
## 目标
1. 实现用户身份验证,验证用户名和密码的正确性
2. 支持记住密码功能,减少用户重复输入
3. 支持自动登录功能,提升用户体验
4. 集成若依权限系统,确保用户只能访问有权限的功能
## 功能需求
### 核心功能
- 用户名和密码验证
- 记住密码功能
- 自动登录功能
- 登录失败提示
- 登录成功后跳转到首页
### 次要功能
- 登录历史记录
- 登录失败次数限制
- 验证码功能(后续迭代)
## 非功能需求
### 性能要求
- 登录响应时间不超过 2 秒
- 支持并发登录用户数不少于 100
### 安全要求
- 密码必须加密存储(使用 BCrypt
- 登录失败 5 次后锁定账户 30 分钟
- 支持 HTTPS 协议
### 兼容性要求
- 支持 Chrome、Firefox、Edge 最新版本
- 支持 Windows 10、macOS、Linux
## 技术约束
- 必须使用 Spring Security 框架
- 必须继承若依的 `LoginService` 基类
- 必须使用 JWT Token 进行身份验证
- 必须集成若依权限系统
## 成功标准
1. 用户可以使用正确的用户名和密码成功登录
2. 用户可以使用记住密码功能,下次登录时自动填充
3. 用户可以使用自动登录功能,下次访问时自动登录
4. 登录失败时显示明确的错误提示
5. 登录成功后正确跳转到首页
6. 登录失败 5 次后账户被锁定
## 相关文档
- [设计文档](../design/2026-01-21-001-用户登录功能-设计.md)
- [决策记录](../decisions/2026-01-21-001-ADR-用户登录功能-技术选型.md)
```
---
## 附录:快速参考
### 文件路径速查
- 需求文档:`docs/requirements/YYYY-MM-DD-00X-需求名.md`
- 主索引:`docs/index.md`
- 会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
- 项目规则:`.trae/rules/project_rules.md`
- SSOT 架构师提示词:`docs/Prompt/0004-单一真源文档驱动架构师.md`
### 工具命令速查
```powershell
# 检查目录
LS(path="d:\\idea_demo\\datai\\docs")
# 创建文档
Write(file_path="d:\\idea_demo\\datai\\docs\\requirements\\2026-01-21-001-用户登录功能.md", content="...")
# 读取索引
Read(file_path="d:\\idea_demo\\datai\\docs\\index.md")
# 搜索现有需求
SearchCodebase(information_request="查找 docs/requirements 目录下的所有需求文档")
# 查找所有需求文档
Glob(pattern="docs/requirements/*.md")
```
### 阶段 1 输出清单
- [ ] 需求文档:`docs/requirements/YYYY-MM-DD-00X-需求名.md`
- [ ] 更新的索引:`docs/index.md`
- [ ] 会话记录:`docs/sessions/YYYY-MM-DD-00X-session.md`
### 下一阶段提示
如果用户确认进入下一阶段,请参考:
- [project_rules.md](file:///d:\idea_demo\datai\.trae\rules\project_rules.md) 的"阶段 2方案设计"
- 准备创建设计文档
- 准备分析技术方案和架构设计