Compare commits
6 Commits
feature/bm
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd8f368fe3 | ||
|
|
44c49079ae | ||
|
|
1cbae8b4b1 | ||
|
|
b0bb6b1562 | ||
|
|
3ab82f2cf5 | ||
|
|
162bb9ba99 |
106
package-lock.json
generated
106
package-lock.json
generated
@@ -5,7 +5,17 @@
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"markdown-it": "^14.1.1"
|
||||
"markdown-it": "^14.1.1",
|
||||
"xlsx": "^0.18.5"
|
||||
}
|
||||
},
|
||||
"node_modules/adler-32": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
|
||||
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
@@ -14,6 +24,40 @@
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/cfb": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
|
||||
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"adler-32": "~1.3.0",
|
||||
"crc-32": "~1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/codepage": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
|
||||
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/crc-32": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
|
||||
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"crc32": "bin/crc32.njs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/entities": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
|
||||
@@ -26,6 +70,15 @@
|
||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/frac": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
|
||||
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/linkify-it": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
|
||||
@@ -67,11 +120,62 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/ssf": {
|
||||
"version": "0.11.2",
|
||||
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
|
||||
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"frac": "~1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/uc.micro": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
|
||||
"integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/wmf": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
|
||||
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/word": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
|
||||
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/xlsx": {
|
||||
"version": "0.18.5",
|
||||
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
|
||||
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"adler-32": "~1.3.0",
|
||||
"cfb": "~1.2.1",
|
||||
"codepage": "~1.15.0",
|
||||
"crc-32": "~1.2.1",
|
||||
"ssf": "~0.11.2",
|
||||
"wmf": "~1.0.1",
|
||||
"word": "~0.3.0"
|
||||
},
|
||||
"bin": {
|
||||
"xlsx": "bin/xlsx.njs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"markdown-it": "^14.1.1"
|
||||
"markdown-it": "^14.1.1",
|
||||
"xlsx": "^0.18.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,6 +259,221 @@
|
||||
- **技术要求**:
|
||||
- 关联试题需精准匹配知识点,避免无关题目推送
|
||||
|
||||
### **技术实现说明**
|
||||
|
||||
#### **试题来源(混合模式)**
|
||||
1. **题库查询优先**
|
||||
- 从后台上传的题库查询相关试题
|
||||
- MCP 工具:`query_questions`
|
||||
|
||||
2. **AI 动态生成补充**
|
||||
- 当题库中没有相关试题时,AI 自动生成新试题
|
||||
- MCP 工具:`generate_question`
|
||||
|
||||
#### **推荐机制(AI 智能推荐)**
|
||||
1. **基于学习历史推荐**
|
||||
- 分析用户抽背历史、错误记录、记忆曲线
|
||||
- 针对薄弱点精准推荐
|
||||
- MCP 工具:`recommend_questions`
|
||||
|
||||
2. **批量生成练习集**
|
||||
- 根据抽背会话批量生成个性化练习题集
|
||||
- MCP 工具:`batch_recommend_by_quiz_history`
|
||||
|
||||
#### **交互流程**
|
||||
1. 抽背完成 → 自动调用 MCP 工具推荐试题
|
||||
2. 用户答题 → 实时反馈
|
||||
3. 答题结果 → 更新记忆曲线 → 影响下次推荐
|
||||
- MCP 工具:`submit_answer`
|
||||
|
||||
### **MCP 工具详细设计**
|
||||
|
||||
#### 1. query_questions - 根据知识点查询试题
|
||||
```yaml
|
||||
工具名称: query_questions
|
||||
描述: 根据知识点ID或关键词查询题库中的相关试题
|
||||
|
||||
参数:
|
||||
- knowledge_point_id: string (必填) - 知识点ID
|
||||
- question_type: string (可选) - 题型筛选 (单选/多选/判断/填空)
|
||||
- difficulty: string (可选) - 难度级别 (简单/中等/困难)
|
||||
- limit: number (可选) - 返回数量限制,默认10
|
||||
|
||||
返回值:
|
||||
{
|
||||
"success": true,
|
||||
"questions": [
|
||||
{
|
||||
"id": "q_12345",
|
||||
"type": "单选题",
|
||||
"content": "麻黄汤的禁忌症包括哪些?",
|
||||
"options": ["A. 发热恶寒", "B. 疮家术后", "C. 外感风热", "D. 暑湿感冒"],
|
||||
"correct_answer": "B",
|
||||
"difficulty": "中等",
|
||||
"knowledge_point_id": "kp_001",
|
||||
"explanation": "麻黄汤为发汗解表峻剂,凡疮家、淋家、亡血家等体质虚弱者禁用..."
|
||||
}
|
||||
],
|
||||
"total": 15
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. recommend_questions - AI 智能推荐试题
|
||||
```yaml
|
||||
工具名称: recommend_questions
|
||||
描述: AI根据用户学习历史、错误记录、记忆曲线等数据智能推荐试题
|
||||
|
||||
参数:
|
||||
- user_id: string (必填) - 用户ID
|
||||
- knowledge_point_id: string (必填) - 当前学习知识点ID
|
||||
- learning_context: object (必填) - 学习上下文
|
||||
- quiz_results: array - 最近抽背结果
|
||||
- wrong_answers: array - 错误记录
|
||||
- memory_status: string - 记忆状态 (初次学习/待复习/已掌握)
|
||||
- limit: number (可选) - 推荐数量,默认5
|
||||
|
||||
返回值:
|
||||
{
|
||||
"success": true,
|
||||
"recommendations": [
|
||||
{
|
||||
"question_id": "q_12345",
|
||||
"type": "单选题",
|
||||
"content": "麻黄汤的禁忌症包括哪些?",
|
||||
"recommendation_reason": "根据您最近的抽背记录,您对麻黄汤的禁忌症掌握不牢固,建议重点练习",
|
||||
"priority": "高",
|
||||
"estimated_difficulty": "中等"
|
||||
}
|
||||
],
|
||||
"strategy": {
|
||||
"focus_areas": ["麻黄汤禁忌症", "发汗解表剂适应症"],
|
||||
"weakness_targeted": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. generate_question - AI 生成新试题
|
||||
```yaml
|
||||
工具名称: generate_question
|
||||
描述: AI根据知识点内容自动生成新试题(当题库中没有相关试题时使用)
|
||||
|
||||
参数:
|
||||
- knowledge_point_content: string (必填) - 知识点内容
|
||||
- question_type: string (必填) - 目标题型 (单选/多选/判断/填空)
|
||||
- difficulty: string (可选) - 难度级别,默认"中等"
|
||||
- count: number (可选) - 生成数量,默认1
|
||||
|
||||
返回值:
|
||||
{
|
||||
"success": true,
|
||||
"generated_questions": [
|
||||
{
|
||||
"content": "麻黄汤的组成包括以下哪几味药?",
|
||||
"type": "多选题",
|
||||
"options": [
|
||||
"A. 麻黄",
|
||||
"B. 桂枝",
|
||||
"C. 杏仁",
|
||||
"D. 甘草",
|
||||
"E. 当归"
|
||||
],
|
||||
"correct_answer": "ABCD",
|
||||
"difficulty": "中等",
|
||||
"explanation": "麻黄汤由麻黄、桂枝、杏仁、甘草四味药组成,出自《伤寒论》..."
|
||||
}
|
||||
],
|
||||
"confidence_score": 0.92,
|
||||
"needs_review": false
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. submit_answer - 提交答案并获取反馈
|
||||
```yaml
|
||||
工具名称: submit_answer
|
||||
描述: 提交试题答案,AI判断正误并生成解析
|
||||
|
||||
参数:
|
||||
- question_id: string (必填) - 试题ID
|
||||
- user_answer: string (必填) - 用户答案
|
||||
- user_id: string (必填) - 用户ID
|
||||
- time_spent: number (可选) - 答题用时(秒)
|
||||
|
||||
返回值:
|
||||
{
|
||||
"success": true,
|
||||
"result": {
|
||||
"is_correct": false,
|
||||
"correct_answer": "B",
|
||||
"explanation": "麻黄汤为发汗解表峻剂,疮家术后患者体质虚弱,不宜使用发汗峻剂...",
|
||||
"related_knowledge_points": ["kp_002", "kp_003"],
|
||||
"follow_up_recommendation": {
|
||||
"action": "review_knowledge_point",
|
||||
"reason": "您对麻黄汤禁忌症掌握不牢固,建议重新学习相关知识",
|
||||
"resource_link": "/knowledge/kp_002"
|
||||
}
|
||||
},
|
||||
"memory_update": {
|
||||
"memory_strength_decreased": true,
|
||||
"next_review_time": "2026-03-31T09:00:00Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5. batch_recommend_by_quiz_history - 批量推荐试题
|
||||
```yaml
|
||||
工具名称: batch_recommend_by_quiz_history
|
||||
描述: 根据用户最近一次抽背历史,批量生成个性化练习题集
|
||||
|
||||
参数:
|
||||
- user_id: string (必填) - 用户ID
|
||||
- quiz_session_id: string (必填) - 抽背会话ID
|
||||
- question_count: number (可选) - 试题数量,默认10
|
||||
- mix_difficulty: boolean (可选) - 是否混合难度,默认true
|
||||
|
||||
返回值:
|
||||
{
|
||||
"success": true,
|
||||
"practice_set": {
|
||||
"set_id": "ps_001",
|
||||
"title": "麻黄汤专项练习(根据您今日抽背生成)",
|
||||
"total_questions": 10,
|
||||
"estimated_time": "15分钟",
|
||||
"questions": [
|
||||
{
|
||||
"id": "q_001",
|
||||
"content": "...",
|
||||
"source": "题库推荐",
|
||||
"reason": "针对您错误的知识点:麻黄汤禁忌症"
|
||||
}
|
||||
],
|
||||
"strategy_summary": {
|
||||
"wrong_points_targeted": 3,
|
||||
"new_points_introduced": 2,
|
||||
"review_points_included": 5
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **MCP 工具调用流程示例**
|
||||
|
||||
**场景:用户完成"麻黄汤组成"抽背后**
|
||||
|
||||
```
|
||||
1. 用户完成抽背 → 生成抽背报告
|
||||
|
||||
2. 系统自动调用 batch_recommend_by_quiz_history:
|
||||
- 输入:user_id, quiz_session_id
|
||||
- AI 分析:用户对"麻黄汤禁忌症"掌握不牢
|
||||
|
||||
3. MCP 工具返回:
|
||||
- 从题库查询相关试题 (query_questions)
|
||||
- 如果题库不足 → AI 生成新试题 (generate_question)
|
||||
- 混合组成10题练习集
|
||||
|
||||
4. 展示给用户:"根据您今日的抽背情况,为您生成专项练习"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 需求总结
|
||||
243
planning-artifacts/epics-and-stories.md
Normal file
243
planning-artifacts/epics-and-stories.md
Normal file
@@ -0,0 +1,243 @@
|
||||
# Epic 和用户故事清单
|
||||
|
||||
**项目名称**: AI 智能抽背助手
|
||||
**生成日期**: $(date +%Y-%m-%d)
|
||||
**基于文档**: PRD (v1.1 - 包含 MCP 工具设计)
|
||||
|
||||
---
|
||||
|
||||
## 📊 功能模块总览
|
||||
|
||||
| Epic ID | Epic 名称 | 用户故事数 | 优先级 | 预估工期 |
|
||||
|---------|----------|------------|--------|----------|
|
||||
| E-UM | 用户管理 | 11 | P0 | 5 人天 |
|
||||
| E-FS | 收藏与分享 | 8 | P1 | 3 人天 |
|
||||
| E-ST | 任务制定 | 10 | P0 | 4 人天 |
|
||||
| E-QZ | AI 语音抽背 | 28 | P0 | 15 人天 |
|
||||
| E-KP | 要点背诵 | 18 | P0 | 8 人天 |
|
||||
| **总计** | **5 个 Epic** | **75 个故事** | - | **35 人天** |
|
||||
|
||||
---
|
||||
|
||||
## Epic 1: 用户管理 (E-UM)
|
||||
|
||||
**目标**: 提供完整的用户认证和账号管理功能
|
||||
|
||||
### 用户故事列表:
|
||||
|
||||
| ID | 故事描述 | 验收标准 | 优先级 | 预估 | 依赖 |
|
||||
|----|---------|---------|--------|------|------|
|
||||
| US-UM-001 | 作为新用户,我可以通过手机号注册账号 | 1. 输入手机号和验证码\n2. 验证码验证成功\n3. 自动创建账号并登录 | P0 | 0.5人天 | - |
|
||||
| US-UM-002 | 作为新用户,我可以通过邮箱注册账号 | 1. 输入邮箱和密码\n2. 邮箱验证成功\n3. 创建账号并登录 | P0 | 0.5人天 | - |
|
||||
| US-UM-003 | 作为用户,我可以使用微信快捷登录 | 1. 点击微信登录\n2. 跳转微信授权\n3. 授权成功后自动登录 | P1 | 1人天 | - |
|
||||
| US-UM-004 | 作为用户,我可以上传和裁剪头像 | 1. 选择图片上传\n2. 裁剪图片\n3. 保存头像 | P1 | 0.5人天 | US-UM-001 |
|
||||
| US-UM-005 | 作为用户,我可以修改昵称和个人简介 | 1. 进入个人信息页\n2. 修改昵称/简介\n3. 保存成功 | P1 | 0.5人天 | US-UM-001 |
|
||||
| US-UM-006 | 作为用户,我可以修改密码 | 1. 验证原密码\n2. 输入新密码\n3. 密码修改成功 | P0 | 0.5人天 | US-UM-001 |
|
||||
| US-UM-007 | 作为用户,我可以更换绑定手机号 | 1. 验证原手机号\n2. 输入新手机号\n3. 验证成功并更换 | P1 | 1人天 | US-UM-001 |
|
||||
| US-UM-008 | 作为用户,我可以编辑性别信息 | 1. 进入个人信息页\n2. 选择性别\n3. 保存成功 | P1 | 0.5人天 | US-UM-001 |
|
||||
| US-UM-009 | 作为用户,我可以查看账号设置 | 1. 进入设置页\n2. 查看账号信息\n3. 显示完整配置 | P1 | 0.5人天 | US-UM-001 |
|
||||
| US-UM-010 | 作为系统,我需要加密存储用户密码 | 1. 密码使用 bcrypt 加密\n2. cost factor >= 10\n3. 符合安全标准 | P0 | 1人天 | - |
|
||||
| US-UM-011 | 作为系统,我需要验证Token有效性 | 1. Token 过期时间 7天\n2. 支持 Refresh Token\n3. 验证逻辑正确 | P0 | 1人天 | - |
|
||||
|
||||
**小计**: 11 个故事 | **预估**: 5 人天
|
||||
|
||||
---
|
||||
|
||||
## Epic 2: 收藏与分享 (E-FS)
|
||||
|
||||
**目标**: 允许用户收藏题目并分享学习成果
|
||||
|
||||
### 用户故事列表:
|
||||
|
||||
| ID | 故事描述 | 验收标准 | 优先级 | 预估 | 依赖 |
|
||||
|----|---------|---------|--------|------|------|
|
||||
| US-FS-001 | 作为用户,我可以收藏重要题目 | 1. 点击收藏按钮\n2. 题目加入收藏\n3. 显示收藏成功提示 | P1 | 0.5人天 | E-QZ |
|
||||
| US-FS-002 | 作为用户,我可以为收藏题添加标签 | 1. 编辑收藏题\n2. 添加标签(如"高频考点")\n3. 保存标签 | P1 | 0.5人天 | US-FS-001 |
|
||||
| US-FS-003 | 作为用户,我可以按标签分类查看收藏 | 1. 进入收藏页\n2. 按标签筛选\n3. 显示对应题目 | P1 | 1人天 | US-FS-001 |
|
||||
| US-FS-004 | 作为用户,我可以批量取消收藏 | 1. 选择多个题目\n2. 批量取消收藏\n3. 操作成功 | P1 | 1人天 | US-FS-001 |
|
||||
| US-FS-005 | 作为用户,我可以分享题目到微信 | 1. 点击分享\n2. 选择微信\n3. 跳转微信分享 | P1 | 1人天 | E-QZ |
|
||||
| US-FS-006 | 作为用户,我可以分享学习报告 | 1. 生成学习报告\n2. 点击分享\n3. 分享到社交平台 | P1 | 1人天 | E-QZ |
|
||||
| US-FS-007 | 作为系统,分享内容需自带 APP 入口链接 | 1. 生成分享链接\n2. 包含 APP 参数\n3. 可跳转回 APP | P1 | 1人天 | US-FS-005 |
|
||||
| US-FS-008 | 作为系统,需要支持 QQ/微博分享 | 1. 集成 SDK\n2. 调用分享接口\n3. 分享成功 | P1 | 1人天 | US-FS-005 |
|
||||
|
||||
**小计**: 8 个故事 | **预估**: 3 人天
|
||||
|
||||
---
|
||||
|
||||
## Epic 3: 任务制定 (E-ST)
|
||||
|
||||
**目标**: 帮助用户制定学习计划和提醒
|
||||
|
||||
### 用户故事列表:
|
||||
|
||||
| ID | 故事描述 | 验收标准 | 优先级 | 预估 | 依赖 |
|
||||
|----|---------|---------|--------|------|------|
|
||||
| US-ST-001 | 作为用户,我可以设置每日刷题任务 | 1. 输入题目数量\n2. 设置任务\n3. 任务创建成功 | P0 | 0.5人天 | E-UM |
|
||||
| US-ST-002 | 作为用户,我可以设置学习提醒时间 | 1. 选择提醒时间\n2. 保存设置\n3. 按时推送提醒 | P0 | 1人天 | US-ST-001 |
|
||||
| US-ST-003 | 作为系统,我需要通过手机通知栏推送提醒 | 1. 集成推送服务\n2. 发送通知\n3. 通知显示正确 | P0 | 1人天 | US-ST-002 |
|
||||
| US-ST-004 | 作为用户,我可以标记任务完成 | 1. 完成任务\n2. 标记完成\n3. 进度更新 | P0 | 0.5人天 | US-ST-001 |
|
||||
| US-ST-005 | 作为用户,我可以设置提醒频率 | 1. 选择频率(每天/每周)\n2. 保存设置\n3. 按设置的频率推送 | P1 | 0.5人天 | US-ST-002 |
|
||||
| US-ST-006 | 作为系统,我需要支持定时任务调度 | 1. 任务队列(BullMQ)\n2. 定时触发\n3. 执行推送 | P0 | 1.5人天 | - |
|
||||
| US-ST-007 | 作为用户,我可以查看任务完成情况 | 1. 进入任务页\n2. 查看统计\n3. 显示完成率 | P1 | 0.5人天 | US-ST-001 |
|
||||
| US-ST-008 | 作为用户,我可以编辑任务设置 | 1. 修改任务参数\n2. 保存修改\n3. 更新生效 | P1 | 0.5人天 | US-ST-001 |
|
||||
| US-ST-009 | 作为系统,我需要避免深夜推送(22:00-8:00) | 1. 检查推送时间\n2. 过滤夜间时段\n3. 合理时间推送 | P1 | 0.5人天 | US-ST-003 |
|
||||
| US-ST-010 | 作为用户,我可以暂停/恢复任务提醒 | 1. 暂停提醒\n2. 恢复提醒\n3. 状态正确更新 | P1 | 0.5人天 | US-ST-002 |
|
||||
|
||||
**小计**: 10 个故事 | **预估**: 4 人天
|
||||
|
||||
---
|
||||
|
||||
继续生成其他 Epic...
|
||||
|
||||
---
|
||||
|
||||
## Epic 4: AI 语音抽背 (E-QZ)
|
||||
|
||||
**目标**: 核心功能 - 通过 AI 语音交互进行智能抽背
|
||||
|
||||
### 用户故事列表:
|
||||
|
||||
| ID | 故事描述 | 验收标准 | 优先级 | 预估 | 依赖 |
|
||||
|----|---------|---------|--------|------|------|
|
||||
| US-QZ-001 | 作为用户,我可以选择抽背范围(章节/错题本/收藏) | 1. 进入抽背设置\n2. 选择范围\n3. 确认选择 | P0 | 0.5人天 | E-UM |
|
||||
| US-QZ-002 | 作为用户,我可以设置抽背方式(顺序/随机) | 1. 选择抽背模式\n2. 保存设置\n3. 按设置的顺序抽背 | P0 | 0.5人天 | US-QZ-001 |
|
||||
| US-QZ-003 | 作为用户,我可以设置抽背间隔时间 | 1. 选择间隔(30s/60s/90s)\n2. 保存设置\n3. 按间隔抽背 | P1 | 0.5人天 | US-QZ-001 |
|
||||
| US-QZ-004 | 作为用户,我可以通过语音提问 | 1. 点击麦克风\n2. 说出问题\n3. 语音转文字显示 | P0 | 1人天 | - |
|
||||
| US-QZ-005 | 作为用户,我可以通过文字提问 | 1. 输入文字\n2. 提交问题\n3. 显示问题 | P0 | 0.5人天 | - |
|
||||
| US-QZ-006 | 作为用户,AI 可以即时判断我的答案正误 | 1. 提交答案\n2. AI 判断\n3. 显示正误反馈 | P0 | 2人天 | US-QZ-004 |
|
||||
| US-QZ-007 | 作为系统,我需要将错误内容标记为"待再次抽背" | 1. 检测答案错误\n2. 标记题目\n3. 加入复习队列 | P0 | 1人天 | US-QZ-006 |
|
||||
| US-QZ-008 | 作为用户,我可以调节语音播报语速 | 1. 选择语速(正常/慢速)\n2. 保存设置\n3. 按设置语速播报 | P1 | 0.5人天 | US-QZ-004 |
|
||||
| US-QZ-009 | 作为用户,抽背结束可以查看报告 | 1. 完成抽背\n2. 生成报告\n3. 显示正确率、错误题目、用时 | P0 | 1.5人天 | US-QZ-006 |
|
||||
| US-QZ-010 | 作为系统,我需要基于错误提供复习建议 | 1. 分析错误题目\n2. 生成建议\n3. 显示具体建议 | P0 | 1.5人天 | US-QZ-009 |
|
||||
| US-QZ-011 | 作为系统,我需要计算艾宾浩斯遗忘曲线 | 1. 记录抽背数据\n2. 计算遗忘周期\n3. 准确预测遗忘时间 | P0 | 2人天 | US-QZ-006 |
|
||||
| US-QZ-012 | 作为系统,我需要在遗忘临界点推送提醒 | 1. 计算遗忘时间\n2. 定时检查\n3. 推送提醒 | P0 | 1.5人天 | US-QZ-011 |
|
||||
| US-QZ-013 | 作为用户,我可以查看记忆曲线可视化 | 1. 进入记忆页\n2. 查看曲线\n3. 显示记忆强度变化 | P1 | 1人天 | US-QZ-011 |
|
||||
| US-QZ-014 | 作为用户,我可以查看复习计划日历 | 1. 进入日历页\n2. 查看计划\n3. 显示复习时间安排 | P1 | 1人天 | US-QZ-011 |
|
||||
| US-QZ-015 | 作为用户,我可以自定义提醒时间段 | 1. 设置时间段\n2. 保存设置\n3. 在设置时段推送 | P1 | 0.5人天 | US-QZ-012 |
|
||||
| US-QZ-016 | 作为系统,我需要避免深夜推送 | 1. 检查时间\n2. 过滤22:00-8:00\n3. 合理时间推送 | P1 | 0.5人天 | US-QZ-012 |
|
||||
| US-QZ-017 | 作为系统,管理员可以后台查询抽背记录 | 1. 进入后台\n2. 查询记录\n3. 显示详细数据 | P1 | 1.5人天 | US-QZ-009 |
|
||||
| US-QZ-018 | 作为系统,数据支持导出 Excel | 1. 查询数据\n2. 生成 Excel\n3. 下载文件 | P1 | 1人天 | US-QZ-017 |
|
||||
| US-QZ-019 | 作为系统,数据需要实时同步 | 1. 更新抽背数据\n2. 同步到数据库\n3. 实时显示 | P0 | 1人天 | US-QZ-009 |
|
||||
| US-QZ-020 | 作为用户,我可以查看虚拟人物展示 | 1. 进入抽背页\n2. 显示虚拟人物\n3. 增强亲和力 | P1 | 0.5人天 | - |
|
||||
| US-QZ-021 | 作为用户,我可以查看AI助教引导语 | 1. 进入抽背页\n2. 显示引导语\n3. 明确抽背主题 | P1 | 0.5人天 | - |
|
||||
| US-QZ-022 | 作为用户,我可以看到实时语音转文字 | 1. 说话中\n2. 实时显示文字\n3. 更新内容 | P0 | 1.5人天 | US-QZ-004 |
|
||||
| US-QZ-023 | 作为用户,错误时可以看到正确答案和解析 | 1. 答案错误\n2. 显示正确答案\n3. 显示解析 | P0 | 1人天 | US-QZ-006 |
|
||||
| US-QZ-024 | 作为系统,需要显示错误知识点统计 | 1. 统计错误\n2. 按章节分组\n3. 显示统计图表 | P1 | 1人天 | US-QZ-009 |
|
||||
| US-QZ-025 | 作为用户,我可以查看表现趋势图 | 1. 进入报告页\n2. 查看趋势\n3. 显示正确率曲线 | P1 | 1人天 | US-QZ-009 |
|
||||
| US-QZ-026 | 作为用户,错误题目可点击跳转知识点 | 1. 点击错误题\n2. 跳转知识点\n3. 显示详情 | P1 | 0.5人天 | US-QZ-023 |
|
||||
| US-QZ-027 | 作为系统,需要支持多种抽背模式切换 | 1. 选择模式\n2. 切换模式\n3. 模式生效 | P1 | 1人天 | US-QZ-002 |
|
||||
| US-QZ-028 | 作为系统,需要记忆强度计算算法 | 1. 记录抽背数据\n2. 计算强度\n3. 更新状态 | P0 | 1.5人天 | US-QZ-011 |
|
||||
|
||||
**小计**: 28 个故事 | **预估**: 15 人天
|
||||
|
||||
---
|
||||
|
||||
## Epic 5: 要点背诵 (E-KP)
|
||||
|
||||
**目标**: 通过卡片、挖空、关联试题等方式强化记忆
|
||||
|
||||
### 用户故事列表:
|
||||
|
||||
| ID | 故事描述 | 验收标准 | 优先级 | 预估 | 依赖 |
|
||||
|----|---------|---------|--------|------|------|
|
||||
| US-KP-001 | 作为用户,我可以通过卡片式抽背学习 | 1. 选择卡片模式\n2. 显示卡片\n3. 左右滑动切换 | P0 | 0.5人天 | E-QZ |
|
||||
| US-KP-002 | 作为用户,我可以标记卡片"已记住"/"未记住" | 1. 查看卡片\n2. 标记状态\n3. 自动更新复习列表 | P0 | 0.5人天 | US-KP-001 |
|
||||
| US-KP-003 | 作为用户,我可以通过音频带背学习 | 1. 选择音频模式\n2. 播放音频\n3. 跟随朗读 | P1 | 1人天 | E-QZ |
|
||||
| US-KP-004 | 作为用户,我可以通过挖空填空学习 | 1. 选择挖空模式\n2. 显示挖空题\n3. 填入答案 | P0 | 1人天 | E-QZ |
|
||||
| US-KP-005 | 作为系统,挖空内容在下方显示为选项 | 1. 生成挖空题\n2. 显示选项\n3. 点击填入 | P0 | 1人天 | US-KP-004 |
|
||||
| US-KP-006 | 作为用户,我可以播放原声音频 | 1. 点击播放按钮\n2. 播放音频\n3. 可以暂停/重播 | P1 | 0.5人天 | US-KP-003 |
|
||||
| US-KP-007 | 作为系统,需要支持暂停/重播功能 | 1. 播放音频\n2. 暂停/重播\n3. 功能正常 | P1 | 0.5人天 | US-KP-006 |
|
||||
| US-KP-008 | 作为用户,填入答案后可以即时判断正误 | 1. 填入答案\n2. 判断正误\n3. 显示结果 | P0 | 1人天 | US-KP-004 |
|
||||
| US-KP-009 | 作为用户,我可以查看"看答案"/"隐藏答案" | 1. 查看答案\n2. 隐藏答案\n3. 切换显示 | P1 | 0.5人天 | US-KP-004 |
|
||||
| US-KP-010 | **作为用户,系统推荐关联试题** | 1. 背诵完成\n2. 推荐试题\n3. 点击可跳转 | P0 | **见下文** | E-QZ |
|
||||
| US-KP-011 | **作为系统,需要实现 query_questions 工具** | 1. 接收知识点ID\n2. 查询题库\n3. 返回试题列表 | P0 | **2人天** | - |
|
||||
| US-KP-012 | **作为系统,需要实现 recommend_questions 工具** | 1. 接收用户上下文\n2. AI 分析\n3. 返回推荐试题 | P0 | **3人天** | US-KP-011 |
|
||||
| US-KP-013 | **作为系统,需要实现 generate_question 工具** | 1. 题库不足时触发\n2. AI 生成试题\n3. 返回新试题 | P0 | **3人天** | US-KP-011 |
|
||||
| US-KP-014 | **作为系统,需要实现 submit_answer 工具** | 1. 接收答案\n2. 判断正误\n3. 更新记忆曲线 | P0 | **2人天** | US-KP-010 |
|
||||
| US-KP-015 | **作为系统,需要实现 batch_recommend 工具** | 1. 抽背完成触发\n2. 批量生成练习\n3. 返回练习集 | P1 | **2人天** | US-KP-012 |
|
||||
| US-KP-016 | 作为用户,我可以点击试题跳转到答题页 | 1. 点击试题\n2. 跳转页面\n3. 显示答题界面 | P0 | 0.5人天 | US-KP-010 |
|
||||
| US-KP-017 | 作为用户,我可以查看答题进度(如 4/12) | 1. 答题中\n2. 显示进度条\n3. 更新进度 | P0 | 0.5人天 | US-KP-016 |
|
||||
| US-KP-018 | 作为用户,我可以选择答案(A/B/C/D) | 1. 查看题目\n2. 选择答案\n3. 提交答案 | P0 | 0.5人天 | US-KP-016 |
|
||||
|
||||
**小计**: 18 个故事 | **预估**: 8 人天 |
|
||||
**MCP 工具开发**: 5 个工具 | **预估**: 12 人天 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 关键技术组件
|
||||
|
||||
### MCP 工具层(新增)
|
||||
|
||||
| 组件 | 描述 | 预估工期 |
|
||||
|------|------|----------|
|
||||
| **query_questions** | 题库查询工具 | 2人天 |
|
||||
| **recommend_questions** | AI 智能推荐工具 | 3人天 |
|
||||
| **generate_question** | AI 生成试题工具 | 3人天 |
|
||||
| **submit_answer** | 答题反馈工具 | 2人天 |
|
||||
| **batch_recommend_by_quiz_history** | 批量推荐工具 | 2人天 |
|
||||
| **MCP 集成层** | 工具编排和调用 | 2人天 |
|
||||
| **小计** | | **14人天** |
|
||||
|
||||
### 基础设施
|
||||
|
||||
| 组件 | 描述 | 预估工期 |
|
||||
|------|------|----------|
|
||||
| 数据库设计 | PostgreSQL + Prisma | 2人天 |
|
||||
| 后端 API | NestJS 框架搭建 | 3人天 |
|
||||
| 前端框架 | Next.js 14 + Tailwind | 3人天 |
|
||||
| AI 集成 | Claude API 接入 | 2人天 |
|
||||
| 部署配置 | Docker + Nginx | 1人天 |
|
||||
| **小计** | | **11人天** |
|
||||
|
||||
---
|
||||
|
||||
## 💰 报价汇总
|
||||
|
||||
### 工作量估算
|
||||
|
||||
| 类别 | 人天 | 占比 |
|
||||
|------|------|------|
|
||||
| 用户故事开发 | 35 | 52% |
|
||||
| MCP 工具开发 | 14 | 21% |
|
||||
| 基础设施 | 11 | 16% |
|
||||
| 测试 & QA | 5 | 7% |
|
||||
| 项目管理 | 2 | 4% |
|
||||
| **总计** | **67** | **100%** |
|
||||
|
||||
### 工期估算
|
||||
|
||||
| 团队规模 | 预估工期 |
|
||||
|---------|----------|
|
||||
| 1 人 | 67 天 (~3.5 个月) |
|
||||
| 2 人 | 45 天 (~2 个月) |
|
||||
| 3 人 | 34 天 (~1.5 个月) |
|
||||
| 5 人 | 25 天 (~1 个月) |
|
||||
|
||||
### 成本报价
|
||||
|
||||
假设费率:¥1,000/人天
|
||||
|
||||
| 类别 | 人天 | 成本(¥) |
|
||||
|------|------|----------|
|
||||
| 功能开发 | 35 | 35,000 |
|
||||
| MCP 工具 | 14 | 14,000 |
|
||||
| 基础设施 | 11 | 11,000 |
|
||||
| 测试 & QA | 5 | 5,000 |
|
||||
| 项目管理 | 2 | 2,000 |
|
||||
| **总计** | **67** | **¥67,000** |
|
||||
|
||||
---
|
||||
|
||||
## 📝 注意事项
|
||||
|
||||
1. **MCP 工具为新增需求**:基于最新需求文档 5.3 节补充
|
||||
2. **混合模式实现**:题库 + AI 生成,确保试题充足
|
||||
3. **AI Agent 核心**:推荐和生成功能依赖 AI 能力
|
||||
4. **记忆曲线集成**:答题结果需实时更新记忆曲线算法
|
||||
5. **技术债务预留**:建议预留 10% 时间处理技术债务
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**生成时间**: $(date)
|
||||
**下次更新**: 根据技术评审结果调整
|
||||
@@ -692,6 +692,106 @@ classification:
|
||||
| FR-KP-003-03 | 精准匹配 | 试题与知识点精准对应 | P1 |
|
||||
| FR-KP-003-04 | 难度分级 | 试题按难度分级(简单/中等/困难) | P1 |
|
||||
|
||||
|
||||
### 技术实现说明
|
||||
|
||||
#### 试题来源(混合模式)
|
||||
|
||||
1. **题库查询优先**
|
||||
- 从后台上传的题库查询相关试题
|
||||
- MCP 工具:`query_questions`
|
||||
|
||||
2. **AI 动态生成补充**
|
||||
- 当题库中没有相关试题时,AI 自动生成新试题
|
||||
- MCP 工具:`generate_question`
|
||||
|
||||
#### 推荐机制(AI 智能推荐)
|
||||
|
||||
1. **基于学习历史推荐**
|
||||
- 分析用户抽背历史、错误记录、记忆曲线
|
||||
- 针对薄弱点精准推荐
|
||||
- MCP 工具:`recommend_questions`
|
||||
|
||||
2. **批量生成练习集**
|
||||
- 根据抽背会话批量生成个性化练习题集
|
||||
- MCP 工具:`batch_recommend_by_quiz_history`
|
||||
|
||||
#### 交互流程
|
||||
|
||||
1. 抽背完成 → 自动调用 MCP 工具推荐试题
|
||||
2. 用户答题 → 实时反馈
|
||||
3. 答题结果 → 更新记忆曲线 → 影响下次推荐
|
||||
- MCP 工具:`submit_answer`
|
||||
|
||||
### MCP 工具架构设计
|
||||
|
||||
#### 1. query_questions - 根据知识点查询试题
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| knowledge_point_id | string | ✅ | 知识点ID |
|
||||
| question_type | string | ❌ | 题型筛选 (单选/多选/判断/填空) |
|
||||
| difficulty | string | ❌ | 难度级别 (简单/中等/困难) |
|
||||
| limit | number | ❌ | 返回数量限制,默认10 |
|
||||
|
||||
**返回值**:试题列表(含ID、类型、内容、选项、答案、解析)
|
||||
|
||||
#### 2. recommend_questions - AI 智能推荐试题
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| user_id | string | ✅ | 用户ID |
|
||||
| knowledge_point_id | string | ✅ | 当前学习知识点ID |
|
||||
| learning_context | object | ✅ | 学习上下文(抽背结果、错误记录、记忆状态) |
|
||||
| limit | number | ❌ | 推荐数量,默认5 |
|
||||
|
||||
**返回值**:推荐试题列表 + 推荐理由 + 策略分析
|
||||
|
||||
#### 3. generate_question - AI 生成新试题
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| knowledge_point_content | string | ✅ | 知识点内容 |
|
||||
| question_type | string | ✅ | 目标题型 (单选/多选/判断/填空) |
|
||||
| difficulty | string | ❌ | 难度级别,默认"中等" |
|
||||
| count | number | ❌ | 生成数量,默认1 |
|
||||
|
||||
**返回值**:生成的试题 + 置信度评分 + 是否需要人工审核
|
||||
|
||||
#### 4. submit_answer - 提交答案并获取反馈
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| question_id | string | ✅ | 试题ID |
|
||||
| user_answer | string | ✅ | 用户答案 |
|
||||
| user_id | string | ✅ | 用户ID |
|
||||
| time_spent | number | ❌ | 答题用时(秒) |
|
||||
|
||||
**返回值**:判断结果 + 正确答案 + 解析 + 记忆曲线更新
|
||||
|
||||
#### 5. batch_recommend_by_quiz_history - 批量推荐试题
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| user_id | string | ✅ | 用户ID |
|
||||
| quiz_session_id | string | ✅ | 抽背会话ID |
|
||||
| question_count | number | ❌ | 试题数量,默认10 |
|
||||
| mix_difficulty | boolean | ❌ | 是否混合难度,默认true |
|
||||
|
||||
**返回值**:练习题集 + 策略总结(针对性题数、新题数、复习题数)
|
||||
|
||||
### 技术架构影响
|
||||
|
||||
**新增组件**:
|
||||
- **MCP 工具层**:5 个试题相关工具
|
||||
- **AI Agent**:负责试题生成和推荐决策
|
||||
- **题库管理模块**:支持后台上传和管理试题
|
||||
- **学习分析引擎**:基于历史数据生成个性化推荐
|
||||
|
||||
**数据流**:
|
||||
```
|
||||
抽背完成 → 学习分析 → 推荐策略 → 混合模式(题库+AI生成) → 试题展示 → 答题反馈 → 记忆曲线更新
|
||||
```
|
||||
---
|
||||
|
||||
### 功能需求总结
|
||||
|
||||
@@ -258,6 +258,59 @@
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<!-- 史诗和用户故事清单 -->
|
||||
<div class="doc-card bg-white rounded-xl shadow-sm overflow-hidden">
|
||||
<div class="flex">
|
||||
<div class="w-2 bg-orange-500"></div>
|
||||
<div class="p-6 flex-1">
|
||||
<div class="flex items-start justify-between mb-4">
|
||||
<div>
|
||||
<div class="flex items-center gap-2 mb-2">
|
||||
<h3 class="text-lg font-semibold text-gray-800">史诗和用户故事清单</h3>
|
||||
<span class="px-2 py-0.5 bg-orange-100 text-orange-700 rounded text-xs">功能清单 & 报价</span>
|
||||
</div>
|
||||
<p class="text-gray-600 text-sm mb-4">详细的功能清单,包含 5 个 Epic、75 个用户故事、工作量估算和成本报价</p>
|
||||
</div>
|
||||
<div class="w-12 h-12 bg-orange-100 rounded-xl flex items-center justify-center">
|
||||
<i class="fas fa-tasks text-orange-600 text-xl"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-3 gap-4 mb-4 text-sm">
|
||||
<div class="bg-gray-50 rounded-lg p-3">
|
||||
<p class="text-gray-500 text-xs">Epic 数</p>
|
||||
<p class="font-semibold text-gray-800">5 个</p>
|
||||
</div>
|
||||
<div class="bg-gray-50 rounded-lg p-3">
|
||||
<p class="text-gray-500 text-xs">用户故事</p>
|
||||
<p class="font-semibold text-gray-800">75 个</p>
|
||||
</div>
|
||||
<div class="bg-gray-50 rounded-lg p-3">
|
||||
<p class="text-gray-500 text-xs">预估工期</p>
|
||||
<p class="font-semibold text-gray-800">67 人天</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<span class="px-2 py-1 bg-gray-100 text-gray-600 rounded text-xs">Epic</span>
|
||||
<span class="px-2 py-1 bg-gray-100 text-gray-600 rounded text-xs">用户故事</span>
|
||||
<span class="px-2 py-1 bg-gray-100 text-gray-600 rounded text-xs">工作量估算</span>
|
||||
<span class="px-2 py-1 bg-gray-100 text-gray-600 rounded text-xs">报价</span>
|
||||
<span class="px-2 py-1 bg-gray-100 text-gray-600 rounded text-xs">MCP 工具</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="view-doc.html?doc=epics-and-stories.md" target="_self" class="px-4 py-2 bg-orange-600 text-white rounded-lg text-sm hover:bg-orange-700">
|
||||
<i class="fas fa-eye mr-2"></i>查看文档
|
||||
</a>
|
||||
<a href="docs/epics-and-stories.xlsx" download class="px-4 py-2 bg-green-600 text-white rounded-lg text-sm hover:bg-green-700">
|
||||
<i class="fas fa-file-excel mr-2"></i>下载 Excel
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a href="admin-index.html" class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-50 transition">
|
||||
<i class="fas fa-th text-gray-400 w-5"></i>
|
||||
<span class="text-gray-700">平铺展示</span>
|
||||
|
||||
BIN
prototype/docs/epics-and-stories.xlsx
Normal file
BIN
prototype/docs/epics-and-stories.xlsx
Normal file
Binary file not shown.
Reference in New Issue
Block a user