diff --git a/plan.md b/plan.md index 3a3d8f8..125d12f 100644 --- a/plan.md +++ b/plan.md @@ -1,50 +1,109 @@ -# vr-shopxo-plugin 编辑器方案调研 — plan.md +# vr-shopxo-plugin Phase 2 Bugfix — plan.md -> 版本:v1.1(Round 2 更新)| 日期:2026-04-15 | Agent:council/FrontendDev + BackendArchitect -> 背景:ShopXO 票务插件后台编辑器设计方案调研(Q1 JSON 编辑器复杂度评估 + ShopXO DIY 组件参考) +> 版本:v1.0 | 日期:2026-04-16 | Agent:council/FrontendDev +> 背景:Phase 2 后台管理两个致命问题 — 侧栏乱码 + 路由无法渲染 --- -## 任务背景 +## 问题总览 -vr-shopxo-plugin 是 ShopXO 票务插件,需要调研后台编辑器设计方案。 - -**已知 seat_map JSON 结构**: -```json -{ - "map": ["AAAAAA", "BBBBBB", "CCCCCC"], - "seats": { "A": { "price": 899, "color": "#e74c3c", "label": "VIP区" }, ... }, - "row_labels": ["A", "B", "C"], - "sections": [{ "name": "VIP区", "color": "..." }, ...] -} -``` -venue 字段完全不存在(硬编码 "国家体育馆")。 - -**引入"场馆"后的嵌套层级**: -``` -venue(name/address/image) - └── seat_map(map/seats/row_labels/sections/zones) -``` +| # | 问题 | 症状 | 优先级 | +|---|------|------|--------| +| **P1** | 插件控制器路由无法渲染 | 内容区空白,"template not exists" | 高 | +| **P2** | 侧边栏插件名乱码 | `VR票务`(应为 `VR票务`) | 中 | --- -## 核心问题 +## P1 — 路由无法渲染问题 -| # | 问题 | 负责 | -|---|------|------| -| **Q1** | JSON 编辑器复杂度评估:ShopXO 是否有现成组件?4 层嵌套 Vue3 编辑器实现成本?JSON vs 拆表方案成本对比? | FrontendDev | -| **Q2** | 商品发布页替换方案(替换页面)可行性:`plugins_view_admin_goods_save` 能否完全替换表单? | BackendArchitect | +### 已知现象 +- 访问 `adminwatekc.php?s=VrTicket/SeatTemplateList` → 侧栏正常,主内容区空白 +- ShopXO `Plugins/Index` 控制器调用插件时有 `strtolower+ucfirst` 类名匹配问题 +- 当前 `SeatTemplate.php` 在 `admin/controller/` 子目录 + +### 已知正确模式(freightfee/answers) +``` +app/plugins/{plugin}/ +├── Admin.php ← 直接在插件根目录,继承 think\Controller +├── Hook.php +├── config.json +└── admin/view/... ← 视图在 admin/view/ 子目录 +``` + +### 当前 vr_ticket 结构(有问题) +``` +app/plugins/vr_ticket/ +├── admin/controller/SeatTemplate.php ← ❌ 在子目录 +└── admin/view/seat_template/list.html +``` + +### 任务清单 + +- [ ] **P1-T1**: 验证 `strtolower+ucfirst` 路由匹配机制 + - 检查 `app/plugins/Plugins.php` 中 Index 控制器如何拼装类名 + - 确认是否只匹配 `app/plugins/{plugin}/Admin.php`(根目录) +- [ ] **P1-T2**: 对比 Admin.php 根目录模式 vs 当前 admin/controller/ 子目录模式 + - 分析 ShopXO Plugins/Index 源码 + - 确认 `strtolower+ucfirst` 匹配规则 +- [ ] **P1-T3**: 实施修复 — 新建 Admin.php 到插件根目录(参考 freightfee) + - 重构 SeatTemplate/Ticket/Verification/Verifier 控制器到根目录 Admin.php + - 确认继承 `think\Controller` + - 参考 freightfee/answers/Admin.php 实现 +- [ ] **P1-T4**: 验证修复后路由 `adminwatekc.php?s=VrTicket/SeatTemplateList` 能否正常渲染 --- -## 任务清单 +## P2 — 侧栏插件名乱码问题 -- [x] **Q1.1**: 调研 ShopXO 后台是否有现成 JSON 编辑器组件(ShopXO DIY 组件) `[Done: FrontendDev]` — 商业闭源,无公开源码,仅预构建 SPA,无 JSON 编辑能力 -- [x] **Q1.2**: 评估 Vue3 表单可视化编辑器复杂度(代码量/工时) `[Done: FrontendDev]` — 嵌套深度3层(非4层),表单编辑器~500行/1-1.5人天 -- [x] **Q1.3**: JSON 编辑器 vs 拆表方案开发和维护成本对比 `[Done: FrontendDev]` — JSON单表成本低50%+,拆表仅座位万级+时值得 -- [x] **Q2**: 商品发布页替换方案可行性(BackendArchitect 并行调研) `[Done: BackendArchitect]` ✅ - - **结论**:钩子仅注入非替换;Save()支持标准POST;推荐钩子注入+JSON编辑器 -- [x] **Final**: 输出 `council-output/EDITOR_RESEARCH.md` 并给出明确推荐 `[Done: FrontendDev]` ✅ — Q1+Q2 完成,推荐:钩子注入+表单可视化编辑器 +### 已知现象 +- 侧栏显示:`VR票务`(应为 `VR票务`) +- 这是 UTF-8 字符串被当作 Latin1/ISO-8859-1 解码的结果 +- 乱码规律:`票` (E7 A5 8A) → Latin1 解码为 `票务` + +### 乱码根因假设 +| 假设 | 可能性 | 验证方式 | +|------|--------|----------| +| 数据库 `vrt_power` 表 name 字段 latin1 编码存储 | 高 | 检查 MySQL `SHOW CREATE TABLE vrt_power` | +| 数据库连接 charset 不匹配 | 中 | 检查 ShopXO 数据库配置 charset | +| plugin.json 编码问题 | 低 | 检查 plugin.json 文件实际编码 | +| PHP 视图模板文件编码 | 低 | 检查 header.html/china.html 等 | + +### 任务清单 + +- [ ] **P2-T1**: 确认乱码根因 — 检查 vrt_power 表结构 + - `SHOW CREATE TABLE vrt_power` + - `SHOW FULL COLUMNS FROM vrt_power` + - 确认 name 字段 charset 和 collate +- [ ] **P2-T2**: 如果是数据库 latin1 问题 — 修复方案 + - 方案A:ALTER TABLE 转换 latin1 → utf8mb4 + - 方案B:MySQL CONVERT/CAST 函数读取时转换 + - 方案C:PHP 层以 latin1 读出再转 utf8 +- [ ] **P2-T3**: 如果是 plugin.json 问题 — 验证文件编码 + - `file --mime plugin.json` + - 确认文件是 UTF-8 无 BOM + +--- + +## 视图路径问题 + +### 问题描述 +- 插件视图用 `../../../plugins/view/{plugin}/admin/xxx` 相对路径 +- 在 Docker 容器内无法 resolve(绝对路径问题) + +### 任务清单 + +- [ ] **P3-T1**: 确认 ShopXO 官方推荐的插件视图路径写法 + - 查找 ShopXO Plugins/Index 中 view() 方法如何拼接路径 + - 检查 freightfee 的 Admin.php 如何 return View() +- [ ] **P3-T2**: 确认 vr_ticket 视图路径在修复 Admin.php 后是否正确 + +--- + +## GitHub 参考插件 + +- [ ] **REF-T1**: 推荐 2-3 个有后台管理界面的 ShopXO 插件(GitHub 搜索) + - 关键词:`shopxo plugin admin` site:github.com + - 优先选:有完整 admin/view/ 和 Admin.php 的插件 --- @@ -52,56 +111,37 @@ venue(name/address/image) | 阶段 | 内容 | 负责 | |------|------|------| -| **Round 1(规划)** | 各自创建 plan.md | 所有成员 | -| **Round 2(执行)** | 深入调研 + 代码级确认 | FrontendDev + BackendArchitect | -| **Round 3(综合)** | 输出 EDITOR_RESEARCH.md + 最终推荐 | FrontendDev | +| **Round 1(规划)** | 分析根因,制定修复方案 | FrontendDev | +| **Round 2(执行)** | 实施修复,截图验证 | FrontendDev | +| **Round 3(综合)** | 合并到 main,完整验证 | 所有成员 | --- ## 依赖关系 -- Q2(BackendArchitect)先完成,后端替换可行性影响前端方案选择 -- Q1.1 调研 ShopXO DIY 组件是 Q1.2 的前置 +- P1-T1 必须先完成(P1-T3 依赖 T1/T2 的结论) +- P2-T1 必须先完成(确认根因后才能选修复方案) +- P3-T1 依赖 P1-T3(等 Admin.php 重构后再验证视图路径) --- -## 调研路径 +## 交付物 -### Q1 调研路径(FrontendDev) +1. `council-output/PHASE2_BUGFIX.md` — 根因分析报告 +2. 修复后的 `shopxo/app/plugins/vr_ticket/Admin.php` +3. 修复后的控制器和视图路径 +4. 修复后的乱码问题(数据库层或配置层) -1. 检查 `shopxo/` 目录中是否存在 DIY JSON 编辑器组件 - - `static/diy/js/entry/index-*.js` — Vue3 SPA 组件 - - `custom` 组件类型参考 -2. 如果无现成组件,评估 Vue3 + JSON Schema form 实现方案 -3. 对比 JSON 单表 vs 拆多表方案的开发和维护成本 +## 状态 -### Q2 调研路径(BackendArchitect) - -1. 检查 `app/admin/controller/Goods.php` 中 SaveInfo() 和 Save() 方法 -2. 确认 `plugins_view_admin_goods_save` 钩子调用位置和可替换性 -3. 验证替换后数据能否正常保存 - ---- - -## BackendArchitect Round 2 深入分析(Q2) - -详细分析见 `council-output/EDITOR_RESEARCH.md`(Q2 部分)。 - -**核心结论**: -1. `plugins_view_admin_goods_save` 在 `SaveInfo()` 中位于模板渲染**之前**被调用,结果注入 `$assign['plugins_view_admin_goods_save_data']` -2. 钩子仅是**注入点**,不是**替换点**——注入位置在 base tab 的 `
` 内,form/tabs/核心字段无法被替换 -3. 完全替换需覆盖核心 `saveinfo.html`,失去 ShopXO 升级兼容性 -4. `Goods::Save()` 数据源是标准 `$_POST`(`$this->data_request`),任何自定义表单都能提交 -5. `plugins_service_goods_save_handle` 钩子以引用接收 `$data`,插件可修改或阻止保存流程 - -**推荐**:钩子注入(注入 ticket 专属表单 + JSON Schema 编辑器)+ 两条数据保存路径(填最小字段走标准流,或自行处理返回) - - - -| 任务 | 状态 | -|------|------| -| Q1.1 | [Done: FrontendDev] | -| Q1.2 | [Done: FrontendDev] | -| Q1.3 | [Done: FrontendDev] | -| Q2 | [Done: BackendArchitect] | -| Final Output | [Done: FrontendDev] — Q1+Q2 complete, final recommendation added | +| 任务 | 状态 | 备注 | +|------|------|------| +| P1-T1 | [Pending] | 需检查 Plugins.php 源码 | +| P1-T2 | [Pending] | 对比模式分析 | +| P1-T3 | [Pending] | 实施修复 | +| P1-T4 | [Pending] | 截图验证 | +| P2-T1 | [Pending] | 数据库编码确认 | +| P2-T2 | [Pending] | 数据库修复(如需要) | +| P2-T3 | [Pending] | plugin.json 验证(如需要) | +| P3-T1 | [Pending] | 视图路径机制分析 | +| REF-T1 | [Pending] | GitHub 参考插件 |