# 实施路线图 > 规划时间:2026-04-14 > 目标:基于 ShopXO 的 VR 演唱会票务 MVP --- ## 一、整体时间估算 | 阶段 | 内容 | 人天 | 可并行 | 累计 | |---|---|---|---|---| | Phase 0 | 环境搭建 + 插件骨架 | 2天 | — | 2天 | | Phase 1 | 数据库设计 + 迁移 | 2天 | ✅ Phase 0 | 2天 | | Phase 2 | 场次管理 CRUD + API | 3天 | ✅ Phase 1 | 3天 | | Phase 3 | 下单钩子 + 观演人收集 | 3天 | ✅ Phase 2 | 4天 | | Phase 4 | 支付回调 + QR 票生成 | 2天 | ✅ Phase 3 | 5天 | | Phase 5 | uni-app 票务页面 | 3天 | ✅ Phase 3 | 6天 | | Phase 6 | B 端核销页 + API | 2天 | ✅ Phase 4 | 6天 | | Phase 7 | 联调 + 测试 + 部署 | 3天 | 需串行 | 9天 | **预估**:Agent 集群并行 **1-2 周 MVP**,**3 周完整流程** --- ## 二、Phase 0 — 环境搭建 ### 目标 本地跑通 ShopXO + shopxo-uniapp 开发环境 ### 任务 1. **Docker 部署 ShopXO**(参考 `DEPLOYMENT.md`) - PHP 8.0+ / MySQL 5.7+ / nginx - 或使用虚拟主机安装包 2. **安装 shopxo-uniapp** - HBuilderX 导入项目 - 配置 `request_url` 和 `static_url` - 本地 H5 预览验证 3. **创建插件骨架** ```bash mkdir -p app/plugins/vr_ticket/ cp plugin.json app/plugins/vr_ticket/ mkdir -p app/plugins/vr_ticket/{service,view,Admin/Controller,Api/Controller} mkdir -p static/vr_ticket/ mkdir -p database/migrations/ ``` 4. **在 ShopXO 后台安装插件** - 访问 `/admin/plugins/index` - 上传插件 zip 或手动放置到 `app/plugins/vr_ticket/` - 点击安装 ### 验收 - ShopXO H5 前端正常访问 - shopxo-uniapp H5 预览正常 - 插件在后台可见 --- ## 三、Phase 1 — 数据库设计 ### 任务 创建插件迁移文件: ```sql -- database/migrations/001_create_vr_events.sql CREATE TABLE `vr_events` ( `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT, `goods_id` int UNSIGNED NOT NULL COMMENT 'ShopXO商品ID', `name` varchar(255) NOT NULL COMMENT '活动名称', `venue` varchar(255) COMMENT '场馆', `cover_image` varchar(255) COMMENT '封面图', `status` tinyint DEFAULT 1 COMMENT '状态(0禁用, 1启用)', `created_at` int UNSIGNED DEFAULT 0, `updated_at` int UNSIGNED DEFAULT 0, KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- database/migrations/002_create_vr_sessions.sql CREATE TABLE `vr_sessions` ( `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT, `event_id` int UNSIGNED NOT NULL, `session_time` datetime NOT NULL COMMENT '场次时间', `total_stock` int UNSIGNED DEFAULT 0 COMMENT '总库存', `available_stock` int UNSIGNED DEFAULT 0 COMMENT '可用库存', `price` decimal(10,2) UNSIGNED DEFAULT 0 COMMENT '票价', `status` tinyint DEFAULT 1, `created_at` int UNSIGNED DEFAULT 0, `updated_at` int UNSIGNED DEFAULT 0, KEY `event_id` (`event_id`), KEY `session_time` (`session_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- database/migrations/003_create_vr_tickets.sql CREATE TABLE `vr_tickets` ( `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT, `order_id` int UNSIGNED NOT NULL COMMENT '订单ID', `order_no` char(60) NOT NULL, `goods_id` int UNSIGNED NOT NULL, `user_id` int UNSIGNED NOT NULL, `event_id` int UNSIGNED NOT NULL, `session_id` int UNSIGNED NOT NULL, `ticket_code` char(36) NOT NULL COMMENT 'UUID票码', `qr_data` text COMMENT '加密QR内容', `seat_info` varchar(255) COMMENT '座位信息', `real_name` varchar(60) COMMENT '观演人姓名', `phone` char(15) COMMENT '手机号', `verify_status` tinyint DEFAULT 0 COMMENT '0未核销, 1已核销', `verify_time` int UNSIGNED DEFAULT 0, `verifier_id` int UNSIGNED DEFAULT 0, `issued_at` int UNSIGNED DEFAULT 0, `created_at` int UNSIGNED DEFAULT 0, `updated_at` int UNSIGNED DEFAULT 0, UNIQUE KEY `ticket_code` (`ticket_code`), KEY `order_id` (`order_id`), KEY `user_id` (`user_id`), KEY `verify_status` (`verify_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- database/migrations/004_create_vr_verifiers.sql CREATE TABLE `vr_verifiers` ( `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT, `user_id` int UNSIGNED NOT NULL COMMENT 'ShopXO用户ID', `name` varchar(60) NOT NULL, `status` tinyint DEFAULT 1, `created_at` int UNSIGNED DEFAULT 0, KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- database/migrations/005_create_vr_verifications.sql CREATE TABLE `vr_verifications` ( `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT, `ticket_id` int UNSIGNED NOT NULL, `ticket_code` char(36) NOT NULL, `verifier_id` int UNSIGNED NOT NULL, `verifier_name` varchar(60), `event_id` int UNSIGNED, `created_at` int UNSIGNED DEFAULT 0, KEY `ticket_id` (`ticket_id`), KEY `created_at` (`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ### AI 参与度 ✅ **90% AI 可生成**(妮可 agent 主导) --- ## 四、Phase 2 — 场次管理 CRUD ### 任务 1. **管理端页面**(后台) - `Admin/Controller/EventController.php` — 活动管理 - `Admin/Controller/SessionController.php` — 场次管理 - `Admin/View/event_list.html` — 活动列表 - `Admin/View/session_edit.html` — 场次编辑 2. **C 端 API** - `Api/Controller/EventController.php` — 活动详情 - `Api/Controller/SessionController.php` — 可用场次列表 ### API 设计 ``` GET /?s=admin/vrticket/event/list POST /?s=admin/vrticket/event/save DELETE /?s=admin/vrticket/event/delete GET /?s=admin/vrticket/session/list&event_id=8 POST /?s=admin/vrticket/session/save DELETE /?s=admin/vrticket/session/delete GET /?s=api/vrticket/event/detail&id=8 GET /?s=api/vrticket/session/available&goods_id=123 ``` ### AI 参与度 ✅ **85% AI 可生成**(标准 CRUD,可套模板) --- ## 五、Phase 3 — 下单钩子 + 观演人收集 ### 5.1 目标 在 ShopXO 下单流程中收集观演人信息 ### 5.2 方案 利用 ShopXO 的「订单商品扩展表单」机制(`ordergoodsform` 插件的思路): 在 `plugins_view_goods_detail_base_sku_top` 注入观演人表单: ```html