用户使用流程图 — 任务模板市场
端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动
分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体
flowchart TD
%% ============ 颜色定义 ============
classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px
classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px
classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2
classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3
%% ============ 角色 ============
ROLE_PARENT(("👤 家长")):::actor
ROLE_TEACHER(("📋 规划师")):::actor
ROLE_ADMIN(("🖥 管理员")):::actor
ROLE_WX(("💳 微信支付")):::actor
%% ================================================================
%% 阶段一:市场浏览
%% ================================================================
subgraph 阶段一[阶段一:市场浏览]
P1["🏠 小程序:模板市场页"]:::page
P1 -->|"查看公开模板"| A1["🔗 POST /api/market/packages"]:::api
A1 -->|"筛选条件: category"| S1["⚙️ TaskTemplatePackageService.getPublicPackages()"]:::service
S1 -->|"查询已审核+公开的模板"| D1["📦 task_template_packages 表"]:::data
P1 -->|"查看模板详情"| P1a["🏠 模板详情页"]:::page
P1a -->|"模板ID"| A2["🔗 POST /api/market/packages/{id}"]:::api
A2 -->|"模板ID"| S2["⚙️ TaskTemplatePackageService.getPackageById()"]:::service
S2 -->|"模板完整信息"| D1
P1a -->|"查看任务项"| A3["🔗 POST /api/market/packages/{id}/items"]:::api
A3 -->|"模板ID"| S3["⚙️ TaskTemplatePackageService.getPackageItems()"]:::service
S3 -->|"该模板下的所有任务项"| D2["📦 task_template_items 表"]:::data
P1 -->|"通过分享码进入"| P1b["🏠 分享落地页"]:::page
P1b -->|"分享码"| A4["🔗 POST /api/market/share/{code}"]:::api
A4 -->|"分享码"| S4["⚙️ TaskTemplatePackageService.getPackageByShareCode()"]:::service
S4 -->|"匹配的模板"| D1
end
%% ================================================================
%% 阶段二:购买流程
%% ================================================================
subgraph 阶段二[阶段二:购买流程]
D1 -->|"选定模板, 孩子ID, 指导师"| P2["🏠 小程序:确认订单页"]:::page
P2 -->|"创建订单"| A5["🔗 POST /api/payment/create"]:::api
A5 -->|"userId, familyId, packageId, payMethod, couponId"| S5["⚙️ PackagePaymentService.createOrder()"]:::service
S5 -->|"写入订单, 状态=pending"| D3["📦 package_orders 表"]:::data
D3 -->|"订单ID"| P2a["🏠 小程序:支付页"]:::page
P2a -->|"获取微信支付参数"| A6["🔗 POST /api/payment/wechat params"]:::api
A6 -->|"orderId, openid"| S6["⚙️ PackagePaymentService.createWechatPayOrder()"]:::service
S6 -->|"JSAPI调起支付参数"| D_WX["📦 微信支付预支付单"]:::data
D_WX -->|"用户确认支付"| P2b["⚙️ 微信支付弹窗"]:::page
P2b -->|"支付结果通知"| A7["🔗 POST /api/payment/notify"]:::api
A7 -->|"微信XML回调数据"| S7["⚙️ PackagePaymentService.handlePayNotify()"]:::service
S7 -->|"更新订单状态=paid"| D3
D3 -->|"订单状态=paid"| P2c["🏠 小程序:应用模板页"]:::page
P2c -->|"选择任务项, 确认孩子"| A8["🔗 POST /api/payment/apply"]:::api
A8 -->|"orderId, childId, selectedItemIds"| S8["⚙️ TaskPlanService.applyPackage()"]:::service
S8 -->|"复制模板项→计划项, 写入实例"| D5["📦 task_plan_instances + task_plan_items"]:::data
end
%% ================================================================
%% 阶段三:我的计划
%% ================================================================
subgraph 阶段三[阶段三:我的计划]
D5 -->|"家庭ID"| P3["🏠 小程序:我的计划列表页"]:::page
P3 -->|"查看所有计划"| A9["🔗 POST /api/market/plans"]:::api
A9 -->|"userId(提取familyId)"| S9["⚙️ TaskPlanService.getFamilyPlans()"]:::service
S9 -->|"该家庭的所有计划实例"| D5
P3 -->|"查看计划详情"| P3a["🏠 计划详情页"]:::page
P3a -->|"计划ID"| A10["🔗 POST /api/market/plans/{id}"]:::api
A10 -->|"计划ID"| S10["⚙️ TaskPlanService.getPlanById()"]:::service
S10 -->|"计划实例详情"| D5
P3a -->|"查看计划任务项"| A11["🔗 POST /api/market/plans/{id}/items"]:::api
A11 -->|"实例ID"| S11["⚙️ TaskPlanService.getPlanItems()"]:::service
S11 -->|"该计划的每日任务项"| D6["📦 task_plan_items 表"]:::data
P3 -->|"取消计划"| P3b["🏠 取消确认弹窗"]:::page
P3b -->|"计划ID"| A12["🔗 POST /api/market/plans/{id}/cancel"]:::api
A12 -->|"计划ID"| S12["⚙️ TaskPlanService.cancelPlan()"]:::service
S12 -->|"状态→cancelled"| D5
end
%% ================================================================
%% 阶段四:模板创建(规划师)
%% ================================================================
subgraph 阶段四[阶段四:模板创建与发布]
P4["📋 规划师端:创建模板页"]:::page
P4 -->|"填写模板信息"| A13["🔗 POST /api/packages/create"]:::api
A13 -->|"creatorId, 名称, 描述, 周期, 价格, 分类, 标签, 封面"| S13["⚙️ TaskTemplatePackageService.createPackage()"]:::service
S13 -->|"写入模板, 状态=draft"| D1
D1 -->|"模板ID"| P4a["📋 规划师端:编辑模板页"]:::page
P4a -->|"添加任务项"| A14["🔗 POST /api/packages/{id}/items"]:::api
A14 -->|"packageId, 任务名称, 描述, 积分, 频率, 时长, 必选"| S14["⚙️ TaskTemplatePackageService.addItem()"]:::service
S14 -->|"写入一条任务项"| D2
P4a -->|"更新模板信息"| A15["🔗 POST /api/packages/{id}/update"]:::api
A15 -->|"模板ID, 更新字段"| S15["⚙️ TaskTemplatePackageService.updatePackage()"]:::service
S15 -->|"更新模板记录"| D1
P4a -->|"提交审核"| A16["🔗 POST /api/packages/{id}/submit"]:::api
A16 -->|"模板ID"| S16["⚙️ TaskTemplatePackageService.submitForReview()"]:::service
S16 -->|"状态→pending"| D1
end
%% ================================================================
%% 阶段五:审核管理(管理员)
%% ================================================================
subgraph 阶段五[阶段五:审核与上架]
D1 -->|"status=pending"| P5["🖥 管理后台:待审核列表"]:::page
P5 -->|"查看待审核"| A17["🔗 POST /api/admin/packages/pending"]:::api
A17 -->|"无参数"| S17["⚙️ TaskTemplatePackageService.getPendingPackages()"]:::service
S17 -->|"所有pending状态的模板"| D1
P5 -->|"审核通过"| A18["🔗 POST /api/admin/packages/{id}/approve"]:::api
A18 -->|"模板ID, reviewerId"| S18["⚙️ TaskTemplatePackageService.approvePackage()"]:::service
S18 -->|"状态→approved, 记录审核人"| D1
P5 -->|"审核拒绝"| A19["🔗 POST /api/admin/packages/{id}/reject"]:::api
A19 -->|"模板ID, reviewerId, reason"| S19["⚙️ TaskTemplatePackageService.rejectPackage()"]:::service
S19 -->|"状态→rejected, 记录原因"| D1
D1 -->|"status=approved"| P5a["🖥 管理后台:发布操作"]:::page
P5a -->|"上架/下架"| A20["🔗 POST /api/packages/{id}/publish"]:::api
A20 -->|"模板ID, publish=true/false"| S20["⚙️ TaskTemplatePackageService.publishPackage()"]:::service
S20 -->|"isPublic标记+状态变更"| D1
end
%% ================================================================
%% 角色关联
%% ================================================================
ROLE_PARENT -.- P1
ROLE_PARENT -.- P2
ROLE_PARENT -.- P3
ROLE_TEACHER -.- P4
ROLE_ADMIN -.- P5
ROLE_ADMIN -.- P5a
ROLE_WX -.- P2b
端点明细
市场浏览
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/market/packages |
获取公开模板列表 |
📱小程序 |
{category(可选)} |
List<TaskTemplatePackage> |
POST /api/market/packages/{id} |
获取模板详情 |
📱小程序 |
path: id |
TaskTemplatePackage |
POST /api/market/packages/{id}/items |
获取模板任务项 |
📱小程序 |
path: id |
List<TaskTemplateItem> |
POST /api/market/share/{code} |
通过分享码获取模板 |
📱小程序 |
path: code |
TaskTemplatePackage |
购买流程
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/payment/create |
创建支付订单 |
📱小程序 |
{packageId, payMethod, couponId(可选)} |
PackageOrder |
POST /api/payment/wechat params |
获取微信支付参数 |
⚙️系统自动 |
{orderId, openid} |
JSAPI调起支付参数 |
POST /api/payment/notify |
微信支付回调 |
⚙️系统自动 |
XML回调数据 |
XML响应(SUCCESS/FAIL) |
POST /api/payment/orders/{orderId} |
查询订单状态 |
📱小程序 |
path: orderId |
PackageOrder |
POST /api/payment/apply |
支付后应用模板 |
📱小程序 |
{orderId, childId, selectedItemIds} |
TaskPlanInstance |
POST /api/payment/orders/{orderId}/cancel |
取消订单 |
📱小程序 |
path: orderId |
boolean |
我的计划
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/market/plans |
获取我的计划列表 |
📱小程序 |
—(从token提取userId) |
List<TaskPlanInstance> |
POST /api/market/plans/{id} |
获取计划详情 |
📱小程序 |
path: id |
TaskPlanInstance |
POST /api/market/plans/{id}/items |
获取计划任务项 |
📱小程序 |
path: id |
List<TaskPlanItem> |
POST /api/market/plans/{id}/cancel |
取消计划 |
📱小程序 |
path: id |
boolean |
模板创建(规划师)
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/packages/create |
创建任务模板 |
📋规划师端 |
{name, description, cycleDays, category, price, coverImage, isPublic, tags} |
模板ID |
POST /api/packages/{id}/update |
更新任务模板 |
📋规划师端 |
path: id, body: 同create的可选字段 |
boolean |
POST /api/packages/{id} |
获取模板详情 |
📋规划师端 |
path: id |
TaskTemplatePackage |
POST /api/packages/my |
获取我的模板列表 |
📋规划师端 |
—(从token提取creatorId) |
List<TaskTemplatePackage> |
POST /api/packages/{id}/submit |
提交审核 |
📋规划师端 |
path: id |
boolean |
POST /api/packages/{id}/publish |
发布/下架 |
📋规划师端 |
path: id, body: {publish: true/false} |
boolean |
POST /api/packages/{id}/items |
添加任务项 |
📋规划师端 |
path: id, body: {taskName, description, points, frequency, duration, isRequired} |
任务项ID |
POST /api/packages/items/{itemId} |
更新任务项 |
📋规划师端 |
path: itemId, body: 更新字段 |
boolean |
POST /api/packages/items/{itemId}/delete |
删除任务项 |
📋规划师端 |
path: itemId |
boolean |
POST /api/packages/{id}/item-list |
获取模板任务项列表 |
📋规划师端 |
path: id |
List<TaskTemplateItem> |
审核管理(管理员)
| 端点 |
说明 |
端口 |
请求数据 |
响应数据 |
POST /api/admin/packages/pending |
获取待审核模板列表 |
🖥管理后台 |
— |
List<TaskTemplatePackage> |
POST /api/admin/packages/{id}/approve |
审核通过 |
🖥管理后台 |
path: id |
boolean |
POST /api/admin/packages/{id}/reject |
审核拒绝 |
🖥管理后台 |
path: id, query: reason |
boolean |
数据实体关系
erDiagram
TaskTemplatePackage ||--o{ TaskTemplateItem : "一个模板多个任务项"
TaskTemplatePackage ||--o{ PackageOrder : "一个模板多个订单"
TaskTemplatePackage ||--o{ TaskPlanInstance : "一个模板多次被应用"
TaskPlanInstance ||--o{ TaskPlanItem : "一个实例多个计划项"
TaskTemplateItem ||--o{ TaskPlanItem : "模板项被复制为计划项"
TaskTemplatePackage {
Long id PK
Long creatorId FK "规划师ID"
string name "任务模板名称"
string description "详细介绍"
int cycleDays "周期天数"
string category "分类"
string tags "标签JSON"
int price "售价(分)"
int platformFee "平台服务费(分)"
int isPublic "是否公开到市场"
string shareCode "分享码"
string status "draft/pending/approved/rejected/offline"
}
TaskTemplateItem {
Long id PK
Long packageId FK
string taskName "任务名称"
string description "任务描述"
int points "基础积分"
string frequency "执行频率"
int duration "预计时长(分钟)"
int isRequired "是否必选"
}
PackageOrder {
Long id PK
string orderNo
Long userId FK "购买者"
Long familyId FK
Long packageId FK
int price "支付金额(分)"
string status "pending/paid/cancelled/refunded"
}
TaskPlanInstance {
Long id PK
Long packageId FK
Long familyId FK
Long childId FK
string name "实例名称"
string status "active/completed/cancelled"
int totalDays
int completedDays
}
TaskPlanItem {
Long id PK
Long instanceId FK
Long templateItemId FK
string taskName
string description
int points
string frequency
}
完整性分析
| # |
维度 |
评估 |
说明 |
| 1 |
流程完整性 |
✅ 完整 |
覆盖市场浏览→购买支付→应用计划→计划管理→模板创建→审核上架6个阶段,路径完整 |
| 2 |
异常路径 |
⚠️ 部分覆盖 |
订单支付失败/取消、审核拒绝已覆盖;模板创建后编辑、草稿状态管理等在图中有体现;价格计算逻辑、优惠券使用等Service层内部处理未画入 |
| 3 |
端点覆盖 |
✅ 完整 |
26个端点全部映射到流程图中,覆盖MarketController(9)、PackagePaymentController(6)、TaskTemplatePackageController(10)、AdminPackageController(3) |
| 4 |
角色覆盖 |
✅ 完整 |
家长(市场浏览/购买/计划管理)、规划师(模板创建)、管理员(审核上架)三种角色全覆盖;微信支付作为外部系统调用 |
| 5 |
数据实体 |
✅ 完整 |
task_template_packages、task_template_items、package_orders、task_plan_instances、task_plan_items五张表均在图中映射 |
| 6 |
一致性 |
✅ 与代码一致 |
所有端点路径与实际Controller中的@PostMapping匹配,Service方法名与源码一致 |