147 lines
4.8 KiB
Markdown
147 lines
4.8 KiB
Markdown
|
|
# 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} 标签)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 待实测项(容器内操作)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 在 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`:
|
|||
|
|
```php
|
|||
|
|
<!-- 替换 -->
|
|||
|
|
{include file="public/head" /}
|
|||
|
|
<!-- 改为 -->
|
|||
|
|
<?php echo ModuleInclude('public/head'); ?>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、Phase 2 接下来的工作
|
|||
|
|
|
|||
|
|
### Step 1:模板渲染实测(容器内)
|
|||
|
|
|
|||
|
|
**操作人:** 大头(容器在本机)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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 是否继续使用,还是改用其他方案?
|