jvibe 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/JVIBE.md +75 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/bin/jvibe.js +62 -0
- package/package.json +50 -0
- package/scripts/init.js +118 -0
- package/scripts/status.js +98 -0
- package/scripts/upgrade.js +103 -0
- package/scripts/validate.js +132 -0
- package/template/.claude/agents/developer.md +172 -0
- package/template/.claude/agents/doc-sync.md +247 -0
- package/template/.claude/agents/planner.md +410 -0
- package/template/.claude/agents/reviewer.md +237 -0
- package/template/.claude/commands/JVibe:init.md +125 -0
- package/template/.claude/commands/JVibe:pr.md +159 -0
- package/template/.claude/commands/JVibe:status.md +160 -0
- package/template/.claude/hooks/load-context.sh +67 -0
- package/template/.claude/hooks/sync-feature-status.sh +172 -0
- package/template/.claude/hooks/sync-stats.sh +104 -0
- package/template/.claude/settings.json +43 -0
- package/template/README.md +144 -0
- package/template/docs/core//345/212/237/350/203/275/346/270/205/345/215/225.md +306 -0
- package/template/docs/core//350/247/204/350/214/203/346/226/207/346/241/243.md +309 -0
- package/template/docs/core//351/231/204/345/212/240/346/235/220/346/226/231.md +423 -0
- package/template/docs/core//351/241/271/347/233/256/346/226/207/346/241/243.md +263 -0
- package/template/docs/project/.gitkeep +0 -0
- package/template/docs/project/README.md +83 -0
- package/template/docs/project/api.md.example +145 -0
- package/template/docs/project/database.md.example +172 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# sync-stats.sh - Agent 完成后输出项目统计信息
|
|
4
|
+
# ============================================================================
|
|
5
|
+
# 触发事件: Stop
|
|
6
|
+
# 用途: 在 Agent 完成工作后,输出项目功能统计数据供用户参考
|
|
7
|
+
# ============================================================================
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# 项目根目录(相对于 .claude/hooks/)
|
|
12
|
+
PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
13
|
+
DOCS_DIR="$PROJECT_ROOT/docs"
|
|
14
|
+
FEATURE_LIST="$DOCS_DIR/功能清单.md"
|
|
15
|
+
|
|
16
|
+
# 颜色定义
|
|
17
|
+
GREEN='\033[0;32m'
|
|
18
|
+
YELLOW='\033[1;33m'
|
|
19
|
+
BLUE='\033[0;34m'
|
|
20
|
+
CYAN='\033[0;36m'
|
|
21
|
+
NC='\033[0m' # No Color
|
|
22
|
+
|
|
23
|
+
# 检查功能清单是否存在
|
|
24
|
+
if [[ ! -f "$FEATURE_LIST" ]]; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo -e "${BLUE}========================================${NC}"
|
|
30
|
+
echo -e "${BLUE} 📊 项目统计信息${NC}"
|
|
31
|
+
echo -e "${BLUE}========================================${NC}"
|
|
32
|
+
|
|
33
|
+
# 统计各状态数量
|
|
34
|
+
COMPLETED=$(grep -c "^## F-[0-9]* ✅" "$FEATURE_LIST" 2>/dev/null || echo "0")
|
|
35
|
+
IN_PROGRESS=$(grep -c "^## F-[0-9]* 🚧" "$FEATURE_LIST" 2>/dev/null || echo "0")
|
|
36
|
+
NOT_STARTED=$(grep -c "^## F-[0-9]* ❌" "$FEATURE_LIST" 2>/dev/null || echo "0")
|
|
37
|
+
TOTAL=$((COMPLETED + IN_PROGRESS + NOT_STARTED))
|
|
38
|
+
|
|
39
|
+
if [[ $TOTAL -eq 0 ]]; then
|
|
40
|
+
echo " 暂无功能条目"
|
|
41
|
+
echo -e "${BLUE}========================================${NC}"
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# 计算完成率
|
|
46
|
+
RATE=$((COMPLETED * 100 / TOTAL))
|
|
47
|
+
|
|
48
|
+
# 输出总体统计
|
|
49
|
+
echo -e "\n${CYAN}功能总览${NC}"
|
|
50
|
+
echo "----------------------------------------"
|
|
51
|
+
echo " 总功能数: $TOTAL"
|
|
52
|
+
echo " ✅ 已完成: $COMPLETED"
|
|
53
|
+
echo " 🚧 开发中: $IN_PROGRESS"
|
|
54
|
+
echo " ❌ 未开始: $NOT_STARTED"
|
|
55
|
+
echo " 📈 完成率: $RATE%"
|
|
56
|
+
|
|
57
|
+
# 按模块统计(如果项目文档存在)
|
|
58
|
+
PROJECT_DOC="$DOCS_DIR/项目文档.md"
|
|
59
|
+
if [[ -f "$PROJECT_DOC" ]]; then
|
|
60
|
+
echo -e "\n${CYAN}模块统计${NC}"
|
|
61
|
+
echo "----------------------------------------"
|
|
62
|
+
|
|
63
|
+
# 从项目文档读取模块列表
|
|
64
|
+
# 假设模块定义在功能清单中:## F-XXX [状态] 功能名称 [模块名]
|
|
65
|
+
# 或者从功能描述中提取
|
|
66
|
+
|
|
67
|
+
# 简化版本:直接从功能清单提取所有功能的模块信息(如果有的话)
|
|
68
|
+
# 这里我们先输出一个占位符,实际实现可以更复杂
|
|
69
|
+
|
|
70
|
+
echo " (模块统计需要在项目文档中配置)"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# 显示最近更新的功能
|
|
74
|
+
echo -e "\n${CYAN}最近活跃${NC}"
|
|
75
|
+
echo "----------------------------------------"
|
|
76
|
+
|
|
77
|
+
# 显示最近 3 个状态为 🚧 的功能
|
|
78
|
+
RECENT_IN_PROGRESS=$(grep "^## F-[0-9]* 🚧" "$FEATURE_LIST" | head -n 3)
|
|
79
|
+
if [[ -n "$RECENT_IN_PROGRESS" ]]; then
|
|
80
|
+
echo "$RECENT_IN_PROGRESS" | while IFS= read -r line; do
|
|
81
|
+
# 提取功能编号和名称
|
|
82
|
+
if [[ "$line" =~ ^##[[:space:]]+(F-[0-9]+)[[:space:]]+🚧[[:space:]]+(.+)$ ]]; then
|
|
83
|
+
feature_id="${BASH_REMATCH[1]}"
|
|
84
|
+
feature_name="${BASH_REMATCH[2]}"
|
|
85
|
+
echo " 🚧 $feature_id: $feature_name"
|
|
86
|
+
fi
|
|
87
|
+
done
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# 显示最近完成的功能(最多 3 个)
|
|
91
|
+
RECENT_COMPLETED=$(grep "^## F-[0-9]* ✅" "$FEATURE_LIST" | tail -n 3)
|
|
92
|
+
if [[ -n "$RECENT_COMPLETED" ]]; then
|
|
93
|
+
echo "$RECENT_COMPLETED" | while IFS= read -r line; do
|
|
94
|
+
if [[ "$line" =~ ^##[[:space:]]+(F-[0-9]+)[[:space:]]+✅[[:space:]]+(.+)$ ]]; then
|
|
95
|
+
feature_id="${BASH_REMATCH[1]}"
|
|
96
|
+
feature_name="${BASH_REMATCH[2]}"
|
|
97
|
+
echo " ✅ $feature_id: $feature_name"
|
|
98
|
+
fi
|
|
99
|
+
done
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
echo -e "\n${BLUE}========================================${NC}"
|
|
103
|
+
|
|
104
|
+
exit 0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "*",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": ".claude/hooks/load-context.sh",
|
|
10
|
+
"timeout": 5000,
|
|
11
|
+
"description": "加载项目上下文,显示功能状态统计"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"PostToolUse": [
|
|
17
|
+
{
|
|
18
|
+
"matcher": "Edit|Write",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{
|
|
21
|
+
"type": "command",
|
|
22
|
+
"command": ".claude/hooks/sync-feature-status.sh",
|
|
23
|
+
"timeout": 10000,
|
|
24
|
+
"description": "当功能清单被修改时,自动推导功能状态"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"Stop": [
|
|
30
|
+
{
|
|
31
|
+
"matcher": "*",
|
|
32
|
+
"hooks": [
|
|
33
|
+
{
|
|
34
|
+
"type": "command",
|
|
35
|
+
"command": ".claude/hooks/sync-stats.sh",
|
|
36
|
+
"timeout": 5000,
|
|
37
|
+
"description": "Agent 完成后输出项目统计信息"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# JVibe 项目模板
|
|
2
|
+
|
|
3
|
+
> 文档驱动的 AI 辅助开发系统
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📌 这是什么?
|
|
8
|
+
|
|
9
|
+
这是由 JVibe CLI 工具初始化的项目模板,包含:
|
|
10
|
+
|
|
11
|
+
- **`.claude/`** - Claude Code 配置(Agents、Commands、Hooks)
|
|
12
|
+
- **`docs/core/`** - 4 个核心文档(CORE-DOCS)
|
|
13
|
+
- **`docs/project/`** - 项目特定文档(PROJECT-DOCS)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 🚀 快速开始
|
|
18
|
+
|
|
19
|
+
### 1. 初始化项目文档
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 使用 JVibe Skill 初始化
|
|
23
|
+
/JVibe:init
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
这会:
|
|
27
|
+
- 询问项目名称、技术栈、初始模块
|
|
28
|
+
- 填充 `docs/core/` 中的 4 个核心文档
|
|
29
|
+
|
|
30
|
+
### 2. 查看项目状态
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
/JVibe:status
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 3. 开始开发
|
|
37
|
+
|
|
38
|
+
使用自然语言描述你的需求:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
"添加用户登录功能"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
JVibe 会自动:
|
|
45
|
+
1. 调用 `planner` agent 分析需求、创建功能条目
|
|
46
|
+
2. 调用 `developer` agent 实现代码
|
|
47
|
+
3. 调用 `reviewer` agent 审查代码
|
|
48
|
+
4. 自动同步文档状态
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 📂 目录结构
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
your-project/
|
|
56
|
+
├── .claude/ # Claude Code 配置
|
|
57
|
+
│ ├── agents/ # 4 个 Sub-Agents
|
|
58
|
+
│ │ ├── planner.md # 需求规划
|
|
59
|
+
│ │ ├── developer.md # 代码开发
|
|
60
|
+
│ │ ├── reviewer.md # 代码审查
|
|
61
|
+
│ │ └── doc-sync.md # 文档同步
|
|
62
|
+
│ ├── commands/ # 3 个 JVibe Skills
|
|
63
|
+
│ │ ├── JVibe:init.md # 初始化
|
|
64
|
+
│ │ ├── JVibe:pr.md # PR 生成
|
|
65
|
+
│ │ └── JVibe:status.md # 状态查看
|
|
66
|
+
│ ├── hooks/ # 3 个自动化 Hooks
|
|
67
|
+
│ │ ├── load-context.sh
|
|
68
|
+
│ │ ├── sync-feature-status.sh
|
|
69
|
+
│ │ └── sync-stats.sh
|
|
70
|
+
│ └── settings.json
|
|
71
|
+
│
|
|
72
|
+
├── docs/
|
|
73
|
+
│ ├── core/ # ⭐️ CORE-DOCS(4个固定核心文档)
|
|
74
|
+
│ │ ├── 规范文档.md # 入口和索引
|
|
75
|
+
│ │ ├── 项目文档.md # 架构与模块边界
|
|
76
|
+
│ │ ├── 功能清单.md # 功能状态唯一来源(SoT)
|
|
77
|
+
│ │ └── 附加材料.md # 规范索引
|
|
78
|
+
│ │
|
|
79
|
+
│ └── project/ # ⭐️ PROJECT-DOCS(按需创建)
|
|
80
|
+
│ ├── README.md # 说明文档
|
|
81
|
+
│ ├── api.md.example # API文档示例
|
|
82
|
+
│ └── database.md.example # 数据库文档示例
|
|
83
|
+
│
|
|
84
|
+
└── .gitignore
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 📚 文档体系
|
|
90
|
+
|
|
91
|
+
### CORE-DOCS(核心文档)
|
|
92
|
+
|
|
93
|
+
| 文档 | 职责 | 说明 |
|
|
94
|
+
|------|------|------|
|
|
95
|
+
| **规范文档** | 入口与索引 | 文档导航、开发流程、使用规则 |
|
|
96
|
+
| **项目文档** | 架构与模块边界 | 技术栈、模块清单、功能索引 |
|
|
97
|
+
| **功能清单** | 功能状态 SoT | 每个功能的描述 + TODO + 状态 |
|
|
98
|
+
| **附加材料** | 规范索引 | 编码规范、技术细节、用户偏好 |
|
|
99
|
+
|
|
100
|
+
### PROJECT-DOCS(项目文档)
|
|
101
|
+
|
|
102
|
+
根据项目类型按需创建,例如:
|
|
103
|
+
- API 文档
|
|
104
|
+
- 数据库 Schema 文档
|
|
105
|
+
- 部署文档
|
|
106
|
+
- 组件文档
|
|
107
|
+
|
|
108
|
+
⚠️ **所有 PROJECT-DOCS 必须在规范文档中注册**
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 🤖 JVibe 工作流
|
|
113
|
+
|
|
114
|
+
```mermaid
|
|
115
|
+
graph LR
|
|
116
|
+
A[需求分析] --> B[功能拆解]
|
|
117
|
+
B --> C[技术设计]
|
|
118
|
+
C --> D[编码实现]
|
|
119
|
+
D --> E[代码审查]
|
|
120
|
+
E --> F[文档同步]
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 核心原则
|
|
124
|
+
|
|
125
|
+
- **Doc-driven**:文档驱动开发
|
|
126
|
+
- **SoT**:功能状态只在功能清单中维护(单一事实来源)
|
|
127
|
+
- **AI-native**:专为 AI 辅助开发设计的工作流
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 📋 常用命令
|
|
132
|
+
|
|
133
|
+
| 命令 | 说明 |
|
|
134
|
+
|------|------|
|
|
135
|
+
| `/JVibe:init` | 初始化项目文档 |
|
|
136
|
+
| `/JVibe:status` | 查看项目状态和进度 |
|
|
137
|
+
| `/JVibe:pr` | 生成标准化 PR 描述 |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 🔗 相关链接
|
|
142
|
+
|
|
143
|
+
- [JVibe CLI 文档](https://github.com/your-org/jvibe)
|
|
144
|
+
- [Claude Code 官方文档](https://docs.anthropic.com/claude-code)
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# [项目名称] 功能清单
|
|
2
|
+
|
|
3
|
+
## 📌 文档说明
|
|
4
|
+
|
|
5
|
+
本文档是**功能状态的唯一来源(SoT)**,详细描述每个功能的:
|
|
6
|
+
1. **功能描述** - 该功能是什么,解决什么问题
|
|
7
|
+
2. **实现TODO** - 具体的开发任务清单
|
|
8
|
+
|
|
9
|
+
**功能状态总览**: 见 [项目文档](./项目文档.md) §5 统计表(按 sprint/里程碑从本文档推导)
|
|
10
|
+
|
|
11
|
+
**编号规则**: F-XXX (F = Feature,XXX = 三位数字)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 状态说明
|
|
16
|
+
|
|
17
|
+
- ✅ **已完成**: 功能开发完成、测试通过、已合并到主分支
|
|
18
|
+
- 🚧 **开发中**: 正在开发中,TODO未全部完成
|
|
19
|
+
- ❌ **未开始**: 已规划但尚未开始开发
|
|
20
|
+
|
|
21
|
+
> ⚠️ **重要**: 功能状态只在本文档维护,项目文档的统计数据由本文档推导。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# AuthModule (认证模块)
|
|
26
|
+
|
|
27
|
+
## F-001 ✅ 用户注册
|
|
28
|
+
|
|
29
|
+
**描述**:允许新用户通过邮箱和密码创建账户。注册成功后,系统自动发送验证邮件,用户需点击邮件中的链接完成邮箱验证。
|
|
30
|
+
|
|
31
|
+
**TODO**
|
|
32
|
+
- [x] 设计数据库users表结构
|
|
33
|
+
- [x] 实现 POST /api/auth/register 端点
|
|
34
|
+
- [x] 实现邮件发送服务
|
|
35
|
+
- [x] 实现邮箱验证端点 GET /api/auth/verify/:token
|
|
36
|
+
- [x] 单元测试(邮箱格式、密码强度、加密函数)
|
|
37
|
+
- [x] 集成测试(注册流程、异常情况)
|
|
38
|
+
- [x] API文档更新
|
|
39
|
+
- [x] 数据库Schema文档更新
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## F-002 ✅ 用户登录
|
|
44
|
+
|
|
45
|
+
**描述**:已注册用户通过邮箱和密码登录系统,登录成功后获得访问令牌(Access Token)和刷新令牌(Refresh Token)。支持登录失败锁定机制。
|
|
46
|
+
|
|
47
|
+
**TODO**
|
|
48
|
+
- [x] 实现 POST /api/auth/login 端点
|
|
49
|
+
- [x] 实现登录失败计数器(Redis存储,5次失败锁定15分钟)
|
|
50
|
+
- [x] 实现auth_tokens表存储refreshToken
|
|
51
|
+
- [x] 单元测试(密码验证、Token生成、失败计数)
|
|
52
|
+
- [x] 集成测试(登录流程、失败场景、锁定机制)
|
|
53
|
+
- [x] API文档更新
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## F-003 ✅ Token刷新
|
|
58
|
+
|
|
59
|
+
**描述**:当accessToken过期后,客户端可使用refreshToken获取新的accessToken,无需用户重新登录。
|
|
60
|
+
|
|
61
|
+
**TODO**
|
|
62
|
+
- [x] 实现 POST /api/auth/refresh 端点
|
|
63
|
+
- [x] 验证refreshToken有效性
|
|
64
|
+
- [x] 生成新的accessToken
|
|
65
|
+
- [x] 单元测试和集成测试
|
|
66
|
+
- [x] API文档更新
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## F-004 ✅ 密码重置
|
|
71
|
+
|
|
72
|
+
**描述**:用户忘记密码时,可通过邮箱接收重置密码链接,点击链接后设置新密码。重置成功后旧token全部失效。
|
|
73
|
+
|
|
74
|
+
**TODO**
|
|
75
|
+
- [x] 实现 POST /api/auth/forgot-password 端点
|
|
76
|
+
- [x] 实现 POST /api/auth/reset-password 端点
|
|
77
|
+
- [x] 生成重置token(JWT,有效期1小时)
|
|
78
|
+
- [x] 发送重置密码邮件
|
|
79
|
+
- [x] 更新密码并使旧token失效
|
|
80
|
+
- [x] 单元测试和集成测试
|
|
81
|
+
- [x] API文档更新
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## F-005 ✅ 邮箱验证
|
|
86
|
+
|
|
87
|
+
**描述**:用户注册后需要验证邮箱,验证成功后才能登录系统。支持重新发送验证邮件(1分钟内限制1次)。
|
|
88
|
+
|
|
89
|
+
**TODO**
|
|
90
|
+
- [x] 实现 GET /api/auth/verify/:token 端点
|
|
91
|
+
- [x] 实现 POST /api/auth/resend-verification 端点
|
|
92
|
+
- [x] 验证token有效性(24小时有效期)
|
|
93
|
+
- [x] 更新email_verified字段
|
|
94
|
+
- [x] 单元测试和集成测试
|
|
95
|
+
- [x] API文档更新
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
# UserModule (用户管理模块)
|
|
100
|
+
|
|
101
|
+
## F-006 ✅ 用户信息查询
|
|
102
|
+
|
|
103
|
+
**描述**:查询用户的基本信息和资料。支持查询自己的完整信息和其他用户的公开信息。
|
|
104
|
+
|
|
105
|
+
**TODO**
|
|
106
|
+
- [x] 实现 GET /api/users/:id 端点
|
|
107
|
+
- [x] 实现 GET /api/users/me 端点
|
|
108
|
+
- [x] 权限验证(需登录)
|
|
109
|
+
- [x] 区分公开信息和私密信息
|
|
110
|
+
- [x] 单元测试和集成测试
|
|
111
|
+
- [x] API文档更新
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## F-007 ✅ 用户资料编辑
|
|
116
|
+
|
|
117
|
+
**描述**:用户可以编辑自己的资料,包括昵称(2-20字符)、简介(0-200字符)等信息。只能编辑自己的资料。
|
|
118
|
+
|
|
119
|
+
**TODO**
|
|
120
|
+
- [x] 实现 PUT /api/users/:id 端点
|
|
121
|
+
- [x] 请求体验证和字段长度验证
|
|
122
|
+
- [x] 权限验证(只能编辑自己)
|
|
123
|
+
- [x] 单元测试和集成测试
|
|
124
|
+
- [x] API文档更新
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## F-008 ✅ 头像上传
|
|
129
|
+
|
|
130
|
+
**描述**:用户可以上传自己的头像图片,支持JPG、PNG格式(最大5MB),自动裁剪为正方形并生成200x200缩略图。
|
|
131
|
+
|
|
132
|
+
**TODO**
|
|
133
|
+
- [x] 实现 POST /api/users/:id/avatar 端点
|
|
134
|
+
- [x] 文件上传处理(multer)
|
|
135
|
+
- [x] 图片格式验证
|
|
136
|
+
- [x] 图片压缩和裁剪(sharp)
|
|
137
|
+
- [x] 上传到云存储(S3/OSS)
|
|
138
|
+
- [x] 更新user_profiles.avatar_url
|
|
139
|
+
- [x] 单元测试和集成测试
|
|
140
|
+
- [x] API文档更新
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## F-009 ✅ 用户搜索
|
|
145
|
+
|
|
146
|
+
**描述**:通过关键词搜索用户,支持按昵称模糊搜索和按邮箱精确搜索,返回匹配的用户列表。支持分页(默认20条/页)。
|
|
147
|
+
|
|
148
|
+
**TODO**
|
|
149
|
+
- [x] 实现 GET /api/users/search 端点
|
|
150
|
+
- [x] 查询参数验证(q, page, limit)
|
|
151
|
+
- [x] 数据库模糊查询和分页逻辑
|
|
152
|
+
- [x] 权限验证(需登录)
|
|
153
|
+
- [x] 单元测试和集成测试
|
|
154
|
+
- [x] API文档更新
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## F-010 ✅ 用户权限管理
|
|
159
|
+
|
|
160
|
+
**描述**:管理员可以设置用户的角色(user/admin),支持角色变更日志记录。防止自我提权。
|
|
161
|
+
|
|
162
|
+
**TODO**
|
|
163
|
+
- [x] 实现 PUT /api/users/:id/role 端点
|
|
164
|
+
- [x] 权限验证(需admin角色)
|
|
165
|
+
- [x] 防止自我提权
|
|
166
|
+
- [x] 记录角色变更日志
|
|
167
|
+
- [x] 单元测试和集成测试
|
|
168
|
+
- [x] API文档更新
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
# ChatModule (实时聊天模块)
|
|
173
|
+
|
|
174
|
+
## F-011 ✅ 创建聊天室
|
|
175
|
+
|
|
176
|
+
**描述**:用户可以创建聊天室,邀请其他用户加入。支持一对一聊天(direct,2人)和群聊(group,3-100人)。
|
|
177
|
+
|
|
178
|
+
**TODO**
|
|
179
|
+
- [x] 实现 POST /api/chat/rooms 端点
|
|
180
|
+
- [x] 聊天室类型验证(direct/group)
|
|
181
|
+
- [x] 成员列表验证(名称长度1-50字符)
|
|
182
|
+
- [x] 创建chat_rooms和room_members记录
|
|
183
|
+
- [x] 单元测试和集成测试
|
|
184
|
+
- [x] API文档更新
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## F-012 ✅ 发送文本消息
|
|
189
|
+
|
|
190
|
+
**描述**:用户在聊天室内发送文本消息,消息实时推送给其他在线成员。
|
|
191
|
+
|
|
192
|
+
**TODO**
|
|
193
|
+
- [x] 实现 POST /api/chat/messages 端点
|
|
194
|
+
- [x] WebSocket消息广播逻辑
|
|
195
|
+
- [x] 消息内容验证和存储
|
|
196
|
+
- [x] 单元测试和集成测试
|
|
197
|
+
- [x] API文档更新
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## F-013 ✅ 接收实时消息
|
|
202
|
+
|
|
203
|
+
**描述**:用户通过WebSocket连接实时接收聊天室消息,支持断线重连和消息补发。
|
|
204
|
+
|
|
205
|
+
**TODO**
|
|
206
|
+
- [x] 实现WebSocket连接管理
|
|
207
|
+
- [x] 实现消息推送逻辑
|
|
208
|
+
- [x] 实现断线重连机制
|
|
209
|
+
- [x] 实现消息补发逻辑
|
|
210
|
+
- [x] 单元测试和集成测试
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## F-014 ✅ 历史消息查询
|
|
215
|
+
|
|
216
|
+
**描述**:查询聊天室的历史消息,支持分页加载(默认50条/页)和时间范围筛选。
|
|
217
|
+
|
|
218
|
+
**TODO**
|
|
219
|
+
- [x] 实现 GET /api/chat/messages/:roomId 端点
|
|
220
|
+
- [x] 分页查询逻辑
|
|
221
|
+
- [x] 时间范围筛选
|
|
222
|
+
- [x] 权限验证(只能查询已加入的聊天室)
|
|
223
|
+
- [x] 单元测试和集成测试
|
|
224
|
+
- [x] API文档更新
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## F-015 ✅ 在线状态显示
|
|
229
|
+
|
|
230
|
+
**描述**:显示聊天室成员的在线状态(在线/离线/离开),通过WebSocket实时更新。
|
|
231
|
+
|
|
232
|
+
**TODO**
|
|
233
|
+
- [x] 实现在线状态管理(Redis存储)
|
|
234
|
+
- [x] WebSocket在线状态广播
|
|
235
|
+
- [x] 心跳检测机制
|
|
236
|
+
- [x] 单元测试和集成测试
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## F-016 ✅ 输入状态指示
|
|
241
|
+
|
|
242
|
+
**描述**:显示其他用户正在输入的状态提示("XXX正在输入..."),3秒无输入后自动清除。
|
|
243
|
+
|
|
244
|
+
**TODO**
|
|
245
|
+
- [x] WebSocket输入状态事件监听
|
|
246
|
+
- [x] 输入状态广播逻辑
|
|
247
|
+
- [x] 自动清除机制(3秒超时)
|
|
248
|
+
- [x] 单元测试和集成测试
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## F-017 ✅ 消息通知
|
|
253
|
+
|
|
254
|
+
**描述**:用户离线或未打开聊天室时,收到新消息的系统通知(桌面通知/推送通知)。
|
|
255
|
+
|
|
256
|
+
**TODO**
|
|
257
|
+
- [x] 实现桌面通知(Web Notification API)
|
|
258
|
+
- [x] 实现推送通知服务集成
|
|
259
|
+
- [x] 通知开关和权限管理
|
|
260
|
+
- [x] 单元测试和集成测试
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## F-018 🚧 文件分享
|
|
265
|
+
|
|
266
|
+
**描述**:用户可以在聊天室中分享文件(图片、文档、视频等),支持文件预览和下载。最大文件大小100MB。
|
|
267
|
+
|
|
268
|
+
**TODO**
|
|
269
|
+
- [x] 实现 POST /api/chat/files 端点
|
|
270
|
+
- [x] 文件上传处理(multer)
|
|
271
|
+
- [x] 文件类型验证和大小限制
|
|
272
|
+
- [x] 上传到云存储(S3/OSS)
|
|
273
|
+
- [ ] 图片预览缩略图生成
|
|
274
|
+
- [ ] 文件下载权限验证
|
|
275
|
+
- [ ] 单元测试和集成测试
|
|
276
|
+
- [ ] API文档更新
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## F-019 ❌ 消息搜索
|
|
281
|
+
|
|
282
|
+
**描述**:在聊天室或全局范围内搜索历史消息,支持关键词搜索和高级筛选(发送人、时间范围、文件类型)。
|
|
283
|
+
|
|
284
|
+
**TODO**
|
|
285
|
+
- [ ] 实现 GET /api/chat/search 端点
|
|
286
|
+
- [ ] 全文搜索索引构建(Elasticsearch)
|
|
287
|
+
- [ ] 高级筛选逻辑(发送人、时间、文件类型)
|
|
288
|
+
- [ ] 搜索结果高亮显示
|
|
289
|
+
- [ ] 权限验证(只搜索有权限的聊天室)
|
|
290
|
+
- [ ] 单元测试和集成测试
|
|
291
|
+
- [ ] API文档更新
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## F-020 ❌ 消息已读状态
|
|
296
|
+
|
|
297
|
+
**描述**:显示消息的已读状态,支持单聊的"已读/未读"标记和群聊的"X人已读"统计。
|
|
298
|
+
|
|
299
|
+
**TODO**
|
|
300
|
+
- [ ] 实现消息已读记录表(message_read_status)
|
|
301
|
+
- [ ] 实现 PUT /api/chat/messages/:id/read 端点
|
|
302
|
+
- [ ] WebSocket已读状态广播
|
|
303
|
+
- [ ] 群聊已读人数统计
|
|
304
|
+
- [ ] 未读消息计数功能
|
|
305
|
+
- [ ] 单元测试和集成测试
|
|
306
|
+
- [ ] API文档更新
|