feat: 重构项目心跳数据结构并实现项目列表API

- 新增统一项目列表Redis键和迁移工具
- 实现GET /api/projects端点获取项目列表
- 实现POST /api/projects/migrate端点支持数据迁移
- 更新前端ProjectSelector组件使用真实项目数据
- 扩展projectStore状态管理
- 更新相关文档和OpenSpec规范
- 添加测试用例验证新功能
This commit is contained in:
2026-01-13 19:45:05 +08:00
parent 19e65d78dc
commit 282f7268ed
66 changed files with 4378 additions and 456 deletions

View File

@@ -0,0 +1,64 @@
# Change: Refactor Project Heartbeat Data Structure
## Why
当前项目心跳数据使用分散的Redis键结构`{projectName}_项目心跳`),导致以下问题:
1. 难以统一管理和查询所有项目
2. 前端项目选择功能需要硬编码测试数据
3. 无法高效获取项目列表和状态
4. 数据迁移和维护成本高
## What Changes
- **新增**统一的项目列表Redis键`项目心跳`
- **新增**数据迁移工具,支持从旧结构迁移到新结构
- **新增**项目列表API端点`GET /api/projects`
- **新增**数据迁移API端点`POST /api/projects/migrate`
- **修改**前端ProjectSelector组件移除硬编码测试数据从API获取真实项目
- **修改**后端logs.js和commands.js支持新旧数据结构的向后兼容
- **更新**OpenSpec规范文档反映新的API和数据结构
## Impact
- Affected specs:
- `specs/logging/spec.md` - 更新日志API响应格式
- `specs/command/spec.md` - 新增项目列表和迁移API
- `specs/redis-connection/spec.md` - 新增项目列表相关API
- Affected code:
- `src/backend/services/redisKeys.js` - 新增项目列表键函数
- `src/backend/services/migrateHeartbeatData.js` - 新增数据迁移工具
- `src/backend/routes/projects.js` - 新增项目列表路由
- `src/backend/routes/logs.js` - 更新心跳读取逻辑
- `src/backend/routes/commands.js` - 更新心跳读取逻辑
- `src/backend/server.js` - 注册项目列表路由
- `src/frontend/components/ProjectSelector.vue` - 移除假数据连接API
- `src/frontend/store/projectStore.js` - 扩展状态管理
- `src/frontend/views/LogView.vue` - 连接真实API
- `src/frontend/views/CommandView.vue` - 连接真实API
- `src/frontend/views/MainView.vue` - 传递项目名称
- `src/frontend/components/Console.vue` - 接受项目名称属性
- `src/frontend/App.vue` - 修正健康检查端点
## Migration Plan
1. 执行数据迁移:调用`POST /api/projects/migrate`
2. 验证迁移结果:检查`项目心跳`键包含所有项目
3. 测试项目选择功能:确认前端能正确显示项目列表
4. 测试日志和命令功能:确认功能正常
5. 清理旧键可选调用迁移API并设置`deleteOldKeys: true`
## Backward Compatibility
系统保持向后兼容:
- 优先读取新的项目列表结构
- 如果新结构中未找到项目,回退到旧结构
- 支持平滑过渡,无需立即删除旧键
## Benefits
- 统一的项目管理,提高可维护性
- 前端显示真实项目数据,移除测试假数据
- 提高查询效率减少Redis操作次数
- 支持未来功能扩展(如项目分组、搜索等)

View File

@@ -0,0 +1,50 @@
## ADDED Requirements
### Requirement: Project List Management
The system SHALL provide a unified project list structure in Redis to manage all project heartbeats.
#### Scenario: Getting all projects
- **WHEN** the user requests the project list
- **THEN** the system SHALL return all projects with their heartbeat status
- **AND** each project SHALL include: project name, API base URL, last active time, and online status
#### Scenario: Project status calculation
- **WHEN** calculating project status
- **THEN** the system SHALL determine online/offline based on last active time and offline threshold
- **AND** the system SHALL return the age in milliseconds
### Requirement: Data Migration Support
The system SHALL support migrating heartbeat data from old structure to new unified structure.
#### Scenario: Migrating heartbeat data
- **WHEN** the migration process is triggered
- **THEN** the system SHALL read all old heartbeat keys
- **AND** convert them to the new unified list structure
- **AND** optionally delete old keys after successful migration
#### Scenario: Dry run migration
- **WHEN** migration is executed with dryRun flag
- **THEN** the system SHALL validate data without writing
- **AND** return the migration result for review
### Requirement: Backward Compatibility
The system SHALL maintain backward compatibility with old heartbeat data structure.
#### Scenario: Reading from new structure
- **WHEN** reading project heartbeat
- **THEN** the system SHALL first try to read from the new unified list
- **AND** fall back to old structure if not found
#### Scenario: Gradual migration
- **WHEN** old structure data is detected
- **THEN** the system SHALL continue to work with old data
- **AND** allow migration at a later time

View File

@@ -0,0 +1,55 @@
## 1. Redis数据结构重构
- [x] 1.1 在redisKeys.js中添加projectsListKey()函数
- [x] 1.2 创建数据迁移工具migrateHeartbeatData.js
- [x] 1.3 实现从分散键到统一列表的迁移逻辑
- [x] 1.4 实现getProjectsList()函数
- [x] 1.5 实现updateProjectHeartbeat()函数
## 2. 后端API开发
- [x] 2.1 创建项目列表API routes/projects.js
- [x] 2.2 实现GET /api/projects端点
- [x] 2.3 实现POST /api/projects/migrate端点
- [x] 2.4 更新logs.js兼容新数据结构
- [x] 2.5 更新commands.js兼容新数据结构
- [x] 2.6 在server.js中注册项目列表路由
## 3. 前端代码修改
- [x] 3.1 更新ProjectSelector.vue移除假数据
- [x] 3.2 实现从API获取项目列表
- [x] 3.3 实现项目状态显示
- [x] 3.4 实现自动刷新功能
- [x] 3.5 更新projectStore.js扩展状态管理
- [x] 3.6 更新LogView.vue连接真实API
- [x] 3.7 更新CommandView.vue连接真实API
- [x] 3.8 更新MainView.vue传递项目名称
- [x] 3.9 更新Console.vue接受项目名称属性
- [x] 3.10 修正App.vue健康检查端点
## 4. 文档更新
- [x] 4.1 创建Redis数据结构文档
- [x] 4.2 更新logging OpenSpec规范
- [x] 4.3 更新command OpenSpec规范
- [x] 4.4 更新redis-connection OpenSpec规范
- [x] 4.5 创建OpenSpec变更提案proposal.md
- [x] 4.6 创建OpenSpec变更提案tasks.md
## 5. 测试开发
- [ ] 5.1 编写数据迁移单元测试
- [ ] 5.2 编写项目列表API集成测试
- [ ] 5.3 编写ProjectSelector组件测试
- [ ] 5.4 编写性能测试
## 6. 代码质量与验证
- [ ] 6.1 运行ESLint检查
- [ ] 6.2 运行Prettier格式化
- [ ] 6.3 验证项目选择功能
- [ ] 6.4 验证日志读取功能
- [ ] 6.5 验证命令发送功能
- [ ] 6.6 验证数据迁移功能
- [ ] 6.7 性能测试和优化