vr-shopxo-plugin/docs/PHASE2_PLAN.md

4.8 KiB
Raw Permalink Blame History

Phase 2 — 计划与当前状态

版本v1.0 | 日期2026-04-20 | 状态:执行中 关联提交7bd896764


一、Phase 2 完成情况

已完成

任务 文件 说明
Goods.php 改法 app/index/controller/Goods.php item_type=ticket → ticket_detail.html + 数据注入
GetGoodsViewData() SeatSkuService.php 为前端模板提供座位图+场次数据
onOrderPaid() 修复 TicketService.php sxo_order_detail + JSON spec 解析
模板渲染调研 docs/14_TEMPLATE_RENDER_INVESTIGATION.md 已修正,记录完整调查过程

⚠️ 待验证(容器内)

任务 优先级 说明
{include} 标签实测 P0 ticket_detail.html 中 {include file="public/head"} 是否能正确解析
ModuleInclude 备选方案 P1 {include} 失败,切换 ModuleInclude()
loadSoldSeats() P1 查询已售座位,前端座位图需显示已售状态

未开始

任务 说明
vr_ticket Hook.php 钩子补充 缺失 plugins_service_goods_spec_data 处理
后台座位模板管理 admin/controller/SeatTemplate.php已生成未调试
后台电子票列表 admin/controller/Ticket.php已生成未调试
后台核销员管理 admin/controller/Verifier.php已生成未调试
后台核销记录 admin/controller/Verification.php已生成未调试
核销 API B 端扫码核销 REST 接口

二、模板渲染问题现状

问题

票务商品详情页 ThinkTemplate 标签未解析({$...} / {include} / {if} 以原文输出)。

根因

Goods.php 原来用 MyView() 加载主题模板,票务商品需要加载插件独立模板 ticket_detail.html

解决路径Goods.php 绝对路径方案)

Goods::Index()
  → $goods['item_type'] === 'ticket'
  → SeatSkuService::GetGoodsViewData($goods_id)
  → MyViewAssign([vr_seat_template, goods_spec_data])
  → View::fetch($tplFile) [$tplFile = 绝对路径]
  → ThinkTemplate 渲染 ticket_detail.html含 {include} 标签)

待实测项(容器内操作)

# 在 shopxo-php 容器内
docker exec -it shopxo-php bash
cd /var/www/html
curl "http://localhost:10000/?s=goods/index/id/118.html"

# 检查:
# 1. {include file="public/head"} 是否被解析为 HTML 内容
# 2. {$goods.title} 是否显示商品标题
# 3. 座位图是否正常渲染

失败备选

{include} 标签失败,修改 ticket_detail.html

<!-- 替换 -->
{include file="public/head" /}
<!-- 改为 -->
<?php echo ModuleInclude('public/head'); ?>

三、Phase 2 接下来的工作

Step 1模板渲染实测容器内

操作人: 大头(容器在本机)

docker ps | grep shopxo-php   # 确认容器运行中
curl -s "http://localhost:10000/?s=goods/index/id/118.html" | head -50

成功标准: HTML 源码中不再有 ThinkTemplate 标签({include} / {$ / {if}),座位图 div 正常显示。

Step 2座位图已售状态

SeatSkuService 需要补充 loadSoldSeats() 方法,查询 vr_tickets 表中该商品+场次已生成的票,返回已售座位 ID 列表,前端据此灰化已售座位。

Step 3后台管理页面联调

4 个后台控制器SeatTemplate / Ticket / Verifier / Verification均已生成需要

  1. 确认路由可访问(后台 URL 格式)
  2. 验证 CRUD 操作正常
  3. 确认 RLS 策略

Step 4核销 API

POST /api/vr_ticket/verify — B 端小程序扫码调用。


四、数据库表结构(当前)

表名 用途 状态
vrt_vr_seat_templates 座位模板
vrt_vr_tickets 电子票
vrt_vr_verifiers 核销员
vrt_vr_verifications 核销记录
vrt_vr_audit_log 审计日志
goods.vr_goods_config 商品配置JSON
sxo_order_detail 订单明细ShopXO

五、已知风险

风险 影响 缓解
{include} 标签容器内解析失败 P0页面无样式 切换 ModuleInclude 方案
shopxo-php 容器未启动 无法验证 每次操作前 docker ps 确认
Admin 控制器鉴权链不完整 后台无法访问 确认继承 Common 并调用 IsLogin/IsPower
座位模板与商品分类绑定逻辑 需确认 1:N 还是 1:1 实测验证

六、决策点(待大头确认)

  1. 模板 include 方案:先试 {include},失败后换 ModuleInclude(),还是直接内联 CSS/JS
  2. loadSoldSeats():是否需要实时查库,还是前端纯靠 JS 状态管理?
  3. 后台前端框架Layui 是否继续使用,还是改用其他方案?