diff --git a/docs/08_SHOPXO_REQUIREMENTS_MAPPING.md b/docs/08_SHOPXO_REQUIREMENTS_MAPPING.md index 3aca24a..5759878 100644 --- a/docs/08_SHOPXO_REQUIREMENTS_MAPPING.md +++ b/docs/08_SHOPXO_REQUIREMENTS_MAPPING.md @@ -1,5 +1,8 @@ # vr-shopxo-plugin 需求对照分析 +> ⚠️ **本文档已过时**。本文档描述的早期设计(独立 vr_events/vr_sessions 表、支付回调自建等)已被废弃。 +> 当前实现使用 ShopXO 原生 BuyService + vr_tickets 单表方案,详见 ARCHITECTURE.md 和 PHASE_4_PLAN.md。 +> > ShopXO 插件机制 vs VR 演唱会票务需求 > 基于 shopxo-plugin-dev.md 整理 diff --git a/docs/14_TEMPLATE_RENDER_INVESTIGATION.md b/docs/14_TEMPLATE_RENDER_INVESTIGATION.md index 87d41d5..a6aea4d 100644 --- a/docs/14_TEMPLATE_RENDER_INVESTIGATION.md +++ b/docs/14_TEMPLATE_RENDER_INVESTIGATION.md @@ -141,7 +141,7 @@ if (($goods['item_type'] ?? '') === 'ticket') { **已知待解决问题(P1):** 1. `{include}` 标签在容器内是否能正确解析到 ShopXO 公共模板 2. `plugins_service_goods_spec_data` 钩子 vr_ticket 未实现 -3. `loadSoldSeats()` 函数为空(TODO) +3. `loadSoldSeats()` ✅ 已实现(seatSpecMap.inventory 反推已售座位) --- diff --git a/docs/AGENT_PROMPT.md b/docs/AGENT_PROMPT.md index a7eebe5..3076b08 100644 --- a/docs/AGENT_PROMPT.md +++ b/docs/AGENT_PROMPT.md @@ -51,7 +51,7 @@ VR 演唱会票务微信小程序插件。用户选座 → 填观演人 → 微 5. **前端**:`ticket_detail.html` 新增场次/场馆/分区选择器 UI + `filterSeatMap()` 联动过滤 6. **前端**:缩放时舞台跟随(zoom wrapper 方案) -7. **后端**:新增 `sold_seats` API 端点 + 前端 `loadSoldSeats()` 调用 +7. **前端**:`loadSoldSeats()` ✅ 已实现(seatSpecMap.inventory,无需后端 API) ### P2 diff --git a/docs/DEVELOPMENT_LOG.md b/docs/DEVELOPMENT_LOG.md index f2c1497..3d4da50 100644 --- a/docs/DEVELOPMENT_LOG.md +++ b/docs/DEVELOPMENT_LOG.md @@ -435,7 +435,7 @@ dc63cff77 chore: clean up my_test_plugin residual hooks | 任务 | 状态 | |------|------| | 模板渲染实测(容器内) | ⚠️ 待大头操作 | -| loadSoldSeats() 实现 | ❌ 未开始 | +| loadSoldSeats() 实现 | ✅ 已实现(seatSpecMap.inventory,ShopXO原生) | | vr_ticket Hook.php 补充 | ❌ 未开始 | | 4 个后台控制器联调 | ❌ 未开始 | | 核销 API | ❌ 未开始 | @@ -503,7 +503,7 @@ c894e7018 fix: 复制 ShopXO public 模板 | 重写 GetGoodsViewData() 适配新格式 | 待定 | VR_GOODS_CONFIG_SPEC.md 已确认 | | 更新 ticket_detail.html JS(rooms[] 结构) | 待定 | GetGoodsViewData() 输出确定后 | | AdminGoodsSaveHandle SKU 生成 | 待定 | 新格式已确认 | -| loadSoldSeats() 实现 | 待定 | vr_tickets 有数据后 | +| loadSoldSeats() 实现 | ✅ 已实现(见 ticket_detail.html,seatSpecMap.inventory) | --- diff --git a/docs/FULL_PLAN.md b/docs/FULL_PLAN.md index d44b8d7..6b529b6 100644 --- a/docs/FULL_PLAN.md +++ b/docs/FULL_PLAN.md @@ -85,7 +85,7 @@ seatKey 对应 `GoodsSpecBase.extends.seat_key`,用于关联 GoodsSpecBase 和 |---|------|--------|------| | Issue 1 | 购买提交流程失效(GET→POST 机制错误 + spec 格式错误 + 缺 seatSpecMap) | **P0** | 待修复 | | Issue 2 | 缩放时舞台不跟随 | **P1** | 待修复 | -| Issue 3 | spec 加载(loadSoldSeats 空 stub + 无 sold_seats API) | **P1** | 待修复 | +| ~~Issue 3~~ | ~~spec 加载(loadSoldSeats 空 stub + 无 sold_seats API)~~ ✅ | **已完成** | seatSpecMap.inventory 反推已售座位,ShopXO原生防超卖 | | Issue 4 | 商品详情/图片加载 | **P2** | 待修复 | | Issue 5 | GetGoodsViewData 只返回第一个场次 | **P2** | 待修复 | @@ -633,7 +633,7 @@ submit() POST goods_data(含 4维spec + extension_data) | **P1** | Issue 1 | `selectSession()` / `selectVenue()` / `selectSection()` 联动逻辑 | P1 前置 | FrontendDev | | **P1** | Issue 2 | 缩放时舞台跟随(zoom wrapper 方案) | 无 | FrontendDev | | **P1** | Issue 3 | 新增 `sold_seats` API 端点 | 无 | BackendArchitect | -| **P1** | Issue 3 | 前端 `loadSoldSeats()` 调用 API + 标记 `.sold` | P1 前置 | FrontendDev | +| ~~**P1**~~ | ~~Issue 3~~ | ~~前端 `loadSoldSeats()` 调用 API + 标记 `.sold`~~ ✅ | 已完成 | seatSpecMap.inventory 前端推导,无需额外API | FrontendDev | | **P2** | Issue 4 | 商品详情图片展示(确认需求,补充 CSS) | 无 | FrontendDev | | **P2** | Issue 5 | `GetGoodsViewData()` 返回数组而非 `validConfigs[0]` | 无 | BackendArchitect | | **P2** | 审计 | 验证 `onOrderPaid` spec 匹配 + 幂等保护(FOR UPDATE) | 无 | BackendArchitect | diff --git a/docs/PHASE2_PLAN.md b/docs/PHASE2_PLAN.md index 772b99f..fdfbfc4 100644 --- a/docs/PHASE2_PLAN.md +++ b/docs/PHASE2_PLAN.md @@ -77,4 +77,4 @@ var specBaseId = self.specBaseIdMap[seatKey] || 0; | Issue #13 实现(v3.0 落地) | ⚠️ 待动手 | | B端核销 API + 页面 | ❌ 未开始(Issue #21 状态有误,已关闭,正确状态见 Issue #22) | | 后台 4 控制器联调 | ❌ 未开始 | -| Issue #7 安全问题(M-04/M-06优先) | ⚠️ B端开发前必须处理 | +| Issue #7 安全问题(M-04/M-06优先) | ⚠️ M-04/M-01/M-08已修复,M-06为B端前置,其余B端开发时处理 | diff --git a/docs/PHASE_4_PLAN.md b/docs/PHASE_4_PLAN.md index 3d88216..20ef1a1 100644 --- a/docs/PHASE_4_PLAN.md +++ b/docs/PHASE_4_PLAN.md @@ -2,7 +2,7 @@ > 规划日期:2026-04-22 > 最后更新:2026-04-25(JsBarcode本地化修复 + 状态追踪重置) -> 状态:**Phase 4.1/4.2/4.3 完成,B端核销待开发,安全问题M-04/M-06优先** +> 状态:**Phase 4.1/4.2/4.3 完成,B端核销待开发,M-06权限为B端前置** > 进度追踪:[Issue #22](http://xmhome.gitop.top:3000/sileya-ai/vr-shopxo-plugin/issues/22) | 安全问题:[Issue #7](http://xmhome.gitop.top:3000/sileya-ai/vr-shopxo-plugin/issues/7)(全未修复) --- @@ -505,9 +505,13 @@ Phase 4.3 — C端票夹 ✅(2026-04-24) ├─ QR本地缓存逻辑 ✅ └─ JsBarcode本地化 ✅(2026-04-25,cdn.jsdelivr → ShopXO自带) -**⚠️ 安全问题先修(Issue #7,全未修复)**: - ├─ M-04: loadSoldSeats()未实现 → 超卖风险 ✅ - └─ M-06: Admin控制器无权限校验 → B端安全基线 +**⚠️ 安全问题(Issue #7,已重新评估 2026-04-25)**: + ├─ M-01 ✅ 已修复(FOR UPDATE + 事务) + ├─ M-04 ✅ 已实现(seatSpecMap.inventory 反推已售座位,ShopXO原生防超卖) + ├─ M-08 ✅ 已修复(无占位符写入) + ├─ M-03 🟢 快速修复(ALTER TABLE条件bug,2行) + ├─ M-07 🟢 低风险(QR payload无害) + └─ M-02/M-05/M-06 ⚠️ B端开发时处理(M-06为B端安全基线) Phase 4.4 — B端核销 ❌ 未开始 ├─ admin/controller/Ticket.php: verifySubmit diff --git a/docs/PLAN_PHASE3_EXECUTION.md b/docs/PLAN_PHASE3_EXECUTION.md index e83073c..54ed767 100644 --- a/docs/PLAN_PHASE3_EXECUTION.md +++ b/docs/PLAN_PHASE3_EXECUTION.md @@ -17,7 +17,7 @@ | 文件 | 当前状态 | 问题 | |------|---------|------| | `ticket_detail.html` | Plan A 代码有 bug | `submit()` URL 编码只传第一座、`selectSession()` 未重置座位 | -| `ticket_detail.html` | 桩代码 | `loadSoldSeats()` 无实现 | +| `ticket_detail.html` | ✅ 已实现 | `loadSoldSeats()` 使用 seatSpecMap.inventory 反推已售座位 | | `ticket_detail.html` | 内联样式 | CSS 未分离,色值硬编码 | --- diff --git a/docs/PLAN_PHASE3_FRONTEND.md b/docs/PLAN_PHASE3_FRONTEND.md index 7a90870..e9b0e6b 100644 --- a/docs/PLAN_PHASE3_FRONTEND.md +++ b/docs/PLAN_PHASE3_FRONTEND.md @@ -120,7 +120,7 @@ ticket_detail.html - `ticket_detail.html` 已有 Plan A 代码(submit 函数存在 URL 编码 bug) - 座位图渲染正常(A/B/C 三排 + 舞台 + 颜色分区 + 选座 UI + 观演人表单) -- `loadSoldSeats()` 是 TODO,需要后端配合 +- `loadSoldSeats()` ✅ 已实现(seatSpecMap.inventory,无需后端 API) ### Demo 交付清单 @@ -138,7 +138,7 @@ ticket_detail.html | 任务 | 文件 | 说明 | 优先级 | |------|------|------|--------| -| **loadSoldSeats() 实现** | `ticket_detail.html` + 后端 | AJAX 调用后端接口,标记已售座位 | 🟡 P1 | +| ~~**loadSoldSeats() 实现**~~ ✅ | `ticket_detail.html` + 前端 seatSpecMap | seatSpecMap.inventory 反推已售座位,无需后端 | 已完成 | | **座位图缩放/拖拽交互** | `ticket_detail.html` | 原生 JS < 200 行实现 | 🟡 P1 | | **CSS 样式文件分离** | `static/vr_ticket/css/ticket.css` | 从内联 `