# VR票务插件 - vr_ticket > ⚡ 核心原则:怎么快怎么来,怎么方便怎么来 ## 安装 1. 将本目录上传到 ShopXO 插件目录: ```bash cp -r vr_ticket /path/to/shopxo/app/plugins/ ``` 2. 后台 → 应用中心 → 插件管理 → 找到「VR票务」→ 点击安装 3. 数据库表自动创建 ## 目录结构 ``` vr_ticket/ ├── plugin.json # 插件配置(名称、菜单、钩子) ├── EventListener.php # 安装/卸载/升级生命周期 ├── service/ │ ├── BaseService.php # 基础工具(AES加密、QR生成) │ └── TicketService.php # 核心票务逻辑(发票、核销) ├── admin/ │ ├── controller/ │ │ ├── SeatTemplate.php # 座位模板 CRUD │ │ ├── Ticket.php # 电子票管理 │ │ ├── Verifier.php # 核销员管理 │ │ └── Verification.php # 核销记录 │ └── view/ # 后台视图模板 │ ├── seat_template/ │ ├── ticket/ │ ├── verifier/ │ └── verification/ └── view/ └── goods/ └── ticket_detail.html # 前端票务详情页(独立模板) ``` ## 关键钩子 | 钩子 | 作用 | |------|------| | `plugins_service_order_pay_success_handle_end` | 支付成功 → 自动发放 QR 电子票 | | `plugins_service_order_delete_success` | 订单删除 → 清理票务数据 | ## 前端票务详情页 需要在 ShopXO 核心文件 `app/index/controller/Goods.php` 中加 1 行: ```php // 在 return MyView(); 之前(约第 440 行) if (!empty($assign['goods']['item_type']) && $assign['goods']['item_type'] == 'ticket') { return MyView('/../../../plugins/vr_ticket/view/goods/ticket_detail'); } ``` 详见 `docs/GOODS_PHP_MODIFICATION.md` ## 数据库表 | 表名 | 用途 | |------|------| | `vrt_vr_seat_templates` | 座位模板(绑定分类) | | `vrt_vr_tickets` | 电子票(含观演人) | | `vrt_vr_verifiers` | 核销员 | | `vrt_vr_verifications` | 核销记录 | ## API | URL | 方法 | 作用 | |-----|------|------| | `/plugins/vr_ticket/admin/seat_template/list` | GET | 座位模板列表 | | `/plugins/vr_ticket/admin/seat_template/save` | GET/POST | 添加/编辑模板 | | `/plugins/vr_ticket/admin/ticket/list` | GET | 电子票列表 | | `/plugins/vr_ticket/admin/verification/list` | GET | 核销记录 |