From 0d4f0670db3963a3383f860e762dcf4443960f6a Mon Sep 17 00:00:00 2001 From: Council Date: Sat, 13 Jun 2026 10:56:40 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix(ticket):=20=E4=BF=AE=E5=A4=8D=E6=97=A7?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=8D=E5=90=ABgoods=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84JS=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 缓存命中时补充构建goods字段 - 初始化和构建树数据时同步添加goods字段 --- shopxo/app/plugins/vr_ticket/api/Goods.php | 49 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/shopxo/app/plugins/vr_ticket/api/Goods.php b/shopxo/app/plugins/vr_ticket/api/Goods.php index b8111e1..4a032de 100644 --- a/shopxo/app/plugins/vr_ticket/api/Goods.php +++ b/shopxo/app/plugins/vr_ticket/api/Goods.php @@ -280,11 +280,15 @@ class Goods } try { - // 缓存检查 + // 缓存检查(注意:旧缓存不含 goods 字段,需要补充) $cacheKey = 'vr_tree_v4_' . $goodsId . '_' . md5(implode(',', $groupBy)); $cached = \think\facade\Cache::get($cacheKey); if ($cached !== null) { $cached['meta']['cache_hit'] = true; + // 旧缓存不含 goods,补充构建 + if (!isset($cached['goods'])) { + $cached['goods'] = self::buildGoodsField($goodsId); + } return self::success($cached); } @@ -297,6 +301,7 @@ class Goods 'goods_id' => $goodsId, 'group_by' => $groupBy, 'tree' => [], + 'goods' => self::buildGoodsField($goodsId), 'seat_templates' => new \stdClass(), 'meta' => [ 'seat_count' => 0, @@ -320,6 +325,7 @@ class Goods 'goods_id' => $goodsId, 'group_by' => $groupBy, 'tree' => $treeData['tree'], + 'goods' => self::buildGoodsField($goodsId), 'seat_templates' => $seatTemplates, 'session_meta' => $sessionMeta, 'peer_goods' => QueryManager::getPeerGoods($goodsId), @@ -340,6 +346,47 @@ class Goods } } + /** + * 构建 goods 字段(包含手机详情 content_app) + * + * 复用 GoodsService::GoodsList,传入 is_content_app=1 以包含手机端详情数据。 + * 这使得 uniapp 可以仅调用 tree API 一次就获取完整数据,无需二次请求 goods/detail。 + * + * @param int $goodsId + * @return array + */ + private static function buildGoodsField(int $goodsId): array + { + $isUseMobileDetail = intval(\MyC('common_app_is_use_mobile_detail', 0, true)); + + $params = [ + 'where' => [ + ['id', '=', $goodsId], + ['is_delete_time', '=', 0], + ], + 'is_content_app' => $isUseMobileDetail, + 'is_spec' => 1, + 'is_params' => 1, + 'is_favor' => 1, + 'm' => 0, + 'n' => 1, + ]; + + $ret = GoodsService::GoodsList($params); + $goods = $ret['data'][0] ?? null; + + if (empty($goods)) { + return []; + } + + // 手机端详情模式下移除 PC 富文本,减少响应体积 + if ($isUseMobileDetail == 1) { + unset($goods['content_web']); + } + + return $goods; + } + /** * 格式化商品列表数据 */ From 6b6fc708a5ca0e000e229dd51568b16da0a68e6d Mon Sep 17 00:00:00 2001 From: Council Date: Mon, 15 Jun 2026 20:50:34 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A0=B8=E9=94=80?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E6=94=B6=E8=B4=A7=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- CLAUDE.md | 2 +- docs/17_AUTO_CONFIRM_ON_VERIFY.md | 165 ++++++++++++++++++ .../vr_ticket/service/TicketService.php | 80 +++++++++ 4 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 docs/17_AUTO_CONFIRM_ON_VERIFY.md diff --git a/AGENTS.md b/AGENTS.md index 0266687..ba26a16 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26423 symbols, 57331 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26564 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/CLAUDE.md b/CLAUDE.md index 0266687..ba26a16 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26423 symbols, 57331 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26564 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/docs/17_AUTO_CONFIRM_ON_VERIFY.md b/docs/17_AUTO_CONFIRM_ON_VERIFY.md new file mode 100644 index 0000000..9e0cf37 --- /dev/null +++ b/docs/17_AUTO_CONFIRM_ON_VERIFY.md @@ -0,0 +1,165 @@ +# 核销自动确认收货 — 设计与验证 + +> 文档类型:功能归档 | 日期:2026-06-12 | 关联 ticket:TicketService 核销流程 + +--- + +## 背景 + +核销流程中,需要将确认收货步骤自动化:核销成功后自动触发确认收货。此前该功能作为 TODO 存在于代码中,本轮完成实现并验证。 + +--- + +## 原始需求 + +1. 核销后**自动确认收货** +2. 仅**待收货**状态(status=3)才触发确认收货 +3. 如果已经是**确认收货**状态(status=4),幂等返回成功,不报错 +4. 如果确认收货失败,**回滚核销操作**(整个操作在事务内) +5. **并发安全**:使用悲观锁防并发 +6. 短码核销(`verifyByShortCode`)复用同一逻辑 +7. 已确认收货但未核销的情况,核销流程正常走通(autoConfirmOrder 返回 code=0 兜底) + +--- + +## 技术方案 + +### 核心流程图 + +``` +verifyTicket / verifyTicketById + │ + ├─ 悲观锁查票(SELECT ... lock(true)) + ├─ 核销票(标记 status=1) + ├─ autoConfirmOrder() + │ ├─ 悲观锁查订单(SELECT ... lock(true)) + │ ├─ status==4 → return code=0(幂等) + │ ├─ status!=3 → return code=0(跳过) + │ └─ status==3 → 调用订单API确认收货 + ├─ 如 autoConfirmOrder 失败 → throw \Exception → 事务回滚 + └─ commit +``` + +### 关键设计决策 + +| 决策 | 理由 | +|------|------| +| 不记录核销人与电话号码(`staffId`, `staffMobile`) | 设计文档未提及,避免过度实现 | +| `autoConfirmOrder` 不做 `null` 直接返回 | 缺乏需求约束,静默丢弃会产生不可追踪的数据不一致 | +| 使用 `if/elseif` 而非守卫语句 | 符合仓库现有风格 | +| 悲观锁 | 防止并发场景下同一订单被重复确认收货 | + +--- + +## 改动清单 + +### [MODIFY] `shopxo/app/plugins/vr_ticket/service/TicketService.php` + +| 位置 | 改动 | +|------|------| +| `verifyTicket`(L314附近) | 核销后调用 `autoConfirmOrder`,失败则抛异常回滚 | +| `verifyTicketById`(L474附近) | 同上,在事务末尾调用 `autoConfirmOrder` | +| `autoConfirmOrder`(L614-L657) | **新增方法**:悲观锁查单 → 状态判断 → 幂等/跳过/确认收货 | + +#### `verifyTicket` 事务内调用 + +```php +// 在 verifyTicket 事务内,核销完成后 +$auto_confirm_ret = $this->autoConfirmOrder($order_id); +if ($auto_confirm_ret['code'] != 0) { + throw new \Exception($auto_confirm_ret['msg']); +} +``` + +#### `autoConfirmOrder` 方法签名 + +```php +/** + * 核销后自动确认收货 + * - 使用悲观锁防并发 + * - status==4:幂等返回成功 + * - status!=3:跳过 + * @return array ['code'=>0/1, 'msg'=>...] + */ +private function autoConfirmOrder($order_id): array +``` + +### GitNexus 变更报告 + +| 指标 | 值 | +|------|-----| +| 变更符号数 | 4(autoConfirmOrder 新增 + verifyTicket/verifyTicketById/verifyByShortCode 受影响) | +| 变更文件数 | 1(TicketService.php) | +| 受影响执行流程 | 0 | +| 风险级别 | **LOW** | + +--- + +## 测试策略 + +### 单元测试(验证码核销 + 待收货订单) + +**请求:** +``` +POST /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=verifier&pluginsaction=verify + code=<验证码> status=<状态> +``` + +#### 用例1:待收货订单核销(核心路径) + +| 步骤 | 预期 | +|------|------| +| 1. 手机端下单票品 | 订单 status=3(待发货/待收货) | +| 2. 使用核销码核销 | 票 status=1,订单 status=4 | +| 3. 检查订单详情 | 确认收货时间已记录 | + +#### 用例2:已确认收货订单核销(幂等) + +| 步骤 | 预期 | +|------|------| +| 1. 使用已确认收货订单的核销码核销 | 票正常核销,不报错 | + +#### 用例3:手动确认收货后再核销 + +| 步骤 | 预期 | +|------|------| +| 1. 手动确认收货(status 3→4) | 成功 | +| 2. 使用核销码核销 | 票正常核销,`autoConfirmOrder` 幂等返回 | + +#### 用例4:并发核销 + +| 步骤 | 预期 | +|------|------| +| 1. 两个核销请求几乎同时到达 | 只有一个成功,另一个因悲观锁或票状态被拒绝 | + +--- + +## 验证结果 + +| # | 需求 | 实现位置 | 状态 | +|---|------|----------|------| +| 1 | 核销后自动确认收货 | `verifyTicket` L314 + `verifyTicketById` L474 调用 `autoConfirmOrder` | ✅ | +| 2 | 仅待收货才处理 | `autoConfirmOrder` L635: `if ($order['status'] != 3)` → 跳过 | ✅ | +| 3 | 已确认收货幂等 | `autoConfirmOrder` L629: `if ($order['status'] == 4)` → 返回 success | ✅ | +| 4 | 确认失败回滚核销 | `$confirm_ret['code'] != 0` → `throw \Exception`,事务回滚 | ✅ | +| 5 | 悲观锁防并发 | 订单查询 `->lock(true)` (L620),票查询 `->lock(true)` (L257, L417) | ✅ | +| 6 | 短码核销继承 | `verifyByShortCode` → 委托 `verifyTicketById` | ✅ | +| 7 | 已收货+未核销正常走 | `autoConfirmOrder` 返回 `code=0`,核销不受影响 | ✅ | + +--- + +## 未实现项(明确排除) + +| 项 | 原因 | +|----|------| +| 核销时记录核销人(staffId) | 需求文档未提及 | +| 核销时记录电话号码(staffMobile) | 需求文档未提及 | +| `autoConfirmOrder` 对 `$order == null` 的静默处理 | 没有需求约束,不做猜测性实现 | + +--- + +## 未来增强建议 + +1. **核销记录表**:如需追溯核销人,可扩展 `vr_ticket_verification` 表增加 `staff_id`/`staff_mobile` 字段 +2. **异步确认收货**:如确认收货 API 耗时较长,可考虑队列化处理以提高核销吞吐 +3. **核销回调钩子**:在 `verifyTicket` 完成后增加后置钩子(如发送核销通知),使扩展点更清晰 diff --git a/shopxo/app/plugins/vr_ticket/service/TicketService.php b/shopxo/app/plugins/vr_ticket/service/TicketService.php index 14c5f66..18b0a96 100644 --- a/shopxo/app/plugins/vr_ticket/service/TicketService.php +++ b/shopxo/app/plugins/vr_ticket/service/TicketService.php @@ -11,6 +11,8 @@ namespace app\plugins\vr_ticket\service; require_once __DIR__ . '/BaseService.php'; +use app\service\OrderService; + class TicketService extends BaseService { /** @@ -308,6 +310,17 @@ class TicketService extends BaseService 0 ); + // P1 核销成功后自动确认收货(失败则回滚整个核销事务) + $confirm_ret = self::autoConfirmOrder($ticket['order_id'], $verifier_id); + if ($confirm_ret['code'] != 0) { + BaseService::log('verifyTicket: auto_confirm_failed', [ + 'ticket_id' => $ticket['id'], + 'order_id' => $ticket['order_id'], + 'error' => $confirm_ret['msg'], + ], 'error'); + throw new \Exception('确认收货失败:' . $confirm_ret['msg']); + } + return [ 'code' => 0, 'msg' => '核销成功', @@ -457,6 +470,17 @@ class TicketService extends BaseService 0 ); + // P1 核销成功后自动确认收货(失败则回滚整个核销事务) + $confirm_ret = self::autoConfirmOrder($ticket['order_id'], $verifier_id); + if ($confirm_ret['code'] != 0) { + BaseService::log('verifyTicketById: auto_confirm_failed', [ + 'ticket_id' => $ticket_id, + 'order_id' => $ticket['order_id'], + 'error' => $confirm_ret['msg'], + ], 'error'); + throw new \Exception('确认收货失败:' . $confirm_ret['msg']); + } + return [ 'code' => 0, 'msg' => '核销成功', @@ -575,4 +599,60 @@ class TicketService extends BaseService ], ]; } + + /** + * 核销成功后自动确认收货 + * + * 仅针对订单状态=3(待收货)的票务订单 + * 幂等:已是 status=4 则直接返回 + * 调用商城统一 OrderCollectHandle 完成积分赠送、销量增加、消息推送等 + * + * @param int $order_id 订单ID + * @param int $verifier_id 核销员ID(作为 creator 记录) + * @return array [code, msg] + */ + private static function autoConfirmOrder($order_id, $verifier_id = 0) + { + // 完整查询订单(OrderCollectHandle 需要 id,status,pay_status,user_id,order_model) + $order = \think\facade\Db::name('Order') + ->where('id', $order_id) + ->field('id,status,pay_status,user_id,order_model') + ->lock(true) + ->find(); + + if (empty($order)) { + BaseService::log('autoConfirmOrder: order_not_found', ['order_id' => $order_id], 'warning'); + return ['code' => -1, 'msg' => '订单不存在']; + } + + // 幂等保护:已经是已完成状态 + if ($order['status'] == 4) { + BaseService::log('autoConfirmOrder: already_completed', ['order_id' => $order_id], 'info'); + return ['code' => 0, 'msg' => '已完成']; + } + + // 仅自动确认待收货状态(status=3)的订单 + if ($order['status'] != 3) { + BaseService::log('autoConfirmOrder: wrong_status', [ + 'order_id' => $order_id, + 'status' => $order['status'], + ], 'warning'); + return ['code' => -2, 'msg' => '订单状态非待收货']; + } + + // 调用商城统一收货处理 + $params = [ + 'creator' => $verifier_id, + 'creator_name' => '票务核销自动确认', + ]; + $ret = OrderService::OrderCollectHandle($order, $params); + + BaseService::log('autoConfirmOrder: done', [ + 'order_id' => $order_id, + 'result' => $ret['code'] == 0 ? 'success' : 'failed', + 'msg' => $ret['msg'] ?? '', + ], $ret['code'] == 0 ? 'info' : 'warning'); + + return $ret; + } } From 2ceb7824aaca960f3059c8e6aa3bfb7e7d039bbc Mon Sep 17 00:00:00 2001 From: Council Date: Wed, 24 Jun 2026 09:06:44 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(ticket):=20=E6=96=B0=E5=A2=9E=E8=A7=82?= =?UTF-8?q?=E5=BD=B1=E4=BA=BA=E4=BF=A1=E6=81=AF=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AdminGoodsSave.php: 添加观影人配置UI(版本 v1.0.1) - 支持勾选是否需要观影人信息 - 支持配置必填字段:手机号(默认)、姓名、身份证号 - Vue 初始化和还原时自动补充 viewer_config 默认值 - Hook.php: BuyCheck 中新增观影人信息校验 - 校验 viewer_data 必填性 - 手机号格式校验(/^1[3-9]\d{9}$/) - 姓名和身份证号必填校验 - 阶段1:支持单个观影人(所有座位共用) 数据结构:viewer_config 嵌入到每个场馆配置中 兼容性:老数据自动补充默认值(不要求观影人信息) --- AGENTS.md | 2 +- CLAUDE.md | 2 +- docs/DEVELOPMENT_LOG.md | 81 +- docs/EXPERIENCES.md | 121 + docs/api/VR_TICKET_WALLET_VERIFY_API.md | 359 +- docs/test.json | 3903 +++++++++++++---- docs/test2.json | 2606 ++++++----- shopxo/app/event.php | 6 +- shopxo/app/plugins/vr_ticket/Hook.php | 101 + shopxo/app/plugins/vr_ticket/api/Ticket.php | 88 +- .../plugins/vr_ticket/hook/AdminGoodsSave.php | 69 +- shopxo/app/plugins/vr_ticket/install.sql | 3 +- .../vr_ticket/service/WalletService.php | 243 + 13 files changed, 5550 insertions(+), 2034 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ba26a16..dced6fd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26564 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26578 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/CLAUDE.md b/CLAUDE.md index ba26a16..dced6fd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26564 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26578 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/docs/DEVELOPMENT_LOG.md b/docs/DEVELOPMENT_LOG.md index c332ec9..7a9db53 100644 --- a/docs/DEVELOPMENT_LOG.md +++ b/docs/DEVELOPMENT_LOG.md @@ -1,7 +1,86 @@ # VR 票务插件开发日志 > vr-shopxo-plugin 项目全量记录 > 仓库:http://xmhome.ow-my.com:3000/sileya-ai/vr-shopxo-plugin -> 最后更新:2026-04-15 +> 最后更新:2026-06-22 + +--- + +## 2026-06-22 — 票务 API 优化与查询重置 Bug 修复 + +### 背景 + +前端 UniApp 订单模块反馈需要后端支持订单筛选功能。当前实现是前端全量拉取票务列表后在客户端进行 `goods_id` 筛选,效率低下。 + +### 需求 + +1. **订单筛选支持**: + - `order_id`: 单订单精准筛选 + - `order_ids`: 批量订单筛选(逗号分隔) + - `goods_id`: 商品筛选 + - `status`: 核销状态筛选 + +2. **分页支持**: + - `page`: 页码控制 + - `page_size`: 每页数量(1-100) + +### 实施过程 + +#### 新增功能 + +**1. WalletService 新增方法** + +- `formatTickets()`: 统一票据格式化逻辑 +- `getUserTicketsPaginated()`: 支持订单筛选和分页的查询方法 + +**2. Ticket API 控制器更新** + +- `list` 接口新增 6 个筛选参数 +- 响应格式增加 `total`, `page`, `page_size`, `pages` 分页字段 +- 票据对象增加 `order_id` 字段 + +#### Bug 修复 + +**🐛 Bug #1: 查询条件重置(Critical)** + +- **现象**: 传入筛选参数后,接口返回全表数据,未生效任何筛选条件(包括 `user_id`),存在跨用户数据暴露风险。 +- **根因**: `WalletService::getUserTicketsPaginated` 中,构建完 Query Builder 实例后执行 `$db->count()`。在 ThinkPHP ORM 机制下,终端查询方法(如 `count()`)执行完成后会清空当前 query 实例中的 `where` 条件。导致后续 `$db->select()` 在没有任何 where 约束的情况下执行了全表查询。 +- **解决**: 放弃复用 Query Builder 实例,改用 `$where` 数组存储条件,在 `count()` 和 `select()` 中分别独立传入执行,彻底避免状态污染与越权隐患。 + +**🐛 Bug #2: page_size 最小值限制** + +- **现象**: 传入 `page_size=1` 却被后端强制改为 `page_size=10`。 +- **根因**: API 控制器中使用了 `max(10, intval(input('page_size', 20)))`,导致最小值被强制锁死为 10。 +- **解决**: 将最小值限制修改为 `max(1, ...)`,允许客户端根据实际需求精准获取单条数据。 + +### 验证测试 + +通过宿主机执行 `curl` 请求模拟前端调用验证: + +```bash +curl -s "http://localhost:10000/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=list&token=xxx&page_size=1&page=1" | python3 -m json.tool +``` + +**响应结果**: +- `page_size` 被正确解析并返回为 `1` +- `tickets` 列表长度为 `1` +- 总数 `total` 正常返回为 `5`,总页数 `pages` 正确计算为 `5` +- 所有查询条件(用户ID、筛选等)均生效 ✅ + +### Git Commit + +``` +[待提交] fix(vr_ticket): 修复查询条件重置Bug + 新增订单筛选和分页功能 +``` + +### 影响范围分析(GitNexus) + +- **`WalletService::getUserTickets`**: 影响范围 `LOW`,仅被 `Ticket.php` 的 `list` 接口调用 +- **`gitnexus_detect_changes()`**: 变更仅局限于相关文件,风险等级 `low` + +### 相关文档 + +- [API 文档](file:///Users/bigemon/WorkSpace/vr-shopxo-plugin/docs/api/VR_TICKET_WALLET_VERIFY_API.md) v1.2.0(已更新) +- [实施完成报告](file:///Users/bigemon/.gemini/antigravity-ide/brain/84fa0992-c4b7-4511-94e1-99e3ea98793e/walkthrough.md) --- diff --git a/docs/EXPERIENCES.md b/docs/EXPERIENCES.md index 9d3ad6e..95bbb9a 100644 --- a/docs/EXPERIENCES.md +++ b/docs/EXPERIENCES.md @@ -610,3 +610,124 @@ public function OnSearchListBegin(&$params) - [x] 使用 `where_base`(非 `where`)注入筛选条件 - [x] 使用 `ROOT`(非 `ROOT_PATH`)定位日志文件 - [x] 保留调试代码(注释状态) + +--- + +### 24. ThinkPHP Query Builder 查询条件重置(Critical)⚠️ + +**发现日期**:2026-06-22 + +**现象**:传入筛选参数(如 `order_id`、`page_size=1`)后,API 返回全表数据,未生效任何筛选条件(包括 `user_id`),存在跨用户数据暴露的安全风险。 + +**根因**:ThinkPHP ORM 的 Query Builder 实例在执行终端查询方法(如 `count()`、`find()`、`select()`)后,会自动清空当前实例中的 `where` 条件。 + +**错误代码示例**: + +```php +// ❌ 错误:复用 Query Builder 实例 +public function getUserTicketsPaginated(int $userId, ?int $orderId = null) { + $db = Db::name('vr_tickets'); + + // 构建查询条件 + $db->where('user_id', $userId); + if ($orderId > 0) { + $db->where('order_id', $orderId); + } + + // 执行 count() —— 此时 where 条件被清空! + $total = $db->count(); + + // 再执行 select() —— 实际上是全表查询,没有任何 where 条件! + $tickets = $db->select()->toArray(); + + return ['total' => $total, 'list' => $tickets]; +} +``` + +**执行过程分析**: + +1. `$db->where('user_id', $userId)` → 查询条件:`WHERE user_id = 1` +2. `$db->where('order_id', $orderId)` → 查询条件:`WHERE user_id = 1 AND order_id = 41` +3. `$db->count()` → 执行查询并返回结果,**同时清空 $db 实例中的 where 条件** +4. `$db->select()` → 实际执行的是 `SELECT * FROM vr_tickets`(**无任何 where 条件**) + +**安全风险**: +- 跨用户数据泄露(user_id 筛选失效) +- 订单数据越权访问(order_id 筛选失效) +- 分页失效(返回全表数据) + +**正确写法 1:使用 where 条件数组(推荐)** + +```php +// ✅ 正确:使用 where 条件数组,避免状态污染 +public function getUserTicketsPaginated(int $userId, ?int $orderId = null) { + $where = [ + ['user_id', '=', $userId] + ]; + + if ($orderId > 0) { + $where[] = ['order_id', '=', $orderId]; + } + + // 分别独立执行,每次都传入完整的 where 条件 + $total = Db::name('vr_tickets')->where($where)->count(); + $tickets = Db::name('vr_tickets')->where($where)->select()->toArray(); + + return ['total' => $total, 'list' => $tickets]; +} +``` + +**正确写法 2:克隆 Query Builder 实例** + +```php +// ✅ 正确:克隆实例,但不推荐(性能和可读性不如方法1) +public function getUserTicketsPaginated(int $userId, ?int $orderId = null) { + $db = Db::name('vr_tickets'); + $db->where('user_id', $userId); + if ($orderId > 0) { + $db->where('order_id', $orderId); + } + + // 克隆实例用于 count + $dbClone = clone $db; + $total = $dbClone->count(); + + // 原实例用于 select + $tickets = $db->select()->toArray(); + + return ['total' => $total, 'list' => $tickets]; +} +``` + +**为什么会出现这个问题**: + +ThinkPHP Query Builder 采用**链式调用 + 状态复用**的设计: +- 每次调用 `where()` 都会修改实例内部的 `$options['where']` 数组 +- 执行 `count()`、`select()` 等终端方法时,会根据 `$options` 构建 SQL 并执行 +- 执行完毕后,为了允许实例被复用,会调用 `$this->removeOption()` 清空查询条件 +- 这个设计在单次查询时没问题,但在"先 count 后 select"的场景下就会出现条件丢失 + +**教训**: +1. **禁止复用 Query Builder 实例**进行多次查询(count + select) +2. 推荐使用 **where 条件数组**,在每次查询时独立传入 +3. 这个问题在 ShopXO 的其他 Service 层代码中也很常见,需要全面排查 +4. 这是一个 **Critical 级别的安全问题**,可能导致数据越权访问 + +**影响范围**: +- 本次发现:`vr_ticket` 插件的 `WalletService::getUserTicketsPaginated` 方法 +- 潜在风险:所有使用 Query Builder 复用模式的 Service 层代码 + +**验证方法**: + +```bash +# 测试是否存在问题 +curl "http://localhost/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=list&token=xxx&order_id=41&page_size=1" + +# 检查响应: +# - total 应该等于 tickets 数组长度(如果不等,说明 count 和 select 用了不同的条件) +# - 如果返回了其他用户的数据,说明 user_id 筛选失效 +``` + +**相关 Issue**:修复 Query Builder 查询条件重置 Bug(2026-06-22) + +--- diff --git a/docs/api/VR_TICKET_WALLET_VERIFY_API.md b/docs/api/VR_TICKET_WALLET_VERIFY_API.md index c21cb05..c19329e 100644 --- a/docs/api/VR_TICKET_WALLET_VERIFY_API.md +++ b/docs/api/VR_TICKET_WALLET_VERIFY_API.md @@ -1,7 +1,8 @@ # VR票务插件 C端 API 文档 -> **版本**: 1.1.0 -> **最后更新**: 2026-05-28 +> **版本**: 1.3.0 +> **最后更新**: 2026-06-22 +> **更新内容**: 新增瀑布流参数支持(last_id + limit + order_by) 本文档描述了 VR 票务插件(`vr_ticket`)的 C 端 UniApp API,涵盖票夹、核销、核销记录三类接口,适用于移动端用户及授权核销员使用。 @@ -93,23 +94,39 @@ Header Value: {user_token} ## 四、票夹 API -> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction={action}` +> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction={action}` > **认证**: C 端登录态(无需核销员身份) -### 4.1 获取用户票列表 +### 4.1 获取用户票列表 ⭐ **新增功能** ``` GET ...&pluginsaction=list GET ...&pluginsaction=tickets (别名) ``` -**成功响应 `data`**: +#### 请求参数 + +| 参数 | 类型 | 必填 | 默认值 | 说明 | +|------|------|------|--------|------| +| `order_id` | int | ❌ | - | **【新增】** 按单个订单 ID 精准筛选 | +| `order_ids` | string | ❌ | - | **【新增】** 按多个订单 ID 批量筛选,逗号分隔,如 `41,42,43` | +| `goods_id` | int | ❌ | - | **【新增】** 按商品 ID 筛选 | +| `status` | int | ❌ | - | **【新增】** 按核销状态筛选:`0`=未核销,`1`=已核销,`2`=已退款 | +| `page` | int | ❌ | `1` | **【新增】** 页码 | +| `page_size` | int | ❌ | `20` | **【新增】** 每页数量(最小 1,最大 100) | + +> **注意**: +> - 所有筛选参数均为**可选**。不同参数之间是 **AND(与)** 关系。 +> - 例如同时传 `order_id=41&goods_id=119` 表示「订单 41 中商品 ID 为 119 的票据」。 + +#### 成功响应 `data` ```json { "tickets": [ { "id": 123, + "order_id": 41, "goods_id": 456, "goods_title": "周杰伦演唱会-北京站", "goods_image": "https://...jpg", @@ -124,20 +141,306 @@ GET ...&pluginsaction=tickets (别名) "short_code": "000ca1b2" } ], - "count": 1 + "total": 50, + "page": 1, + "page_size": 20, + "pages": 3 } ``` | 字段 | 类型 | 说明 | |------|------|------| +| `tickets` | array | 票据列表数组 | +| `total` | int | **【新增】** 总记录数 | +| `page` | int | **【新增】** 当前页码 | +| `page_size` | int | **【新增】** 每页数量 | +| `pages` | int | **【新增】** 总页数 | +| `order_id` | int | **【新增】** 订单 ID(票据对象内) | | `verify_status` | int | `0`=未核销 `1`=已核销 `2`=已退款 | -| `short_code` | string | 9位短码,可供核销员扫码 | +| `short_code` | string | 8-9位短码,可供核销员扫码 | | `seat_info` | string | 完整 5 维坐席信息,`场次\|场馆\|演播室\|分区\|座位号` | +#### 使用场景 + +**场景 1:订单详情页 - 查看当前订单的所有票据** + +```javascript +// 优化前(低效)- 全量拉取后前端过滤 +uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + success: function(res) { + var allTickets = res.data.data.tickets || []; + var orderTickets = allTickets.filter(function(t) { + return goodsIds.indexOf(t.goods_id) !== -1; + }); + } +}); + +// 优化后(高效)- 后端直接筛选 +uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + order_id: orderId, // 直接传订单ID + page_size: 100 // 订单票据通常不会太多 + }, + success: function(res) { + var orderTickets = res.data.data.tickets || []; + // 无需前端过滤,直接使用 + } +}); +``` + +**场景 2:票夹页 - 分页加载** + +```javascript +uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + page: 1, + page_size: 20, + status: 0 // 只看未核销的票 + }, + success: function(res) { + var data = res.data.data; + console.log('总票数:', data.total); + console.log('总页数:', data.pages); + console.log('当前页:', data.page); + } +}); +``` + +**场景 3:批量订单查询** + +```javascript +uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + order_ids: '41,42,43', // 一次查询多个订单 + page_size: 50 +}); +``` + +--- + +### 4.1.1 瀑布流模式 ⭐ **v1.3.0 新增** + +瀑布流模式专为移动端无限滚动场景设计,基于 ID 游标实现高性能连续加载。 + +#### 触发条件 + +- 传入 `last_id > 0` 或 `limit` 参数时自动启用瀑布流模式 +- 否则使用传统分页模式(向后兼容) + +#### 新增参数 + +| 参数 | 类型 | 必填 | 默认值 | 说明 | +|------|------|------|--------|------| +| `last_id` | int | ❌ | `0` | 游标 ID,`0` 表示首次加载 | +| `limit` | int | ❌ | `20` | 每次拉取数量(最小 1,最大 100) | +| `order_by` | string | ❌ | `desc` | 排序方向:`desc`(降序,历史方向)/ `asc`(升序,新数据方向) | + +#### 响应格式 + +```json +{ + "tickets": [ + { + "id": 69, + "order_id": 41, + "goods_id": 456, + "goods_title": "周杰伦演唱会-北京站", + "seat_info": "2026-06-01 20:00|国家体育馆|主厅|A区|A1", + "session_time": "2026-06-01 20:00", + "venue_name": "国家体育馆", + "verify_status": 0, + "issued_at": 1716307200, + "short_code": "000ca1b2" + } + ], + "has_more": true, + "last_id": 65, + "count": 3 +} +``` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `tickets` | array | 票据列表数组 | +| `has_more` | bool | 是否还有更多数据 | +| `last_id` | int | 本次返回的最后一条 ID(下次请求的游标) | +| `count` | int | 本次返回数量 | + +#### 使用场景 + +**场景 1:首次加载(最新票据)** + +```bash +GET /list?limit=20&order_by=desc +``` + +**响应**: +```json +{ + "tickets": [{id: 100, ...}, {id: 99, ...}, ...], + "has_more": true, + "last_id": 81, + "count": 20 +} +``` + +**场景 2:下拉加载更多(历史数据)** + +```bash +GET /list?last_id=81&limit=20&order_by=desc +``` + +**响应**: +```json +{ + "tickets": [{id: 80, ...}, {id: 79, ...}, ...], + "has_more": true, + "last_id": 61, + "count": 20 +} +``` + +**场景 3:上拉刷新(新数据)** + +```bash +GET /list?last_id=100&limit=20&order_by=asc +``` + +**响应**: +```json +{ + "tickets": [{id: 101, ...}, {id: 102, ...}], + "has_more": false, + "last_id": 102, + "count": 2 +} +``` + +#### UniApp 集成示例 + +```javascript +data() { + return { + tickets: [], + lastId: 0, + hasMore: true, + loading: false + } +}, + +methods: { + // 首次加载 + loadTickets() { + this.loading = true; + uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + limit: 20, + order_by: 'desc' + }, + success: (res) => { + const data = res.data.data; + this.tickets = data.tickets; + this.hasMore = data.has_more; + this.lastId = data.last_id; + }, + complete: () => { + this.loading = false; + } + }); + }, + + // 下拉加载更多 + loadMore() { + if (!this.hasMore || this.loading) return; + + this.loading = true; + uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + last_id: this.lastId, + limit: 20, + order_by: 'desc' + }, + success: (res) => { + const data = res.data.data; + this.tickets = this.tickets.concat(data.tickets); + this.hasMore = data.has_more; + this.lastId = data.last_id; + }, + complete: () => { + this.loading = false; + } + }); + }, + + // 上拉刷新(获取新票) + refresh() { + if (this.tickets.length === 0) { + this.loadTickets(); + return; + } + + const firstId = this.tickets[0].id; + uni.request({ + url: app.globalData.get_request_url('list', 'ticket', 'vr_ticket'), + data: { + last_id: firstId, + limit: 20, + order_by: 'asc' // 升序获取新数据 + }, + success: (res) => { + const data = res.data.data; + if (data.count > 0) { + // 新数据插入到列表前面 + this.tickets = data.tickets.reverse().concat(this.tickets); + uni.showToast({ title: `新增 ${data.count} 张票` }); + } else { + uni.showToast({ title: '已是最新' }); + } + } + }); + } +}, + +onLoad() { + this.loadTickets(); +}, + +onReachBottom() { + this.loadMore(); +}, + +onPullDownRefresh() { + this.refresh(); + setTimeout(() => { + uni.stopPullDownRefresh(); + }, 1000); +} +``` + +#### 技术优势 + +**vs 传统分页**: +- ✅ 无缝滚动体验(无页码概念) +- ✅ 支持双向拉取(下拉历史,上拉新数据) +- ✅ 数据变化时不会重复/遗漏(基于 ID 游标) +- ✅ 性能更好(`WHERE id < ?` + `LIMIT` 比 `OFFSET` 高效) + +**排序说明**: +- 使用 `id` 字段排序(主键索引,性能最优) +- `id` 单调递增,确保顺序唯一性 +- `issued_at` 已添加索引,支持未来按发放时间筛选 + --- ### 4.2 获取票详情(含 QR Payload) + ``` GET ...&pluginsaction=detail&id={ticket_id} ``` @@ -154,6 +457,7 @@ GET ...&pluginsaction=detail&id={ticket_id} { "ticket": { "id": 123, + "order_id": 41, "goods_id": 456, "goods_title": "周杰伦演唱会-北京站", "goods_image": "https://...jpg", @@ -237,7 +541,7 @@ GET ...&pluginsaction=checkVerifier ## 五、核销 API(UniApp 授权核销员专用) -> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=verify` +> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=verify` > **认证**: C 端登录态 **+** 必须是 `vr_verifiers` 表中 `status=1` 的授权核销员 ### 5.1 扫码核销 @@ -286,7 +590,7 @@ Content-Type: application/x-www-form-urlencoded ## 六、核销记录 API(UniApp 授权核销员专用) -> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=myVerifications` +> **基础路由**: `/api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=myVerifications` > **认证**: C 端登录态 **+** 必须是 `vr_verifiers` 表中 `status=1` 的授权核销员 ### 6.1 我的核销记录 @@ -300,7 +604,7 @@ GET ...&pluginsaction=myVerifications | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | `page` | int | ❌ | `1` | 页码 | -| `page_size` | int | ❌ | `20` | 每页条数(最大 100) | +| `page_size` | int | ❌ | `20` | 每页条数(最小 1,最大 100) | **成功响应 `data`**: @@ -351,6 +655,41 @@ GET ...&pluginsaction=myVerifications --- +## 八、变更日志与 Bug 修复 + +### v1.2.0 (2026-06-22) + +#### 新增功能 +1. **订单筛选支持** + - `order_id`: 单订单精准筛选 + - `order_ids`: 批量订单筛选(逗号分隔) + - `goods_id`: 商品筛选 + - `status`: 核销状态筛选 + +2. **分页支持** + - `page`: 页码控制 + - `page_size`: 每页数量(1-100) + - 响应增加 `total`, `page`, `page_size`, `pages` 字段 + +3. **响应格式优化** + - 票据对象增加 `order_id` 字段,便于前端业务关联 + +#### Bug 修复 + +**🐛 Bug #1: 查询条件重置(Critical)** + +- **现象**: 传入筛选参数后,接口返回全表数据,未生效任何筛选条件(包括 `user_id`),存在跨用户数据暴露风险。 +- **根因**: `WalletService::getUserTicketsPaginated` 中,构建完 Query Builder 实例后执行 `$db->count()`。在 ThinkPHP ORM 机制下,终端查询方法(如 `count()`)执行完成后会清空当前 query 实例中的 `where` 条件。导致后续 `$db->select()` 在没有任何 where 约束的情况下执行了全表查询。 +- **解决**: 放弃复用 Query Builder 实例,改用 `$where` 数组存储条件,在 `count()` 和 `select()` 中分别独立传入执行,彻底避免状态污染与越权隐患。 + +**🐛 Bug #2: page_size 最小值限制** + +- **现象**: 传入 `page_size=1` 却被后端强制改为 `page_size=10`。 +- **根因**: API 控制器中使用了 `max(10, intval(input('page_size', 20)))`,导致最小值被强制锁死为 10。 +- **解决**: 将最小值限制修改为 `max(1, ...)`,允许客户端根据实际需求精准获取单条数据。 + +--- + ## 附录:数据字典 ### vr_tickets 电子票表 diff --git a/docs/test.json b/docs/test.json index befeabb..192c702 100644 --- a/docs/test.json +++ b/docs/test.json @@ -1,882 +1,3077 @@ { - "code": 0, "msg": "success", + "code": 0, "data": { - "goods_id": 119, - "group_by": [ - "venue", - "session", - "room", - "section" - ], - "tree": { - "venues": { - "测试场馆": { - "name": "测试场馆", - "sessions": { - "08:00-23:59": { - "name": "08:00-23:59", - "rooms": { - "老展厅 1": { - "name": "老展厅 1", - "sections": { - "A": { - "name": "A", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排3座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排4座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排4座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排5座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排5座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排6座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排6座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排7座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排7座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排7座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排6座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排6座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "A", - "seat": "3排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 10, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "B": { - "name": "B", - "seats": { - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "2排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排1座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排2座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排4座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排4座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排4座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排5座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排5座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "08:00-23:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排5座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 0, - "max_price": 0 + "data_mode": 3, + "data_list": { + "id": 6, + "md5_key": "9d3dd15bdeefa8525778125bda90cc36", + "logo": "", + "name": "首页2", + "describe": "", + "config": { + "header": { + "name": "页面设置", + "show_tabs": "1", + "key": "page-settings", + "com_data": { + "content": { + "content_top": { + "time_value": "" + }, + "theme": "5", + "logo": [], + "title": "网站名称", + "link": [], + "data_alone_row_value": [], + "is_left_back_btn_show": "0", + "indicator_location": "flex-start", + "icon_setting": [], + "is_location_left_icon_show": "1", + "location_left_img": [], + "location_left_icon": "location", + "positioning_name": "北京", + "positioning_name_float": "0", + "is_location_right_icon_show": "1", + "location_right_img": [], + "location_right_icon": "arrow-bottom", + "is_center": "0", + "is_icon_show": "1", + "icon_link": { + "page": "\/pages\/goods-search\/goods-search?category_id=888", + "id": 888, + "pid": 876, + "icon": "", + "icon_active": "", + "realistic_images": "", + "name": "演唱会", + "vice_name": "", + "describe": "", + "bg_color": "", + "big_images": "", + "sort": 0, + "is_home_recommended": 1, + "seo_title": "", + "seo_keywords": "", + "seo_desc": "" + }, + "icon_img": [], + "icon_class": "search", + "tips": "请输入搜索内容", + "is_right_icon_show": "0", + "right_icon_link": [], + "right_icon_img": [], + "right_icon_class": "", + "is_search_show": "1", + "search_botton_img": [], + "search_botton_icon": "", + "is_tips_show": "1", + "search_type": "text", + "search_tips": "搜索", + "hot_word_list": [], + "bottom_navigation_show": "1", + "is_hot_word_show": "0" + }, + "style": { + "header_background_type": "color_image", + "header_background_color_list": [ + { + "color": "#fff" + } + ], + "header_background_direction": "180deg", + "header_background_img_style": "2", + "header_background_img": [], + "header_background_title_color": "#333", + "header_background_title_typeface": "bold", + "header_background_title_size": 14, + "data_alone_row_space": 5, + "function_buttons_type": "0", + "immersive_style": "0", + "general_safe_distance_value": "0", + "up_slide_logo": [], + "up_slide_display": "1", + "up_slide_icon_color": "", + "up_slide_title_color": "", + "up_slide_location_color": "", + "up_slide_left_back_btn_color": "", + "up_slide_background_color_list": [ + { + "color": "#fff" + } + ], + "up_slide_background_direction": "180deg", + "up_slide_background_img_style": "2", + "up_slide_background_img": [], + "left_back_btn_color": "#333", + "icon_color": "#ccc", + "right_icon_color": "#ccc", + "location_direction": "90deg", + "location_color_list": [ + { + "color": "" + } + ], + "location_background_img_style": "0", + "location_background_img": [], + "location_color": "#333", + "location_left_icon_size": 12, + "location_right_icon_size": 12, + "location_border_show": "0", + "location_border_color": "#FF3F3F", + "location_border_style": "solid", + "location_border_size": { + "padding": 0, + "padding_top": 0, + "padding_right": 0, + "padding_bottom": 0, + "padding_left": 0 + }, + "location_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "location_padding": { + "padding": 0, + "padding_top": 0, + "padding_right": 0, + "padding_bottom": 0, + "padding_left": 0 + }, + "location_margin": { + "margin": 0, + "margin_top": 0, + "margin_right": 10, + "margin_bottom": 0, + "margin_left": 0 + }, + "img_size": "23", + "img_space": "15", + "img_color": "#666", + "tips_color": "#ccc", + "hot_words_color": "#999", + "search_border": "#E4E4E4", + "search_bg_color": "#fff", + "search_border_radius": { + "radius": 16, + "radius_top_left": 16, + "radius_top_right": 16, + "radius_bottom_left": 16, + "radius_bottom_right": 16 + }, + "search_botton_padding": { + "padding": 0, + "padding_top": 3, + "padding_left": 12, + "padding_right": 12, + "padding_bottom": 3 + }, + "search_botton_margin": { + "margin": 0, + "margin_top": 2, + "margin_right": 2, + "margin_bottom": 2, + "margin_left": 0 + }, + "search_botton_border_size": { + "padding": 0, + "padding_top": 0, + "padding_right": 0, + "padding_bottom": 0, + "padding_left": 0 + }, + "search_botton_border_show": "0", + "search_botton_border_color": "#FF3F3F", + "search_botton_border_style": "solid", + "button_inner_color": "#fff", + "search_botton_color_list": [ + { + "color": "#5F5F5F" + }, + { + "color": "#3B3B3B" + } + ], + "search_botton_direction": "90deg", + "search_botton_background_img_style": "2", + "search_botton_background_img": [], + "search_button_radius": { + "radius": 16, + "radius_top_left": 16, + "radius_top_right": 16, + "radius_bottom_left": 16, + "radius_bottom_right": 16 + }, + "search_padding_left": 15, + "common_style": { + "direction": "90deg", + "color_list": [ + { + "color": "#f5f5f5" + } + ], + "background_img_style": "0", + "floating_up": 0, + "module_z_index": 0, + "padding_top_safe_value": 0, + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "padding": 0, + "padding_top": 0, + "padding_bottom": 0, + "padding_left": 0, + "padding_right": 0, + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "background_img": [] + }, + "is_roll": "0", + "interval_time": 1 + } + }, + "id": "33ac52435209aba69db9b614166d4c36" + }, + "footer": { + "name": "底部导航", + "show_tabs": "0", + "key": "footer-nav", + "com_data": { + "content": { + "nav_style": "0", + "nav_type": "0", + "nav_content": [ + { + "id": "1", + "name": "首页", + "img": [ + { + "id": 1, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/home.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" } - }, - "inventory": 16, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 16, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 16, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "万达国际电影城(朝阳国贸店)": { - "name": "万达国际电影城(朝阳国贸店)", - "sessions": { - "08:00-23:59": { - "name": "08:00-23:59", - "rooms": { - "主要展厅": { - "name": "主要展厅", - "sections": { - "A": { - "name": "A", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排4座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排5座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 999, - "max_price": 999 - }, - "B": { - "name": "B", - "seats": { - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "2排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排1座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排1座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排2座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排2座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排4座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排4座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排5座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排5座", - "price": 299, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 299, - "max_price": 299 + ], + "img_checked": [ + { + "id": 2, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/active\/home.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" } - }, - "inventory": 14, - "has_available": true, - "min_price": 299, - "max_price": 999 - } - }, - "inventory": 14, - "has_available": true, - "min_price": 299, - "max_price": 999 - } - }, - "inventory": 14, - "has_available": true, - "min_price": 299, - "max_price": 999 - } - }, - "sessions": [], - "rooms": [], - "sections": [] - }, - "seat_templates": { - "测试场馆_老展厅 1_A": { - "template_key": "测试场馆_老展厅 1_A", - "name": "测试场馆", - "room_name": "老展厅 1", - "section_name": "A", - "seat_map": { - "venue": { - "name": "一个测试场馆信息", - "address": "嘉庚体育馆", - "location": { - "lng": "", - "lat": "" - }, - "images": [ - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s", - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s" - ] - }, - "rooms": [ - { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" + ], + "link": { + "name": "商城首页", + "page": "\/pages\/index\/index" + } }, { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - } - ] - }, - "rooms": [ - { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - } - ], - "layout_cols": 10, - "layout_rows": 10 - }, - "测试场馆_老展厅 1_B": { - "template_key": "测试场馆_老展厅 1_B", - "name": "测试场馆", - "room_name": "老展厅 1", - "section_name": "B", - "seat_map": { - "venue": { - "name": "一个测试场馆信息", - "address": "嘉庚体育馆", - "location": { - "lng": "", - "lat": "" - }, - "images": [ - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s", - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s" - ] - }, - "rooms": [ - { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" + "id": "2", + "name": "票夹", + "img": [ + { + "id": 595, + "category_id": 1, + "title": "1607398361522502.png", + "original": "发票100x100.png", + "size": "4.54KB", + "ext": ".png", + "type": "image", + "url": "http:\/\/localhost:10000\/static\/upload\/images\/diy\/6\/2026\/05\/11\/1607398361522502.png", + "hash": "a3e6a81b9982d32595cef9094d71ea14ae38fff34a8e71ae535d567b635c239b", + "add_time": "2020-12-08 11:32:41", + "category_name": "用户中心菜单", + "type_name": "图片" + } + ], + "img_checked": [ + { + "id": 4, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/active\/category.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" + } + ], + "link": { + "name": "\/pages\/plugins\/vr-ticket-wallet\/ticket-wallet", + "page": "\/pages\/plugins\/vr-ticket-wallet\/ticket-wallet" + } }, { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" + "id": "3", + "name": "周边", + "img": [ + { + "id": 5, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/cart.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" + } + ], + "img_checked": [ + { + "id": 6, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/active\/cart.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" + } + ], + "link": { + "name": "商品分类", + "page": "\/pages\/goods-category\/goods-category" + } }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - } - ] - }, - "rooms": [ - { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - } - ], - "layout_cols": 10, - "layout_rows": 10 - }, - "万达国际电影城(朝阳国贸店)_主要展厅_A": { - "template_key": "万达国际电影城(朝阳国贸店)_主要展厅_A", - "name": "万达国际电影城(朝阳国贸店)", - "room_name": "主要展厅", - "section_name": "A", - "seat_map": { - "venue": { - "name": "北京市朝阳区万达国际电影城", - "address": "中国北京市朝阳区国贸建国路93号", - "location": { - "lng": "116.471099", - "lat": "39.907398" - }, - "images": [ - "https://www.ruyifilm.com/image/20190101/W020160119569970428777.jpg", - "https://www.ruyifilm.com/image/20190101/W020160119569970447104.jpg" - ], - "notices": { - "buy": [], - "watch": [], - "service": [ { - "title": "近视镜", - "desc": "近视观众请自备近视眼镜", - "status": "warning" + "id": "4", + "name": "我的", + "img": [ + { + "id": 7, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/user.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" + } + ], + "img_checked": [ + { + "id": 8, + "url": "http:\/\/localhost:10000\/static\/app\/tabbar\/active\/user.png", + "original": "", + "title": "", + "ext": ".png", + "type": "img" + } + ], + "link": { + "name": "我的", + "page": "\/pages\/user\/user" + } } ] + }, + "style": { + "text_color_checked": "rgba(255, 0, 0, 1)", + "default_text_color": "rgba(0, 0, 0, 1)", + "common_style": { + "direction": "90deg", + "color_list": [ + { + "color": "rgba(255,255,255,1)" + } + ], + "background_img_style": "0", + "floating_up": 0, + "module_z_index": 0, + "padding_top_safe_value": 0, + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "padding": 0, + "padding_top": 0, + "padding_bottom": 0, + "padding_left": 0, + "padding_right": 0, + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "background_img": [] + } } }, - "rooms": [ - { - "name": "主要展厅", - "map": [ - "AA_AA", - "AABAA", - "BBBBB" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - }, - "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47" - } - ] + "id": "ba0008eb194c8a81da0f99b4ff71c542" }, - "rooms": [ + "diy_data": [ { - "name": "主要展厅", - "map": [ - "AA_AA", - "AABAA", - "BBBBB" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" + "name": "商品选项卡", + "mark_name": "", + "show_tabs": "0", + "is_enable": "1", + "id": "1c8c5f7e4dfa4b33843ff559a5c1c035", + "key": "goods-tabs", + "com_data": { + "content": { + "content_top": { + "time_value": "" + }, + "justification": "left", + "tabs_theme": "0", + "tabs_adorn_icon": "checked-smooth", + "is_general_safe_distance": "0", + "tabs_adorn_img": [], + "tabs_top_up": "0", + "theme": "5", + "carousel_col": 3, + "tabs_list": [ + { + "id": "1", + "tabs_type": "0", + "tabs_img": [], + "tabs_icon": "", + "is_sliding_fixed": "0", + "title": "推荐", + "img": [], + "desc": "简介", + "data_type": "0", + "keywords": "", + "category_ids": [], + "brand_ids": [], + "data_ids": "119,116,115", + "number": 4, + "order_by_type": 0, + "order_by_rule": 0, + "data_list": [ + { + "id": "ku44pj3onj", + "new_cover": [], + "new_title": "", + "data": { + "id": 119, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "一个测试商品", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-04", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 30, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/13\/1778636390391913.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}},{\"template_id\":7,\"selected_rooms\":[\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"],\"selected_sections\":{\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[{\"name\":\"主要展厅\",\"map\":[\"AA_AA\",\"AABAA\",\"BBBBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 115, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-05-18 12:55:37", + "upd_time": "2026-06-08 16:40:49", + "data_index": 1, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=119", + "photo": [ + { + "id": 2355, + "goods_id": 119, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/18\/1779080134751494.jpg", + "is_show": 1, + "sort": 0, + "add_time": 1780908049 + } + ], + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2810, + "goods_id": 119, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2811, + "goods_id": 119, + "value": [ + { + "name": "测试场馆", + "images": "" + }, + { + "name": "万达国际电影城(朝阳国贸店)", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2812, + "goods_id": 119, + "value": [ + { + "name": "老展厅 1", + "images": "" + }, + { + "name": "主要展厅", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2813, + "goods_id": 119, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2814, + "goods_id": 119, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:40:49" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + "data_id": 119 + }, + { + "id": "w4jv2pugna", + "new_cover": [], + "new_title": "", + "data": { + "id": 116, + "brand_id": 0, + "site_type": 1, + "title": "测试3", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-05", + "coding": "33", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779993176477948.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 41, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 22:51:39", + "upd_time": "2026-06-08 21:44:12", + "data_index": 2, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=116", + "photo": [ + { + "id": 2359, + "goods_id": 116, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776523860991125.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926252 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2850, + "goods_id": 116, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2851, + "goods_id": 116, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2852, + "goods_id": 116, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2853, + "goods_id": 116, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2854, + "goods_id": 116, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:12" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + "data_id": 116 + }, + { + "id": "b6i0h76f1yq", + "new_cover": [], + "new_title": "", + "data": { + "id": 115, + "brand_id": 0, + "site_type": -1, + "title": "测试", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-01", + "coding": "11", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779992950817492.png", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 4, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 15:12:41", + "upd_time": "2026-06-08 21:44:21", + "data_index": 3, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=115", + "photo": [ + { + "id": 2360, + "goods_id": 115, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776496358725362.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926261 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2860, + "goods_id": 115, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2861, + "goods_id": 115, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2862, + "goods_id": 115, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2863, + "goods_id": 115, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2864, + "goods_id": 115, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:21" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + "data_id": 115 + } + ], + "data_auto_list": [] + }, + { + "id": "2", + "tabs_type": "0", + "tabs_img": [], + "tabs_icon": "", + "is_sliding_fixed": "0", + "title": "音乐演出", + "img": [], + "desc": "简介", + "data_type": "0", + "keywords": "", + "category_ids": [], + "brand_ids": [], + "data_ids": "", + "number": 4, + "order_by_type": 0, + "order_by_rule": 0, + "data_list": [], + "data_auto_list": [] + }, + { + "id": "3", + "tabs_type": "0", + "tabs_img": [], + "tabs_icon": "", + "is_sliding_fixed": "0", + "title": "音乐会", + "img": [], + "desc": "简介", + "data_type": "0", + "keywords": "", + "category_ids": [], + "brand_ids": [], + "data_ids": "", + "number": 4, + "order_by_type": 0, + "order_by_rule": 0, + "data_list": [], + "data_auto_list": [] + }, + { + "id": "4", + "tabs_type": "0", + "tabs_img": [], + "tabs_icon": "", + "is_sliding_fixed": "0", + "title": "戏剧", + "img": [], + "desc": "简介", + "data_type": "0", + "keywords": "", + "category_ids": [], + "brand_ids": [], + "data_ids": "", + "number": 4, + "order_by_type": 0, + "order_by_rule": 0, + "data_list": [], + "data_auto_list": [] + } + ], + "tabs_active_index": 0, + "static_img": [ + { + "id": 2, + "url": "http:\/\/localhost:10000\/static\/upload\/images\/diy\/6\/2026\/05\/11\/price.png", + "original": "角标", + "title": "角标", + "ext": ".png", + "type": "img" + } + ], + "is_show": [ + "title", + "plugins_view_icon", + "sales_count", + "original_price", + "price" + ], + "simple_desc_row": "1", + "is_shop_show": "0", + "is_price_solo": "1", + "shop_type": "icon", + "shop_button_text": "购买", + "shop_button_icon_class": "cart", + "shop_button_effect": "0", + "seckill_subscript_show": "0", + "subscript_type": "text", + "subscript_img_src": [], + "subscript_icon_class": "", + "subscript_text": "角标" }, - { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" + "style": { + "tabs_one_theme": "1", + "tabs_checked": [ + { + "color": "#FF2222" + }, + { + "color": "#FF9898" + } + ], + "is_tabs_adorn_img_background": "0", + "tabs_adorn_icon_size": 15, + "tabs_adorn_img_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "tabs_adorn_img_height": 10, + "tabs_direction": "315deg", + "tabs_weight_checked": "bold", + "tabs_size_checked": 14, + "tabs_color_checked": "rgba(51,51,51,1)", + "tabs_weight": "bold", + "tabs_size": 14, + "tabs_color": "rgba(51,51,51,1)", + "tabs_icon_color_checked": "rgba(51,51,51,1)", + "tabs_icon_size_checked": 14, + "tabs_icon_color": "rgba(51,51,51,1)", + "tabs_icon_size": 14, + "tabs_top_img_radius": { + "radius": 100, + "radius_top_left": 100, + "radius_top_right": 100, + "radius_bottom_left": 100, + "radius_bottom_right": 100 + }, + "tabs_top_img_height": 39, + "is_tabs_img_background": "0", + "tabs_img_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "tabs_img_height": 20, + "tabs_spacing": 20, + "tabs_sign_spacing": 4, + "tabs_bg_direction": "90deg", + "tabs_bg_color_list": [ + { + "color": "" + } + ], + "tabs_bg_background_img_style": "2", + "tabs_bg_background_img": [], + "tabs_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "tabs_margin": { + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0 + }, + "tabs_padding": { + "padding": 10, + "padding_top": 10, + "padding_bottom": 10, + "padding_left": 10, + "padding_right": 10 + }, + "tabs_content": { + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0 + }, + "shop_content_direction": "90deg", + "shop_content_color_list": [ + { + "color": "" + } + ], + "shop_content_background_img_style": "2", + "shop_content_background_img": [], + "shop_content_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "shop_content_margin": { + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0 + }, + "shop_content_padding": { + "padding": 0, + "padding_top": 0, + "padding_bottom": 10, + "padding_left": 10, + "padding_right": 10 + }, + "shop_content_spacing": 0, + "shop_content": { + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0 + }, + "shop_direction": "90deg", + "shop_color_list": [ + { + "color": "#fff" + } + ], + "shop_background_img_style": "0", + "shop_background_img": [], + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "shop_margin": { + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0 + }, + "shop_padding": { + "padding": 10, + "padding_top": 10, + "padding_bottom": 10, + "padding_left": 10, + "padding_right": 10 + }, + "shop_img_radius": { + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0 + }, + "shop_radius": { + "radius": 8, + "radius_top_left": 8, + "radius_top_right": 8, + "radius_bottom_left": 8, + "radius_bottom_right": 8 + }, + "content_outer_spacing": 10, + "content_spacing": 10, + "content_outer_height": 232, + "content_img_width": 0, + "content_img_height": 0, + "is_roll": "1", + "interval_time": 3, + "rolling_fashion": "translation", + "shop_title_typeface": "bold", + "shop_title_size": 14, + "shop_title_color": "#333333", + "shop_simple_desc_typeface": "400", + "shop_simple_desc_size": 12, + "shop_simple_desc_color": "#999", + "title_simple_desc_spacing": 4, + "shop_price_typeface": "bold", + "shop_price_size": 18, + "shop_price_color": "#EA3323;", + "shop_price_symbol_color": "#EA3323", + "shop_price_symbol_size": 9, + "shop_price_unit_color": "#EA3323", + "shop_price_unit_size": 9, + "shop_original_price_color": "#999", + "shop_original_price_size": 12, + "shop_sold_number_typeface": "400", + "shop_sold_number_size": 10, + "shop_sold_number_color": "#999999", + "shop_score_typeface": "400", + "shop_score_size": 10, + "shop_score_color": "#999999", + "shop_button_typeface": "400", + "shop_button_size": 12, + "shop_button_color": [ + { + "color": "#FF3D53" + }, + { + "color": "#D73A3A" + } + ], + "shop_button_text_color": "#fff", + "shop_icon_size": 10, + "shop_icon_color": "#fff", + "subscript_style": { + "seckill_subscript_location": "top-left", + "text_or_icon_color": "#fff", + "text_or_icon_size": 12, + "img_width": 20, + "img_height": 20, + "direction": "90deg", + "top_or_bottom_spacing": 0, + "left_or_right_spacing": 0, + "color_list": [ + { + "color": "#FF7607" + } + ], + "background_img_style": "2", + "background_img": [], + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 4, + "radius_top_left": 4, + "radius_top_right": 4, + "radius_bottom_left": 4, + "radius_bottom_right": 4, + "padding": 0, + "padding_top": 0, + "padding_bottom": 0, + "padding_left": 10, + "padding_right": 10, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0 + }, + "common_style": { + "direction": "90deg", + "color_list": [ + { + "color": "" + } + ], + "background_img_style": "0", + "floating_up": 0, + "module_z_index": 0, + "padding_top_safe_value": 0, + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "padding": 0, + "padding_top": 0, + "padding_bottom": 0, + "padding_left": 0, + "padding_right": 0, + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "background_img": [] + }, + "offset_number_percentage": "NaN" } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" + } + }, + { + "name": "商品列表", + "mark_name": "", + "show_tabs": "0", + "is_enable": "1", + "id": "d47d6fbe882f68d69d74972b7bbfbadf", + "key": "goods-list", + "com_data": { + "content": { + "content_top": { + "time_value": "" + }, + "theme": "0", + "data_type": "1", + "keywords": "", + "carousel_col": 3, + "product_show_list": [], + "data_list": [], + "data_auto_list": [ + { + "id": 115, + "brand_id": 0, + "site_type": -1, + "title": "测试", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-01", + "coding": "11", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779992950817492.png", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 4, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 15:12:41", + "upd_time": "2026-06-08 21:44:21", + "data_index": 1, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=115", + "photo": [ + { + "id": 2360, + "goods_id": 115, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776496358725362.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926261 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2860, + "goods_id": 115, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2861, + "goods_id": 115, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2862, + "goods_id": 115, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2863, + "goods_id": 115, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2864, + "goods_id": 115, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:21" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 114, + "brand_id": 0, + "site_type": -1, + "title": "一个演唱会 1", + "title_color": "", + "simple_desc": "一个测试的票务商品1", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-05-31", + "coding": "123123", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 45, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779992701975689.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\",\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"],\"69e707d6-8ad2-2fc9-4756-34cb659057f5\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"},{\"name\":\"新放映室 2\",\"map\":[\"AAAAAAABB\",\"BBB__BBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},\"B\":{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}},\"id\":\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"}]}},{\"template_id\":7,\"selected_rooms\":[],\"selected_sections\":[],\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 5, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 09:25:40", + "upd_time": "2026-06-08 21:44:33", + "data_index": 2, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=114", + "photo": [ + { + "id": 2361, + "goods_id": 114, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776475250378533.gif", + "is_show": 1, + "sort": 0, + "add_time": 1780926273 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2870, + "goods_id": 114, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2871, + "goods_id": 114, + "value": [ + { + "name": "测试场馆", + "images": "" + }, + { + "name": "万达国际电影城(朝阳国贸店)", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2872, + "goods_id": 114, + "value": [ + { + "name": "老展厅 1", + "images": "" + }, + { + "name": "新放映室 2", + "images": "" + }, + { + "name": "主要展厅", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2873, + "goods_id": 114, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2874, + "goods_id": 114, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "1排6座", + "images": "" + }, + { + "name": "1排7座", + "images": "" + }, + { + "name": "1排8座", + "images": "" + }, + { + "name": "1排9座", + "images": "" + }, + { + "name": "2排8座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:33" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 116, + "brand_id": 0, + "site_type": 1, + "title": "测试3", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-05", + "coding": "33", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779993176477948.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 41, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 22:51:39", + "upd_time": "2026-06-08 21:44:12", + "data_index": 3, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=116", + "photo": [ + { + "id": 2359, + "goods_id": 116, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776523860991125.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926252 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2850, + "goods_id": 116, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2851, + "goods_id": 116, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2852, + "goods_id": 116, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2853, + "goods_id": 116, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2854, + "goods_id": 116, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:12" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 117, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-07", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/18\/1779080134751494.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 1, + "access_count": 87, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 23:04:54", + "upd_time": "2026-06-08 16:43:48", + "data_index": 4, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=117", + "photo": [ + { + "id": 2357, + "goods_id": 117, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776524584185996.png", + "is_show": 1, + "sort": 0, + "add_time": 1780908228 + } + ], + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2830, + "goods_id": 117, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2831, + "goods_id": 117, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2832, + "goods_id": 117, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2833, + "goods_id": 117, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2834, + "goods_id": 117, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:43:48" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 119, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "一个测试商品", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-04", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 30, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/13\/1778636390391913.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}},{\"template_id\":7,\"selected_rooms\":[\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"],\"selected_sections\":{\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[{\"name\":\"主要展厅\",\"map\":[\"AA_AA\",\"AABAA\",\"BBBBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 115, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-05-18 12:55:37", + "upd_time": "2026-06-08 16:40:49", + "data_index": 5, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=119", + "photo": [ + { + "id": 2355, + "goods_id": 119, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/18\/1779080134751494.jpg", + "is_show": 1, + "sort": 0, + "add_time": 1780908049 + } + ], + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2810, + "goods_id": 119, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2811, + "goods_id": 119, + "value": [ + { + "name": "测试场馆", + "images": "" + }, + { + "name": "万达国际电影城(朝阳国贸店)", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2812, + "goods_id": 119, + "value": [ + { + "name": "老展厅 1", + "images": "" + }, + { + "name": "主要展厅", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2813, + "goods_id": 119, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2814, + "goods_id": 119, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:40:49" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 118, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "#流行 #摇滚", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-06", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 59, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/13\/1778636390391913.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\",\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"],\"69e707d6-8ad2-2fc9-4756-34cb659057f5\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"07:00\",\"end\":\"09:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"},{\"name\":\"新放映室 2\",\"map\":[\"AAAAAAABB\",\"BBB__BBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},\"B\":{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}},\"id\":\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"}]},\"city_id\":38},{\"template_id\":7,\"selected_rooms\":[\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"],\"selected_sections\":{\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\":[\"B\",\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"},{\"start\":\"11:00\",\"end\":\"13:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[{\"name\":\"主要展厅\",\"map\":[\"AA_AA\",\"AABAA\",\"BBBBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 5, + "access_count": 945, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "流行,摇滚", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-19 00:06:49", + "upd_time": "2026-06-08 16:43:33", + "data_index": 6, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=118", + "photo": [ + { + "id": 2356, + "goods_id": 118, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/19\/1776528325465120.png", + "is_show": 1, + "sort": 0, + "add_time": 1780908213 + } + ], + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2820, + "goods_id": 118, + "value": [ + { + "name": "07:00-09:59", + "images": "" + }, + { + "name": "08:00-23:59", + "images": "" + }, + { + "name": "11:00-13:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2821, + "goods_id": 118, + "value": [ + { + "name": "测试场馆", + "images": "" + }, + { + "name": "万达国际电影城(朝阳国贸店)", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2822, + "goods_id": 118, + "value": [ + { + "name": "老展厅 1", + "images": "" + }, + { + "name": "新放映室 2", + "images": "" + }, + { + "name": "主要展厅", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2823, + "goods_id": 118, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2824, + "goods_id": 118, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "1排6座", + "images": "" + }, + { + "name": "1排7座", + "images": "" + }, + { + "name": "1排8座", + "images": "" + }, + { + "name": "1排9座", + "images": "" + }, + { + "name": "2排8座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:43:33" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + } + ], + "data_ids": "", + "is_price_solo": "1", + "category_ids": [ + 888 + ], + "brand_ids": [], + "number": 20, + "order_by_type": 0, + "order_by_rule": 0, + "is_show": [ + "title", + "plugins_view_icon", + "price", + "sales_count", + "original_price", + "simple_desc" + ], + "simple_desc_row": "2", + "static_img": [ + { + "id": 2, + "url": "http:\/\/localhost:10000\/static\/upload\/images\/diy\/6\/2026\/05\/11\/price.png", + "original": "角标", + "title": "角标", + "ext": ".png", + "type": "img" + } + ], + "is_shop_show": "0", + "shop_type": "text", + "shop_button_text": "购买", + "shop_button_icon_class": "cart", + "shop_button_effect": "0", + "seckill_subscript_show": "0", + "subscript_type": "text", + "subscript_img_src": [], + "subscript_icon_class": "", + "subscript_text": "角标" }, - "B": { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" + "style": { + "shop_direction": "90deg", + "shop_color_list": [ + { + "color": "#fff" + } + ], + "shop_background_img_style": "0", + "shop_background_img": [], + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "shop_padding": { + "padding": 10, + "padding_top": 10, + "padding_bottom": 10, + "padding_left": 10, + "padding_right": 10 + }, + "shop_margin": { + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0 + }, + "shop_img_radius": { + "radius": 4, + "radius_top_left": 4, + "radius_top_right": 4, + "radius_bottom_left": 4, + "radius_bottom_right": 4 + }, + "shop_radius": { + "radius": 8, + "radius_top_left": 8, + "radius_top_right": 8, + "radius_bottom_left": 8, + "radius_bottom_right": 8 + }, + "content_outer_spacing": 10, + "content_spacing": 10, + "content_outer_height": 232, + "content_img_width": 110, + "content_img_height": 120, + "is_roll": "1", + "interval_time": 3, + "rolling_fashion": "translation", + "shop_title_typeface": "bold", + "shop_title_size": 14, + "shop_title_color": "#333333", + "shop_simple_desc_typeface": "400", + "shop_simple_desc_size": 12, + "shop_simple_desc_color": "#999", + "title_simple_desc_spacing": 4, + "shop_price_typeface": "bold", + "shop_price_size": 18, + "shop_price_color": "#EA3323;", + "shop_price_symbol_color": "#EA3323", + "shop_price_symbol_size": 9, + "shop_price_unit_color": "#EA3323", + "shop_price_unit_size": 9, + "shop_original_price_color": "#999", + "shop_original_price_size": 12, + "shop_sold_number_typeface": "400", + "shop_sold_number_size": 10, + "shop_sold_number_color": "#999999", + "shop_score_typeface": "400", + "shop_score_size": 10, + "shop_score_color": "#999999", + "shop_button_typeface": "400", + "shop_button_size": 12, + "shop_button_color": [ + { + "color": "#FF3D53" + }, + { + "color": "#D73A3A" + } + ], + "shop_button_text_color": "#fff", + "shop_icon_size": 10, + "shop_icon_color": "#fff", + "subscript_style": { + "seckill_subscript_location": "top-left", + "text_or_icon_color": "#fff", + "text_or_icon_size": 12, + "img_width": 20, + "img_height": 20, + "direction": "90deg", + "top_or_bottom_spacing": 0, + "left_or_right_spacing": 0, + "color_list": [ + { + "color": "#FF7607" + } + ], + "background_img_style": "2", + "background_img": [], + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 4, + "radius_top_left": 4, + "radius_top_right": 4, + "radius_bottom_left": 4, + "radius_bottom_right": 4, + "padding": 0, + "padding_top": 0, + "padding_bottom": 0, + "padding_left": 10, + "padding_right": 10, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0 + }, + "common_style": { + "direction": "90deg", + "color_list": [ + { + "color": "" + } + ], + "background_img_style": "0", + "floating_up": 0, + "module_z_index": 0, + "padding_top_safe_value": 0, + "border_is_show": "0", + "border_color": "#FF3F3F", + "border_style": "solid", + "border_size": { + "padding": 1, + "padding_top": 1, + "padding_right": 1, + "padding_bottom": 1, + "padding_left": 1 + }, + "padding": 10, + "padding_top": 10, + "padding_bottom": 10, + "padding_left": 10, + "padding_right": 10, + "margin": 0, + "margin_top": 0, + "margin_bottom": 0, + "margin_left": 0, + "margin_right": 0, + "radius": 0, + "radius_top_left": 0, + "radius_top_right": 0, + "radius_bottom_left": 0, + "radius_bottom_right": 0, + "box_shadow_color": "", + "box_shadow_x": 0, + "box_shadow_y": 0, + "box_shadow_blur": 0, + "box_shadow_spread": 0, + "background_img": [] + }, + "offset_number_percentage": "NaN" } - }, - "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47" + } } ], - "layout_cols": 10, - "layout_rows": 10 + "tabs_data": [] }, - "万达国际电影城(朝阳国贸店)_主要展厅_B": { - "template_key": "万达国际电影城(朝阳国贸店)_主要展厅_B", - "name": "万达国际电影城(朝阳国贸店)", - "room_name": "主要展厅", - "section_name": "B", - "seat_map": { - "venue": { - "name": "北京市朝阳区万达国际电影城", - "address": "中国北京市朝阳区国贸建国路93号", - "location": { - "lng": "116.471099", - "lat": "39.907398" - }, - "images": [ - "https://www.ruyifilm.com/image/20190101/W020160119569970428777.jpg", - "https://www.ruyifilm.com/image/20190101/W020160119569970447104.jpg" - ], - "notices": { - "buy": [], - "watch": [], - "service": [ - { - "title": "近视镜", - "desc": "近视观众请自备近视眼镜", - "status": "warning" - } - ] - } - }, - "rooms": [ - { - "name": "主要展厅", - "map": [ - "AA_AA", - "AABAA", - "BBBBB" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - }, - "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47" - } - ] - }, - "rooms": [ - { - "name": "主要展厅", - "map": [ - "AA_AA", - "AABAA", - "BBBBB" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 999, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 299, - "color": "#1677ff" - } - }, - "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47" - } - ], - "layout_cols": 10, - "layout_rows": 10 - } + "access_count": 39, + "is_enable": 1, + "add_time": "2026-05-11 15:13:25", + "upd_time": "2026-06-08 16:54:04" }, - "peer_goods": [ - { - "id": 116, - "title": "测试3", - "date": "" - }, - { - "id": 117, - "title": "测试4", - "date": "" - } - ], - "meta": { - "seat_count": 30, - "template_count": 4, - "cache_hit": false, - "computed_at": 1779080970 + "cart_total": { + "buy_number": 0, + "total_price": 0 } } } \ No newline at end of file diff --git a/docs/test2.json b/docs/test2.json index 68a7b0e..bd85606 100644 --- a/docs/test2.json +++ b/docs/test2.json @@ -1,1201 +1,1499 @@ { + "msg": "处理成功", "code": 0, - "msg": "success", "data": { - "goods_id": 118, - "group_by": [ - "section", - "venue", - "session", - "room" - ], - "tree": { - "sections": { - "A": { - "name": "A", - "venues": { - "测试场馆": { - "name": "测试场馆", - "sessions": { - "07:00-09:59": { - "name": "07:00-09:59", - "rooms": { - "老展厅 1": { - "name": "老展厅 1", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排3座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排4座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排4座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排5座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "1排5座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排6座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排6座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排7座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排7座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "2排7座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排6座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排6座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "A", - "seat": "3排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 10, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "新放映室 2": { - "name": "新放映室 2", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排1座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排2座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排3座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排3座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排4座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排4座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排5座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排5座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排6座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排6座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排7座": { - "spec_key": "$vr-分区=A|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排7座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "A", - "seat": "1排7座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 7, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 17, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 17, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "万达国际电影城(朝阳国贸店)": { - "name": "万达国际电影城(朝阳国贸店)", - "sessions": { - "08:00-23:59": { - "name": "08:00-23:59", - "rooms": { - "主要展厅": { - "name": "主要展厅", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "1排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排4座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排5座": { - "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "A", - "seat": "2排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 999, - "max_price": 999 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 999, - "max_price": 999 - }, - "11:00-13:59": { - "name": "11:00-13:59", - "rooms": { - "主要展厅": { - "name": "主要展厅", - "seats": { - "1排1座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "1排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排2座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "1排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排4座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "1排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "1排5座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "1排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "2排1座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "2排2座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排4座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "2排4座", - "price": 999, - "inventory": 1, - "original_price": 0 - }, - "2排5座": { - "spec_key": "$vr-分区=A|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "A", - "seat": "2排5座", - "price": 999, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 999, - "max_price": 999 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 999, - "max_price": 999 - } - }, - "inventory": 16, - "has_available": true, - "min_price": 999, - "max_price": 999 - } - }, - "inventory": 33, - "has_available": true, - "min_price": 0, - "max_price": 999 + "page_start": 0, + "page_size": "20", + "page": 1, + "page_total": 1, + "total": 8, + "data": [ + { + "id": 118, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "#流行 #摇滚", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-06", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 59, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/13\/1778636390391913.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\",\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"],\"69e707d6-8ad2-2fc9-4756-34cb659057f5\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"07:00\",\"end\":\"09:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"},{\"name\":\"新放映室 2\",\"map\":[\"AAAAAAABB\",\"BBB__BBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},\"B\":{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}},\"id\":\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"}]},\"city_id\":38},{\"template_id\":7,\"selected_rooms\":[\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"],\"selected_sections\":{\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\":[\"B\",\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"},{\"start\":\"11:00\",\"end\":\"13:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[{\"name\":\"主要展厅\",\"map\":[\"AA_AA\",\"AABAA\",\"BBBBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 5, + "access_count": 945, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "流行,摇滚", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-19 00:06:49", + "upd_time": "2026-06-08 16:43:33", + "data_index": 1, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" }, - "B": { - "name": "B", - "venues": { - "测试场馆": { - "name": "测试场馆", - "sessions": { - "07:00-09:59": { + "goods_url": "\/pages\/goods-detail\/goods-detail?id=118", + "photo": [ + { + "id": 2356, + "goods_id": 118, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/19\/1776528325465120.png", + "is_show": 1, + "sort": 0, + "add_time": 1780908213 + } + ], + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2820, + "goods_id": 118, + "value": [ + { "name": "07:00-09:59", - "rooms": { - "老展厅 1": { - "name": "老展厅 1", - "seats": { - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "2排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排1座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排1座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排2座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排2座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排3座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排3座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排4座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排4座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排4座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "3排5座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=3排5座|$vr-演播室=老展厅 1", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "老展厅 1", - "section": "B", - "seat": "3排5座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "新放映室 2": { - "name": "新放映室 2", - "seats": { - "1排8座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排8座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "1排8座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "1排9座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=1排9座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "1排9座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排1座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排1座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排1座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排2座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排2座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排2座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排3座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排3座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排6座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排6座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排6座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排7座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排7座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排7座", - "price": 0, - "inventory": 1, - "original_price": 0 - }, - "2排8座": { - "spec_key": "$vr-分区=B|$vr-场次=07:00-09:59|$vr-场馆=测试场馆|$vr-座位号=2排8座|$vr-演播室=新放映室 2", - "venue": "测试场馆", - "session": "07:00-09:59", - "room": "新放映室 2", - "section": "B", - "seat": "2排8座", - "price": 0, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 8, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 14, - "has_available": true, - "min_price": 0, - "max_price": 0 - } - }, - "inventory": 14, - "has_available": true, - "min_price": 0, - "max_price": 0 - }, - "万达国际电影城(朝阳国贸店)": { - "name": "万达国际电影城(朝阳国贸店)", - "sessions": { - "08:00-23:59": { + "images": "" + }, + { "name": "08:00-23:59", - "rooms": { - "主要展厅": { - "name": "主要展厅", - "seats": { - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "2排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排1座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排1座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排2座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排2座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排3座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排4座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排4座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排5座": { - "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "08:00-23:59", - "room": "主要展厅", - "section": "B", - "seat": "3排5座", - "price": 299, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 299, - "max_price": 299 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 299, - "max_price": 299 + "images": "" }, - "11:00-13:59": { + { "name": "11:00-13:59", - "rooms": { - "主要展厅": { - "name": "主要展厅", - "seats": { - "2排3座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "2排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排1座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排1座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "3排1座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排2座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排2座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "3排2座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排3座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排3座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "3排3座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排4座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排4座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "3排4座", - "price": 299, - "inventory": 1, - "original_price": 0 - }, - "3排5座": { - "spec_key": "$vr-分区=B|$vr-场次=11:00-13:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排5座|$vr-演播室=主要展厅", - "venue": "万达国际电影城(朝阳国贸店)", - "session": "11:00-13:59", - "room": "主要展厅", - "section": "B", - "seat": "3排5座", - "price": 299, - "inventory": 1, - "original_price": 0 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 299, - "max_price": 299 - } - }, - "inventory": 6, - "has_available": true, - "min_price": 299, - "max_price": 299 - } - }, - "inventory": 12, - "has_available": true, - "min_price": 299, - "max_price": 299 - } - }, - "inventory": 26, - "has_available": true, - "min_price": 0, - "max_price": 299 - } - }, - "venues": [], - "sessions": [], - "rooms": [] - }, - "seat_templates": { - "测试场馆_老展厅 1_A": { - "template_key": "测试场馆_老展厅 1_A", - "name": "测试场馆", - "room_name": "老展厅 1", - "section_name": "A", - "seat_map": { - "venue": { - "name": "一个测试场馆信息", - "address": "嘉庚体育馆", - "location": { - "lng": "", - "lat": "" - }, - "images": [ - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s", - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s" - ] - }, - "rooms": [ - { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" + "images": "" } ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" + "name": "$vr-场次", + "add_time": "2026-06-08 16:43:33" }, { - "name": "新放映室 2", - "map": [ - "AAAAAAABB", - "BBB__BBB" - ], - "sections": [ + "id": 2821, + "goods_id": 118, + "value": [ { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" + "name": "测试场馆", + "images": "" }, { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" + "name": "万达国际电影城(朝阳国贸店)", + "images": "" } ], - "seats": { - "A": { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" + "name": "$vr-场馆", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2822, + "goods_id": 118, + "value": [ + { + "name": "老展厅 1", + "images": "" }, - "B": { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" + { + "name": "新放映室 2", + "images": "" + }, + { + "name": "主要展厅", + "images": "" } - }, - "id": "69e707d6-8ad2-2fc9-4756-34cb659057f5" + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2823, + "goods_id": 118, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:43:33" + }, + { + "id": 2824, + "goods_id": 118, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "1排6座", + "images": "" + }, + { + "name": "1排7座", + "images": "" + }, + { + "name": "1排8座", + "images": "" + }, + { + "name": "1排9座", + "images": "" + }, + { + "name": "2排8座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:43:33" } ] }, - "rooms": [ + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 119, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "一个测试商品", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-04", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 30, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/13\/1778636390391913.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}},{\"template_id\":7,\"selected_rooms\":[\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"],\"selected_sections\":{\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[{\"name\":\"主要展厅\",\"map\":[\"AA_AA\",\"AABAA\",\"BBBBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"6a03d61e-25bc-eb5c-467a-9077b5f26e47\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 115, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-05-18 12:55:37", + "upd_time": "2026-06-08 16:40:49", + "data_index": 2, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=119", + "photo": [ { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - }, - { - "name": "新放映室 2", - "map": [ - "AAAAAAABB", - "BBB__BBB" - ], - "sections": [ - { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" - }, - { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" - } - ], - "seats": { - "A": { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" - }, - "B": { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" - } - }, - "id": "69e707d6-8ad2-2fc9-4756-34cb659057f5" + "id": 2355, + "goods_id": 119, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/18\/1779080134751494.jpg", + "is_show": 1, + "sort": 0, + "add_time": 1780908049 } ], - "layout_cols": 10, - "layout_rows": 10 - }, - "测试场馆_老展厅 1_B": { - "template_key": "测试场馆_老展厅 1_B", - "name": "测试场馆", - "room_name": "老展厅 1", - "section_name": "B", - "seat_map": { - "venue": { - "name": "一个测试场馆信息", - "address": "嘉庚体育馆", - "location": { - "lng": "", - "lat": "" - }, - "images": [ - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s", - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s" - ] - }, - "rooms": [ + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ + "id": 2810, + "goods_id": 119, + "value": [ { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" + "name": "08:00-23:59", + "images": "" } ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" + "name": "$vr-场次", + "add_time": "2026-06-08 16:40:49" }, { - "name": "新放映室 2", - "map": [ - "AAAAAAABB", - "BBB__BBB" - ], - "sections": [ + "id": 2811, + "goods_id": 119, + "value": [ { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" + "name": "测试场馆", + "images": "" }, { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" + "name": "万达国际电影城(朝阳国贸店)", + "images": "" } ], - "seats": { - "A": { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" + "name": "$vr-场馆", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2812, + "goods_id": 119, + "value": [ + { + "name": "老展厅 1", + "images": "" }, - "B": { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" + { + "name": "主要展厅", + "images": "" } - }, - "id": "69e707d6-8ad2-2fc9-4756-34cb659057f5" + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2813, + "goods_id": 119, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:40:49" + }, + { + "id": 2814, + "goods_id": 119, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:40:49" } ] }, - "rooms": [ + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 117, + "brand_id": 0, + "site_type": -1, + "title": "「多日多场测试」", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-07", + "coding": "444", + "model": "", + "produce_company": "", + "produce_region": 150, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/18\/1779080134751494.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 1, + "access_count": 87, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 23:04:54", + "upd_time": "2026-06-08 16:43:48", + "data_index": 3, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=117", + "photo": [ { - "name": "老展厅 1", - "map": [ - "AAAAA", - "AAB__AA", - "BBBBBA" - ], - "sections": [ - { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - ], - "seats": { - "A": { - "char": "A", - "name": "VIP区", - "price": 0, - "color": "#ff4d4f" - }, - "B": { - "char": "B", - "name": "普通区", - "price": 0, - "color": "#1677ff" - } - }, - "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad" - }, - { - "name": "新放映室 2", - "map": [ - "AAAAAAABB", - "BBB__BBB" - ], - "sections": [ - { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" - }, - { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" - } - ], - "seats": { - "A": { - "char": "A", - "name": "默认分区", - "price": 0, - "color": "#1677ff" - }, - "B": { - "char": "B", - "name": " 免费区", - "price": 0, - "color": "#21416e" - } - }, - "id": "69e707d6-8ad2-2fc9-4756-34cb659057f5" + "id": 2357, + "goods_id": 117, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776524584185996.png", + "is_show": 1, + "sort": 0, + "add_time": 1780908228 } ], - "layout_cols": 10, - "layout_rows": 10 + "produce_region_name": "厦门市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2830, + "goods_id": 117, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2831, + "goods_id": 117, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2832, + "goods_id": 117, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2833, + "goods_id": 117, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 16:43:48" + }, + { + "id": 2834, + "goods_id": 117, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 16:43:48" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 110, + "brand_id": 31, + "site_type": -1, + "title": "测试周边", + "title_color": "", + "simple_desc": "一个测试周边", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "", + "coding": "", + "model": "深灰色 XL", + "produce_company": "", + "produce_region": 9, + "inventory": 88888, + "inventory_unit": "件", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2023\/08\/15\/1692079963737575.png", + "original_price": "0.00", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 0, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "normal", + "vr_goods_config": "", + "content_web": "

\"截屏2023-08-15<\/p>

\"截屏2023-08-15<\/p>

\"截屏2023-08-15<\/p>

\"截屏2023-08-15<\/p>

\"截屏2023-08-15<\/p>

\"截屏2023-08-15<\/p>

<\/p>", + "photo_count": 1, + "sales_count": 0, + "access_count": 65, + "video": "", + "is_exist_many_spec": 0, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2023-08-15 14:18:12", + "upd_time": "2026-05-29 02:18:38", + "data_index": 4, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0.00", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=110", + "photo": [ + { + "id": 2330, + "goods_id": 110, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2023\/08\/15\/1692079963737575.png", + "is_show": 1, + "sort": 0, + "add_time": 1779992318 + } + ], + "produce_region_name": "上海市", + "brand_name": "鳄鱼", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=31", + "specifications": [], + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 116, + "brand_id": 0, + "site_type": 1, + "title": "测试3", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-05", + "coding": "33", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779993176477948.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 41, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 22:51:39", + "upd_time": "2026-06-08 21:44:12", + "data_index": 5, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=116", + "photo": [ + { + "id": 2359, + "goods_id": 116, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776523860991125.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926252 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2850, + "goods_id": 116, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2851, + "goods_id": 116, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2852, + "goods_id": 116, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2853, + "goods_id": 116, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:12" + }, + { + "id": 2854, + "goods_id": 116, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:12" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 109, + "brand_id": 30, + "site_type": -1, + "title": "测试周边 2", + "title_color": "", + "simple_desc": "测试周边 2测试周边 2测试周边 2", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "", + "coding": "", + "model": "801(米白)1D1D50101040 170\/88A\/L", + "produce_company": "", + "produce_region": 19, + "inventory": 88888, + "inventory_unit": "件", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2023\/08\/15\/1692079154656558.png", + "original_price": "800.00", + "min_original_price": "800.00", + "max_original_price": "800.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 0, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "normal", + "vr_goods_config": "", + "content_web": "

\"362ae8e5b9862e3f.jpeg\"\/<\/p>

\"31219b6040aaa923.jpeg\"\/<\/p>

\"104fd41433eacdb3.jpeg\"\/<\/p>

\"2119b3d91942a7ab.jpeg\"\/<\/p>

\"4060f6ee9716eda4.jpeg\"\/<\/p>", + "photo_count": 1, + "sales_count": 0, + "access_count": 11, + "video": "", + "is_exist_many_spec": 0, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2023-08-15 14:03:37", + "upd_time": "2026-05-29 02:22:07", + "data_index": 6, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "800.00", + "min_original_price": "800.00", + "max_original_price": "800.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=109", + "photo": [ + { + "id": 2332, + "goods_id": 109, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2023\/08\/15\/1692079154656558.png", + "is_show": 1, + "sort": 0, + "add_time": 1779992527 + } + ], + "produce_region_name": "广东省", + "brand_name": "七匹狼", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=30", + "specifications": [], + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 114, + "brand_id": 0, + "site_type": -1, + "title": "一个演唱会 1", + "title_color": "", + "simple_desc": "一个测试的票务商品1", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-05-31", + "coding": "123123", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 45, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779992701975689.jpg", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\",\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\",\"B\"],\"69e707d6-8ad2-2fc9-4756-34cb659057f5\":[\"A\",\"B\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"},{\"name\":\"新放映室 2\",\"map\":[\"AAAAAAABB\",\"BBB__BBB\"],\"sections\":[{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"默认分区\",\"price\":0,\"color\":\"#1677ff\"},\"B\":{\"char\":\"B\",\"name\":\" 免费区\",\"price\":0,\"color\":\"#21416e\"}},\"id\":\"69e707d6-8ad2-2fc9-4756-34cb659057f5\"}]}},{\"template_id\":7,\"selected_rooms\":[],\"selected_sections\":[],\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"北京市朝阳区万达国际电影城\",\"address\":\"中国北京市朝阳区国贸建国路93号\",\"location\":{\"lng\":\"116.471099\",\"lat\":\"39.907398\"},\"images\":[\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970428777.jpg\",\"https:\/\/www.ruyifilm.com\/image\/20190101\/W020160119569970447104.jpg\"],\"notices\":{\"buy\":[],\"watch\":[],\"service\":[{\"title\":\"近视镜\",\"desc\":\"近视观众请自备近视眼镜\",\"status\":\"warning\"}]}},\"rooms\":[]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 5, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 09:25:40", + "upd_time": "2026-06-08 21:44:33", + "data_index": 7, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=114", + "photo": [ + { + "id": 2361, + "goods_id": 114, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776475250378533.gif", + "is_show": 1, + "sort": 0, + "add_time": 1780926273 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2870, + "goods_id": 114, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2871, + "goods_id": 114, + "value": [ + { + "name": "测试场馆", + "images": "" + }, + { + "name": "万达国际电影城(朝阳国贸店)", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2872, + "goods_id": 114, + "value": [ + { + "name": "老展厅 1", + "images": "" + }, + { + "name": "新放映室 2", + "images": "" + }, + { + "name": "主要展厅", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2873, + "goods_id": 114, + "value": [ + { + "name": "A", + "images": "" + }, + { + "name": "B", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:33" + }, + { + "id": 2874, + "goods_id": 114, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排3座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排1座", + "images": "" + }, + { + "name": "3排2座", + "images": "" + }, + { + "name": "3排3座", + "images": "" + }, + { + "name": "3排4座", + "images": "" + }, + { + "name": "3排5座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + }, + { + "name": "1排6座", + "images": "" + }, + { + "name": "1排7座", + "images": "" + }, + { + "name": "1排8座", + "images": "" + }, + { + "name": "1排9座", + "images": "" + }, + { + "name": "2排8座", + "images": "" + }, + { + "name": "2排4座", + "images": "" + }, + { + "name": "2排5座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:33" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" + }, + { + "id": 115, + "brand_id": 0, + "site_type": -1, + "title": "测试", + "title_color": "", + "simple_desc": "", + "spec_desc": "", + "approval_number": "", + "approval_number_expire": "", + "batch_number": "", + "batch_number_expire": "2026-06-01", + "coding": "11", + "model": "", + "produce_company": "", + "produce_region": 36, + "inventory": 10, + "inventory_unit": "张", + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/05\/29\/1779992950817492.png", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00", + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "give_integral": 0, + "buy_min_number": 1, + "buy_max_number": 1, + "is_deduction_inventory": 1, + "is_shelves": 1, + "item_type": "ticket", + "vr_goods_config": "[{\"template_id\":5,\"selected_rooms\":[\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"],\"selected_sections\":{\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\":[\"A\"]},\"sessions\":[{\"start\":\"08:00\",\"end\":\"23:59\"}],\"template_snapshot\":{\"venue\":{\"name\":\"一个测试场馆信息\",\"address\":\"嘉庚体育馆\",\"location\":{\"lng\":\"\",\"lat\":\"\"},\"images\":[\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s\",\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s\"]},\"rooms\":[{\"name\":\"老展厅 1\",\"map\":[\"AAAAA\",\"AAB__AA\",\"BBBBBA\"],\"sections\":[{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}],\"seats\":{\"A\":{\"char\":\"A\",\"name\":\"VIP区\",\"price\":0,\"color\":\"#ff4d4f\"},\"B\":{\"char\":\"B\",\"name\":\"普通区\",\"price\":0,\"color\":\"#1677ff\"}},\"id\":\"69e5b802-c71e-4cc2-437f-2f1ef5f6afad\"}]}}]", + "content_web": "", + "photo_count": 1, + "sales_count": 0, + "access_count": 4, + "video": "", + "is_exist_many_spec": 1, + "spec_base": "", + "use_guide": "", + "sort_level": 0, + "share_images": "", + "seo_title": "", + "seo_keywords": "", + "seo_desc": "", + "is_delete_time": 0, + "add_time": "2026-04-18 15:12:41", + "upd_time": "2026-06-08 21:44:21", + "data_index": 8, + "show_field_original_price_text": "原价", + "show_original_price_symbol": "¥", + "show_original_price_unit": "", + "show_field_original_price_status": "1", + "show_field_price_text": "售价", + "show_price_symbol": "¥", + "show_price_unit": "", + "show_field_price_status": "1", + "show_sales_number_status": "1", + "show_inventory_status": "1", + "plugins_view_panel_data": [], + "plugins_view_icon_data": [], + "price_container": { + "price": "0.00", + "min_price": "0.00", + "max_price": "0.00", + "original_price": "0", + "min_original_price": "0.00", + "max_original_price": "0.00" + }, + "goods_url": "\/pages\/goods-detail\/goods-detail?id=115", + "photo": [ + { + "id": 2360, + "goods_id": 115, + "images": "http:\/\/localhost:10000\/static\/upload\/images\/goods\/2026\/04\/18\/1776496358725362.png", + "is_show": 1, + "sort": 0, + "add_time": 1780926261 + } + ], + "produce_region_name": "北京市", + "brand_name": "", + "brand_goods_url": "\/pages\/goods-search\/goods-search?brand=0", + "specifications": { + "choose": [ + { + "id": 2860, + "goods_id": 115, + "value": [ + { + "name": "08:00-23:59", + "images": "" + } + ], + "name": "$vr-场次", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2861, + "goods_id": 115, + "value": [ + { + "name": "测试场馆", + "images": "" + } + ], + "name": "$vr-场馆", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2862, + "goods_id": 115, + "value": [ + { + "name": "老展厅 1", + "images": "" + } + ], + "name": "$vr-演播室", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2863, + "goods_id": 115, + "value": [ + { + "name": "A", + "images": "" + } + ], + "name": "$vr-分区", + "add_time": "2026-06-08 21:44:21" + }, + { + "id": 2864, + "goods_id": 115, + "value": [ + { + "name": "1排1座", + "images": "" + }, + { + "name": "1排2座", + "images": "" + }, + { + "name": "1排3座", + "images": "" + }, + { + "name": "1排4座", + "images": "" + }, + { + "name": "1排5座", + "images": "" + }, + { + "name": "2排1座", + "images": "" + }, + { + "name": "2排2座", + "images": "" + }, + { + "name": "2排6座", + "images": "" + }, + { + "name": "2排7座", + "images": "" + }, + { + "name": "3排6座", + "images": "" + } + ], + "name": "$vr-座位号", + "add_time": "2026-06-08 21:44:21" + } + ] + }, + "user_cart_count": 0, + "is_error": 0, + "error_msg": "" } - }, - "meta": { - "seat_count": 59, - "template_count": 2, - "cache_hit": false, - "computed_at": 1778865524 - } + ] } } \ No newline at end of file diff --git a/shopxo/app/event.php b/shopxo/app/event.php index 0a750de..d81562d 100644 --- a/shopxo/app/event.php +++ b/shopxo/app/event.php @@ -101,15 +101,15 @@ return array ( array ( 0 => 'app\\plugins\\vr_ticket\\Hook', ), - 'plugins_service_goods_list_begin' => + 'plugins_service_goods_list_begin' => array ( 0 => 'app\\plugins\\vr_ticket\\Hook', ), - 'plugins_service_search_goods_list_begin' => + 'plugins_service_search_goods_list_begin' => array ( 0 => 'app\\plugins\\vr_ticket\\Hook', ), - 'plugins_service_search_goods_list_result' => + 'plugins_service_search_goods_list_result' => array ( 0 => 'app\\plugins\\vr_ticket\\Hook', ), diff --git a/shopxo/app/plugins/vr_ticket/Hook.php b/shopxo/app/plugins/vr_ticket/Hook.php index 9b32f45..565348f 100644 --- a/shopxo/app/plugins/vr_ticket/Hook.php +++ b/shopxo/app/plugins/vr_ticket/Hook.php @@ -383,6 +383,107 @@ class Hook } } + // ────────────────────────────────────────────────────── + // Step 3: 观影人信息校验(新增) + // ────────────────────────────────────────────────────── + // 1. 获取前端提交的 viewer_data + $viewerData = $params['data']['viewer_data'] ?? []; + if (!is_array($viewerData)) { + $viewerData = []; + } + + // 2. 获取商品配置中的观影人要求 + $viewerConfig = null; + foreach ($goodsItems as $item) { + $gid = intval($item['goods_id'] ?? 0); + if ($gid <= 0) continue; + + // 只查询票务商品 + $isTicketGood = isset($ticketGoodsMap[$gid]) && $ticketGoodsMap[$gid]['has_config']; + if (!$isTicketGood) continue; + + $goods = Db::name('Goods')->where('id', $gid)->field('vr_goods_config')->find(); + if (!empty($goods['vr_goods_config'])) { + $config = json_decode($goods['vr_goods_config'], true); + if (is_array($config) && !empty($config[0]['viewer_config'])) { + $viewerConfig = $config[0]['viewer_config']; + break; + } + } + } + + // 3. 如果商品要求观影人信息,进行校验 + if (!empty($viewerConfig) && !empty($viewerConfig['require_viewer'])) { + // 检查 viewer_data 是否存在且为数组 + if (empty($viewerData)) { + return [ + 'code' => -1, + 'msg' => '请填写观影人信息', + ]; + } + + // 阶段1:只支持单个观影人(require_viewer_per_seat=0) + $perSeat = !empty($viewerConfig['require_viewer_per_seat']) ? $viewerConfig['require_viewer_per_seat'] : 0; + if ($perSeat == 0) { + if (count($viewerData) != 1) { + return [ + 'code' => -1, + 'msg' => '当前商品只需填写一个观影人信息', + ]; + } + } else { + return [ + 'code' => -1, + 'msg' => '暂不支持每个座位独立填写观影人', + ]; + } + + // 4. 遍历校验每个观影人的字段 + $viewer = $viewerData[0] ?? []; + + // 手机号校验 + if (!empty($viewerConfig['require_viewer_mobile'])) { + if (empty($viewer['mobile'])) { + return [ + 'code' => -1, + 'msg' => '请填写观影人手机号', + ]; + } + if (!preg_match('/^1[3-9]\d{9}$/', $viewer['mobile'])) { + return [ + 'code' => -1, + 'msg' => '手机号格式不正确', + ]; + } + } + + // 姓名校验 + if (!empty($viewerConfig['require_viewer_name'])) { + if (empty($viewer['name'])) { + return [ + 'code' => -1, + 'msg' => '请填写观影人姓名', + ]; + } + } + + // 身份证号校验(阶段1预留) + if (!empty($viewerConfig['require_viewer_idcard'])) { + if (empty($viewer['idcard'])) { + return [ + 'code' => -1, + 'msg' => '请填写观影人身份证号', + ]; + } + if (!preg_match('/^\d{17}[\dXx]$/', $viewer['idcard'])) { + return [ + 'code' => -1, + 'msg' => '身份证号格式不正确', + ]; + } + } + } + return ['code' => 0, 'msg' => '']; } diff --git a/shopxo/app/plugins/vr_ticket/api/Ticket.php b/shopxo/app/plugins/vr_ticket/api/Ticket.php index 611f16b..fc93bd0 100644 --- a/shopxo/app/plugins/vr_ticket/api/Ticket.php +++ b/shopxo/app/plugins/vr_ticket/api/Ticket.php @@ -113,6 +113,23 @@ class Ticket * * GET /api.php?s=plugins/index&pluginsname=vr_ticket&pluginscontrol=ticket&pluginsaction=list * + * 支持两种模式: + * + * 【模式 1:传统分页】 + * - page: 页码,默认 1 + * - page_size: 每页数量,默认 20,最大 100 + * + * 【模式 2:瀑布流】(last_id > 0 或传入 limit 时启用) + * - last_id: 游标 ID,0 表示首次加载 + * - limit: 每次拉取数量,默认 20,最大 100 + * - order_by: 排序方向,desc(降序,历史) / asc(升序,新数据),默认 desc + * + * 通用筛选参数: + * - order_id: 按单个订单ID筛选 + * - order_ids: 按多个订单ID批量筛选,逗号分隔,如 41,42,43 + * - goods_id: 按商品ID筛选 + * - status: 按核销状态筛选 (0=未核销, 1=已核销, 2=已退款) + * * @return Json */ public function list() @@ -122,15 +139,70 @@ class Ticket return self::unauthorized(); } - try { - $tickets = WalletService::getUserTickets($userId); + // 解析筛选参数 + $orderId = input('order_id', 0, 'intval'); + $orderIdsStr = input('order_ids', '', 'trim'); + $orderIds = !empty($orderIdsStr) ? array_filter(array_map('intval', explode(',', $orderIdsStr))) : null; + $goodsId = input('goods_id', 0, 'intval'); + $status = input('status', null, 'intval'); - return self::success([ - 'tickets' => $tickets, - 'count' => count($tickets), - ]); - } catch (\Exception $e) { - return self::error('获取票列表失败: ' . $e->getMessage()); + // 判断模式:瀑布流 vs 分页 + $lastId = input('last_id', 0, 'intval'); + $hasLimitParam = input('limit') !== null && input('limit') !== ''; + + if ($lastId > 0 || $hasLimitParam) { + // 瀑布流模式 + $limit = min(100, max(1, intval(input('limit', 20)))); + $orderByInput = strtolower(trim(input('order_by', 'desc'))); + $orderBy = in_array($orderByInput, ['asc', 'desc']) ? $orderByInput : 'desc'; + + try { + $result = WalletService::getUserTicketsWaterfall( + $userId, + $lastId, + $orderBy, + $limit, + $orderId, + $orderIds, + $goodsId, + $status + ); + + return self::success([ + 'tickets' => $result['list'], + 'has_more' => $result['has_more'], + 'last_id' => $result['last_id'], + 'count' => $result['count'], + ]); + } catch (\Exception $e) { + return self::error('获取票列表失败: ' . $e->getMessage()); + } + } else { + // 传统分页模式(保持兼容) + $page = max(1, intval(input('page', 1))); + $pageSize = min(100, max(1, intval(input('page_size', 20)))); + + try { + $result = WalletService::getUserTicketsPaginated( + $userId, + $orderId, + $orderIds, + $goodsId, + $status, + $page, + $pageSize + ); + + return self::success([ + 'tickets' => $result['list'], + 'total' => $result['total'], + 'page' => $result['page'], + 'page_size' => $result['page_size'], + 'pages' => $result['pages'], + ]); + } catch (\Exception $e) { + return self::error('获取票列表失败: ' . $e->getMessage()); + } } } diff --git a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php index 60ccece..0c14847 100644 --- a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php +++ b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php @@ -83,7 +83,7 @@ class AdminGoodsSave

- +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
@@ -220,6 +268,17 @@ class AdminGoodsSave } if (!c.selected_sections) c.selected_sections = {}; + // 【新增】确保 viewer_config 结构完整(兼容老数据) + if (!c.viewer_config) { + c.viewer_config = { + require_viewer: 0, + require_viewer_per_seat: 0, + require_viewer_mobile: 1, + require_viewer_name: 0, + require_viewer_idcard: 0 + }; + } + // 【核心清洗】过滤非法 room ID const validRooms = getRooms(c.template_id); const validRoomIds = validRooms.map(r => String(r.id)); @@ -269,6 +328,14 @@ class AdminGoodsSave selected_rooms: [], selected_sections: {}, sessions: defaultSessions(), + // 新增:观影人配置默认值 + viewer_config: { + require_viewer: 0, + require_viewer_per_seat: 0, + require_viewer_mobile: 1, // 默认必填 + require_viewer_name: 0, + require_viewer_idcard: 0 + } }; }); }; diff --git a/shopxo/app/plugins/vr_ticket/install.sql b/shopxo/app/plugins/vr_ticket/install.sql index 4fc6db1..8a5ed15 100644 --- a/shopxo/app/plugins/vr_ticket/install.sql +++ b/shopxo/app/plugins/vr_ticket/install.sql @@ -39,7 +39,8 @@ CREATE TABLE IF NOT EXISTS `{{prefix}}vr_tickets` ( KEY `idx_goods_id` (`goods_id`), KEY `idx_verify_status` (`verify_status`), KEY `idx_created_at` (`created_at`), - KEY `idx_spec_base_id` (`spec_base_id`) + KEY `idx_spec_base_id` (`spec_base_id`), + KEY `idx_issued_at` (`issued_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='VR票务电子票'; CREATE TABLE IF NOT EXISTS `{{prefix}}vr_verifiers` ( diff --git a/shopxo/app/plugins/vr_ticket/service/WalletService.php b/shopxo/app/plugins/vr_ticket/service/WalletService.php index e529aec..82f2990 100644 --- a/shopxo/app/plugins/vr_ticket/service/WalletService.php +++ b/shopxo/app/plugins/vr_ticket/service/WalletService.php @@ -270,4 +270,247 @@ class WalletService extends BaseService return substr($phone, 0, 3) . '****' . substr($phone, -4); } + + /** + * 格式化票据列表数据(统一格式化逻辑,供 getUserTicketsPaginated 复用) + * + * @param array $tickets 原始票据数组 + * @return array 格式化后的票据列表 + */ + private static function formatTickets(array $tickets): array + { + if (empty($tickets)) { + return []; + } + + // 批量获取商品信息(减少 N+1 查询) + $goodsIds = array_filter(array_column($tickets, 'goods_id')); + $goodsMap = []; + $goodsImageMap = []; + if (!empty($goodsIds)) { + $goodsList = \think\facade\Db::name('Goods') + ->where('id', 'in', $goodsIds) + ->field('id, title, images') + ->select() + ->toArray(); + foreach ($goodsList as $goods) { + $goodsMap[$goods['id']] = $goods['title'] ?? ''; + $goodsImageMap[$goods['id']] = $goods['images'] ?? ''; + } + } + + $result = []; + foreach ($tickets as $ticket) { + // 生成短码 + $shortCode = self::shortCodeEncode($ticket['goods_id'], $ticket['id']); + + // 优先从 seat_info 解析(5维 pipe 格式),兜底从 goods_snapshot 解析 + $seatInfo = self::parseSeatInfo($ticket['seat_info'] ?? ''); + $snapshot = json_decode($ticket['goods_snapshot'] ?? '{}', true); + $snapshotKeys = array_filter([ + 'session' => $snapshot['session'] ?? '', + 'venue' => $snapshot['venue'] ?? '', + 'studio' => $snapshot['studio'] ?? '', + 'section' => $snapshot['section'] ?? '', + 'seat' => $snapshot['seat'] ?? '' + ]); + if (empty($seatInfo['session']) && !empty($snapshotKeys)) { + $seatInfo = array_merge($seatInfo, $snapshotKeys); + } + + // goods_snapshot 里没有 session/venue 时,从商品表补全 + if (empty($seatInfo['session']) || empty($seatInfo['venue'])) { + $goodsTitle = $goodsMap[$ticket['goods_id']] ?? '已下架商品'; + $goods = \think\facade\Db::name('Goods')->where('id', $ticket['goods_id'])->find(); + $vrConfig = json_decode($goods['vr_goods_config'] ?? '', true); + if (!empty($vrConfig[0]['template_id'])) { + $template = \think\facade\Db::name('vr_seat_templates') + ->where('id', $vrConfig[0]['template_id'])->find(); + if (empty($seatInfo['venue'])) $seatInfo['venue'] = $template['name'] ?? ''; + if (empty($seatInfo['session'])) { + $sessions = $vrConfig[0]['sessions'] ?? []; + $seatInfo['session'] = !empty($sessions[0]['start']) && !empty($sessions[0]['end']) + ? ($sessions[0]['start'] . '-' . $sessions[0]['end']) : ''; + } + } + } + if (empty($seatInfo['venue'])) $seatInfo['venue'] = $snapshot['venue'] ?? ''; + if (empty($seatInfo['session'])) $seatInfo['session'] = $snapshot['session'] ?? ''; + + $result[] = [ + 'id' => $ticket['id'], + 'order_id' => $ticket['order_id'], // 新增:便于前端按订单筛选 + 'goods_id' => $ticket['goods_id'], + 'goods_title' => $goodsMap[$ticket['goods_id']] ?? '已下架商品', + 'goods_image' => $goodsImageMap[$ticket['goods_id']] ?? '', + 'seat_info' => $ticket['seat_info'] ?? '', + 'seat_number' => self::parseSeatNumber($ticket['seat_info'] ?? ''), + 'session_time' => $seatInfo['session'] ?? '', + 'venue_name' => $seatInfo['venue'] ?? '', + 'real_name' => $ticket['real_name'] ?? '', + 'phone' => self::maskPhone($ticket['phone'] ?? ''), + 'verify_status' => $ticket['verify_status'], + 'issued_at' => $ticket['issued_at'], + 'short_code' => $shortCode, + ]; + } + + return $result; + } + + /** + * 获取用户票列表(支持分页 + 订单/商品筛选) + * + * @param int $userId 用户ID + * @param int|null $orderId 单个订单ID + * @param array|null $orderIds 多个订单ID数组 + * @param int|null $goodsId 商品ID + * @param int|null $status 核销状态 (0=未核销, 1=已核销, 2=已退款) + * @param int $page 页码 + * @param int $pageSize 每页数量 + * @return array ['list' => [], 'total' => int, 'page' => int, 'page_size' => int, 'pages' => int] + */ + public static function getUserTicketsPaginated( + int $userId, + ?int $orderId = null, + ?array $orderIds = null, + ?int $goodsId = null, + ?int $status = null, + int $page = 1, + int $pageSize = 20 + ): array { + $where = [ + ['user_id', '=', $userId] + ]; + + // 按单个订单ID筛选 + if ($orderId > 0) { + $where[] = ['order_id', '=', $orderId]; + } + + // 按多个订单ID批量筛选 + if (!empty($orderIds) && is_array($orderIds)) { + $where[] = ['order_id', 'in', $orderIds]; + } + + // 按商品ID筛选 + if ($goodsId > 0) { + $where[] = ['goods_id', '=', $goodsId]; + } + + // 按核销状态筛选 + if ($status !== null) { + $where[] = ['verify_status', '=', $status]; + } + + // 计算总数 + $total = \think\facade\Db::name('vr_tickets')->where($where)->count(); + $pages = $pageSize > 0 ? ceil($total / $pageSize) : 1; + + // 分页查询 + $offset = ($page - 1) * $pageSize; + $tickets = \think\facade\Db::name('vr_tickets') + ->where($where) + ->order('issued_at', 'desc') + ->limit($offset, $pageSize) + ->select() + ->toArray(); + + // 格式化返回数据 + $formatted = self::formatTickets($tickets); + + return [ + 'list' => $formatted, + 'total' => $total, + 'page' => $page, + 'page_size' => $pageSize, + 'pages' => $pages, + ]; + } + + /** + * 获取用户票列表(瀑布流模式) + * + * @param int $userId 用户ID + * @param int $lastId 游标ID,0 表示首次加载 + * @param string $orderBy 排序方向:'desc' 降序(历史)/ 'asc' 升序(新数据) + * @param int $limit 每次拉取数量 + * @param int|null $orderId 单个订单ID + * @param array|null $orderIds 多个订单ID数组 + * @param int|null $goodsId 商品ID + * @param int|null $status 核销状态 + * @return array ['list' => [], 'has_more' => bool, 'last_id' => int, 'count' => int] + */ + public static function getUserTicketsWaterfall( + int $userId, + int $lastId = 0, + string $orderBy = 'desc', + int $limit = 20, + ?int $orderId = null, + ?array $orderIds = null, + ?int $goodsId = null, + ?int $status = null + ): array { + $where = [ + ['user_id', '=', $userId] + ]; + + // 按单个订单ID筛选 + if ($orderId > 0) { + $where[] = ['order_id', '=', $orderId]; + } + + // 按多个订单ID批量筛选 + if (!empty($orderIds) && is_array($orderIds)) { + $where[] = ['order_id', 'in', $orderIds]; + } + + // 按商品ID筛选 + if ($goodsId > 0) { + $where[] = ['goods_id', '=', $goodsId]; + } + + // 按核销状态筛选 + if ($status !== null) { + $where[] = ['verify_status', '=', $status]; + } + + // 游标筛选 + if ($lastId > 0) { + if ($orderBy === 'asc') { + // 升序:获取 ID > last_id 的数据(新数据) + $where[] = ['id', '>', $lastId]; + } else { + // 降序:获取 ID < last_id 的数据(历史数据) + $where[] = ['id', '<', $lastId]; + } + } + + // 查询数据(limit + 1 用于判断 has_more) + $tickets = \think\facade\Db::name('vr_tickets') + ->where($where) + ->order('id', $orderBy === 'asc' ? 'asc' : 'desc') + ->limit($limit + 1) + ->select() + ->toArray(); + + // 判断是否还有更多数据 + $hasMore = count($tickets) > $limit; + if ($hasMore) { + array_pop($tickets); // 移除多查询的一条 + } + + // 获取本次返回的最后一条 ID + $newLastId = !empty($tickets) ? end($tickets)['id'] : $lastId; + + // 格式化返回数据 + $formatted = self::formatTickets($tickets); + + return [ + 'list' => $formatted, + 'has_more' => $hasMore, + 'last_id' => $newLastId, + 'count' => count($formatted), + ]; + } } From e053e03c7c5725481bfd9f4b737645740edd33db Mon Sep 17 00:00:00 2001 From: Council Date: Thu, 25 Jun 2026 17:16:58 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat(ticket):=20=E7=A5=A8=E5=8A=A1=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=90=8E=E5=8F=B0=E5=A2=9E=E5=BC=BA=20-=20=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA=E3=80=81=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E7=AD=9B=E9=80=89=E4=BF=AE=E5=A4=8D=E3=80=81=E8=A7=82?= =?UTF-8?q?=E5=BD=B1=E4=BA=BA=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Admin.php: 票详情页新增订单信息、用户信息展示 - Hook.php: 修复城市筛选只对票务商品生效 - Ticket.php: 核销记录新增短码、观演人手机号、订单号、购买者信息 - AdminGoodsSaveHandle.php: 新增商品保存后置处理 - SKU重建、价格刷新、缓存清理 - AdminGoodsSave.php: 观影人配置UI优化 - detail.html: 票详情页重构 - 新增订单信息展示面板 - list.html: 票列表新增订单号、手机号列,优化列宽 --- shopxo/app/plugins/vr_ticket/Hook.php | 32 +++- shopxo/app/plugins/vr_ticket/admin/Admin.php | 21 +++ shopxo/app/plugins/vr_ticket/api/Ticket.php | 38 +++- .../plugins/vr_ticket/hook/AdminGoodsSave.php | 6 +- .../vr_ticket/hook/AdminGoodsSaveHandle.php | 34 ++++ .../vr_ticket/view/admin/ticket/detail.html | 174 +++++++++--------- .../vr_ticket/view/admin/ticket/list.html | 24 ++- 7 files changed, 230 insertions(+), 99 deletions(-) diff --git a/shopxo/app/plugins/vr_ticket/Hook.php b/shopxo/app/plugins/vr_ticket/Hook.php index 565348f..6548ea5 100644 --- a/shopxo/app/plugins/vr_ticket/Hook.php +++ b/shopxo/app/plugins/vr_ticket/Hook.php @@ -508,6 +508,7 @@ class Hook * 触发位置:plugins_service_goods_list_begin * * 向下兼容:无 user_lng/user_lat 参数时,不添加任何筛选,返回全部商品 + * 修复:只对票务商品(vr_goods_config 非空)应用城市筛选,非票务商品不受影响 * * @param array &$params 钩子参数引用 ['hook_name','is_backend','params','where','field','order_by','m','n'] */ @@ -540,12 +541,22 @@ class Hook return; } - // 注入 produce_region 城市筛选条件 + // 修复:只对票务商品应用城市筛选 + // 逻辑:(非票务商品 vr_goods_config='') OR (票务商品且城市匹配) $where = &$params['where']; if (!is_array($where)) { $where = []; } - $where[] = ['g.produce_region', '=', $cityId]; + + // 使用闭包实现 OR 条件:vr_goods_config 为空(非票务) OR produce_region = 城市ID + $where[] = function($query) use ($cityId) { + $query->where(function($q) { + $q->where('g.vr_goods_config', '=', ''); + })->whereOr(function($q) use ($cityId) { + $q->where('g.vr_goods_config', '<>', '')->where('g.produce_region', '=', $cityId); + }); + }; + // @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnGoodsListBegin: city filter applied to ticket goods only, cityId=$cityId\n", FILE_APPEND); } /** @@ -553,6 +564,7 @@ class Hook * 触发位置:plugins_service_search_goods_list_begin * * 向下兼容:无 user_lng/user_lat 参数时,不添加任何筛选,返回全部商品 + * 修复:只对票务商品(vr_goods_config 非空)应用城市筛选,非票务商品不受影响 * * @param array &$params 钩子参数引用 ['hook_name','is_backend','params','where_base','where_keywords','where_screening_price','field','order_by','page','page_start','page_size'] */ @@ -586,13 +598,23 @@ class Hook return; } - // 注入 produce_region 城市筛选条件(SearchService 使用 where_base 而非 where) + // 修复:只对票务商品应用城市筛选 + // 逻辑:(非票务商品 vr_goods_config='') OR (票务商品且城市匹配) + // SearchService 使用 where_base 而非 where $whereBase = &$params['where_base']; if (!is_array($whereBase)) { $whereBase = []; } - $whereBase[] = ['g.produce_region', '=', $cityId]; - // [调试代码] @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnSearchListBegin: city filter applied, cityId=$cityId\n", FILE_APPEND); + + // 使用闭包实现 OR 条件:vr_goods_config 为空(非票务) OR produce_region = 城市ID + $whereBase[] = function($query) use ($cityId) { + $query->where(function($q) { + $q->where('g.vr_goods_config', '=', ''); + })->whereOr(function($q) use ($cityId) { + $q->where('g.vr_goods_config', '<>', '')->where('g.produce_region', '=', $cityId); + }); + }; + // [调试代码] @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnSearchListBegin: city filter applied to ticket goods only, cityId=$cityId\n", FILE_APPEND); } /** diff --git a/shopxo/app/plugins/vr_ticket/admin/Admin.php b/shopxo/app/plugins/vr_ticket/admin/Admin.php index 82cd6be..b1511dd 100644 --- a/shopxo/app/plugins/vr_ticket/admin/Admin.php +++ b/shopxo/app/plugins/vr_ticket/admin/Admin.php @@ -197,6 +197,18 @@ class Admin extends Common $goods = \think\facade\Db::name('Goods')->find($ticket['goods_id']); + // 查询订单信息 + $order = []; + $user = []; + if ($ticket['order_id'] > 0) { + $order = \think\facade\Db::name('Order')->find($ticket['order_id']); + + // 查询用户信息 + if (!empty($order) && $order['user_id'] > 0) { + $user = \think\facade\Db::name('User')->find($order['user_id']); + } + } + $verifier = []; if ($ticket['verifier_id'] > 0) { $verifier = \think\facade\Db::name('vr_verifiers')->find($ticket['verifier_id']); @@ -204,6 +216,12 @@ class Admin extends Common $ticket['qr_code_url'] = \app\plugins\vr_ticket\service\TicketService::getQrCodeUrl($ticket['ticket_code']); + // 提取短码(从 qr_data 的前半部分) + $short_code = ''; + if (!empty($ticket['qr_data']) && strpos($ticket['qr_data'], '|') !== false) { + $short_code = explode('|', $ticket['qr_data'], 2)[0]; + } + $verifiers = \think\facade\Db::name('vr_verifiers') ->where('status', 1) ->order('id', 'asc') @@ -212,8 +230,11 @@ class Admin extends Common return MyView('../../../plugins/vr_ticket/view/admin/ticket/detail', [ 'ticket' => $ticket, 'goods' => $goods, + 'order' => $order, + 'user' => $user, 'verifier' => $verifier, 'verifiers' => $verifiers, + 'short_code'=> $short_code, ]); } diff --git a/shopxo/app/plugins/vr_ticket/api/Ticket.php b/shopxo/app/plugins/vr_ticket/api/Ticket.php index fc93bd0..5aef3b7 100644 --- a/shopxo/app/plugins/vr_ticket/api/Ticket.php +++ b/shopxo/app/plugins/vr_ticket/api/Ticket.php @@ -381,7 +381,8 @@ class Ticket ->where($where) ->order('id', 'desc') ->page($page, $page_size) - ->select(); + ->select() + ->toArray(); $total = \think\facade\Db::name('vr_verifications') ->where($where) ->count(); @@ -389,12 +390,28 @@ class Ticket // 关联票和商品信息 $ticket_ids = array_filter(array_column($list, 'ticket_id')); $tickets_map = []; + $user_ids = []; if (!empty($ticket_ids)) { $tickets_raw = \think\facade\Db::name('vr_tickets') ->where('id', 'in', $ticket_ids) - ->select(); + ->select() + ->toArray(); foreach ($tickets_raw as $t) { $tickets_map[$t['id']] = $t; + if (!empty($t['user_id'])) { + $user_ids[] = $t['user_id']; + } + } + } + + $users_map = []; + if (!empty($user_ids)) { + $users_raw = \think\facade\Db::name('User') + ->where('id', 'in', array_unique($user_ids)) + ->select() + ->toArray(); + foreach ($users_raw as $u) { + $users_map[$u['id']] = !empty($u['nickname']) ? $u['nickname'] : (!empty($u['username']) ? $u['username'] : '用户' . $u['id']); } } @@ -410,12 +427,27 @@ class Ticket $result = []; foreach ($list as $v) { $ticket = $tickets_map[$v['ticket_id']] ?? []; + + // 提取短码(从 qr_data 的前半部分) + $short_code = ''; + if (!empty($ticket['qr_data']) && strpos($ticket['qr_data'], '|') !== false) { + $short_code = explode('|', $ticket['qr_data'], 2)[0]; + } else { + $short_code = !empty($ticket['ticket_code']) ? substr($ticket['ticket_code'], 0, 8) : ''; + } + + $buyer_name = $users_map[$ticket['user_id'] ?? 0] ?? ''; + $result[] = [ 'id' => $v['id'], 'ticket_id' => $v['ticket_id'], 'ticket_code' => $v['ticket_code'], + 'short_code' => $short_code, 'seat_info' => $ticket['seat_info'] ?? '', - 'real_name' => $ticket['real_name'] ?? '', + 'real_name' => $ticket['real_name'] ?? '', + 'phone' => $ticket['phone'] ?? '', + 'order_no' => $ticket['order_no'] ?? '', + 'buyer_name' => $buyer_name, 'goods_title' => $goods_map[$v['goods_id']] ?? '已下架商品', 'created_at' => $v['created_at'], ]; diff --git a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php index 0c14847..fd2d314 100644 --- a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php +++ b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php @@ -140,7 +140,7 @@ class AdminGoodsSave
@@ -157,11 +157,11 @@ class AdminGoodsSave
-
+ +
- +
+
-
票条形码
-
-
- - -
-

票码:{{$ticket.ticket_code}}

- - -
- -
-
-
- - - {{if $ticket.status == 0}} -
-
核销操作
+
订单信息
-
- -
- -
-
+ {{if !empty($order)}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
订单号{{$order.order_no}}
用户昵称{{if !empty($user)}}{{$user.nickname|default=$user.username|default='未设置'}}{{else}}-{{/if}}
订单状态 + {{if $order.status == 0}} + 待确认 + {{elseif $order.status == 1}} + 待支付 + {{elseif $order.status == 2}} + 待发货 + {{elseif $order.status == 3}} + 待收货 + {{elseif $order.status == 4}} + 已完成 + {{elseif $order.status == 5}} + 已取消 + {{elseif $order.status == 6}} + 已关闭 + {{else}} + 未知 + {{/if}} +
支付状态 + {{if isset($order.pay_status) && $order.pay_status == 1}} + 已支付 + {{else}} + 未支付 + {{/if}} +
订单金额¥{{$order.total_price|default='0.00'}}
购买数量{{$order.buy_number_count|default='0'}} 张票
支付方式{{if !empty($order.payment_name)}}{{$order.payment_name}}{{else}}-{{/if}}
支付时间{{if !empty($order.pay_time) && $order.pay_time > 0}}{{:date('Y-m-d H:i:s', $order.pay_time)}}{{else}}未支付{{/if}}
下单时间{{if !empty($order.add_time)}}{{:date('Y-m-d H:i:s', $order.add_time)}}{{else}}-{{/if}}
用户备注{{if !empty($order.user_note)}}{{$order.user_note}}{{else}}{{/if}}
+ {{else}} +

订单信息不存在或已删除

+ {{/if}}
- {{/if}} +
- - + {{:ModuleInclude('public/footer')}} \ No newline at end of file diff --git a/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html b/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html index 048ba8b..2ad03a4 100644 --- a/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html +++ b/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html @@ -9,6 +9,20 @@ border-bottom: 2px solid #e8e8e8; margin-bottom: 20px; } + /* 列宽优化 */ + .ticket-list-table th:nth-child(4), /* 手机号 */ + .ticket-list-table td:nth-child(4) { + width: 12%; /* 增加100% */ + min-width: 110px; + } + .ticket-list-table th:nth-child(5), /* 座位信息 */ + .ticket-list-table td:nth-child(5) { + width: 8%; /* 缩减30% */ + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + }
@@ -89,11 +103,13 @@
电子票列表 共 {{$count|default=0}} 条
- +
+ + @@ -105,8 +121,10 @@ {{if !empty($list)}} {{volist name="list" id="ticket"}} + + - + {{/if}} From 70354300ebab56e79536edfc4fa485df2d25daeb Mon Sep 17 00:00:00 2001 From: Council Date: Thu, 25 Jun 2026 17:17:07 +0800 Subject: [PATCH 5/5] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=20AGENTS=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20&=20=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- CLAUDE.md | 2 +- ag-stop-probe.json | 2543 ++++++++++++++++++++-------------------- test_php81_warning.php | 15 + 4 files changed, 1320 insertions(+), 1242 deletions(-) create mode 100644 test_php81_warning.php diff --git a/AGENTS.md b/AGENTS.md index dced6fd..a021364 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26578 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26682 symbols, 57680 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/CLAUDE.md b/CLAUDE.md index dced6fd..a021364 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **vr-shopxo-plugin** (26578 symbols, 57490 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **vr-shopxo-plugin** (26682 symbols, 57680 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/ag-stop-probe.json b/ag-stop-probe.json index ead2bdb..efe7f11 100644 --- a/ag-stop-probe.json +++ b/ag-stop-probe.json @@ -1,25 +1,27 @@ { - "ts": "2026-05-19T19:52:59.301Z", + "ts": "2026-06-25T09:12:17.655Z", "source": "auto-on-generation-start", "contexts": [ { "ctxId": "main", - "frameUrl": "vscode-file://vscode-app/Applications/Antigravity.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html", - "totalBtns": 62, + "frameUrl": "vscode-file://vscode-app/Applications/Antigravity%20IDE.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html", + "totalBtns": 223, "inputBoxFound": true, "inputBoxBtns": [ { "aria": "Add context", "title": "", - "cls": "p-1.5 rounded-full hover:bg-gray-500/20 cursor-pointer", + "cls": "p-1.5 rounded-full text-secondary-foreground hover:bg-secondary cursor-pointer", "text": "", - "innerHTML": "<", "hasSvg": true, - "dataAttrs": {}, + "dataAttrs": { + "data-tooltip-id": "P0-1615" + }, "visible": true, "rect": { - "x": 772, - "y": 416, + "x": 1219, + "y": 1061, "w": 28, "h": 28 } @@ -28,52 +30,71 @@ "aria": "", "title": "", "cls": "", - "text": "Gemini 3 Flash", - "innerHTML": "", + "hasSvg": false, + "dataAttrs": { + "data-tooltip-id": "input-send-button-cancel-tooltip" + }, + "visible": true, + "rect": { + "x": 1760, + "y": 1063, + "w": 24, + "h": 24 + } } ], "buttons": [ @@ -87,7 +108,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1227, + "x": 1433, "y": 6, "w": 22, "h": 22 @@ -135,7 +156,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1323, + "x": 1529, "y": 6, "w": 22, "h": 22 @@ -151,14 +172,14 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1356, + "x": 1562, "y": 6, "w": 22, "h": 22 } }, { - "aria": "编辑器特定设置", + "aria": "Editor-Specific Settings", "title": "", "cls": "action-label codicon codicon-gear", "text": "", @@ -167,26 +188,26 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1380, + "x": 1586, "y": 6, "w": 22, "h": 22 } }, { - "aria": "Profile - New Antigravity update available.", + "aria": "Profile - New Antigravity IDE update available.", "title": "", - "cls": "action-item icon", + "cls": "action-item icon antigravity-profile", "text": "1", "innerHTML": "
Publish Branch", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 42, - "y": 900, - "w": 296, - "h": 22 + "x": 69, + "y": 82, + "w": 182, + "h": 28 } }, { - "aria": "Pin the Current Timeline", + "aria": "council/FrontendReviewer, Checkout Branch/Tag...", "title": "", - "cls": "action-label codicon codicon-timeline-pin", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Refresh", - "title": "", - "cls": "action-label codicon codicon-timeline-refresh", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Filter Timeline", - "title": "", - "cls": "action-label codicon codicon-timeline-filter", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "More Actions...", - "title": "", - "cls": "action-label codicon codicon-toolbar-more", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", + "cls": "action-label", + "text": "council/FrontendReviewer", + "innerHTML": " council/FrontendReviewer", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 198, - "y": 40, + "x": 183, + "y": 115, "w": 20, "h": 20 } }, { - "aria": "Close (⌘W)", + "aria": "Publish Branch", "title": "", - "cls": "action-label codicon codicon-close", + "cls": "action-label", "text": "", - "innerHTML": "", + "innerHTML": "", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 430, - "y": 40, + "x": 207, + "y": 115, "w": 20, "h": 20 } }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 607, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 957, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1308, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1518, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1654, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1907, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2050, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2252, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2379, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Split Editor Right (⌘\\) [⌥] Split Editor Down", - "title": "", - "cls": "action-label codicon codicon-split-horizontal", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 636, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Back (⌃-)", - "title": "", - "cls": "action-label codicon codicon-arrow-left", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 662, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Forward (⌃⇧-)", - "title": "", - "cls": "action-label codicon codicon-arrow-right", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 688, - "y": 39, - "w": 22, - "h": 22 - } - }, { "aria": "More Actions...", "title": "", @@ -647,16 +332,112 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 714, - "y": 39, - "w": 22, - "h": 22 + "x": 231, + "y": 115, + "w": 20, + "h": 20 } }, { - "aria": "Hide Panel (⌘J)", + "aria": "Publish Branch \"council/FrontendReviewer\"", "title": "", - "cls": "action-label codicon codicon-panel-close", + "cls": "monaco-button monaco-text-button", + "text": "Publish Branch", + "innerHTML": "Publish Branch", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 174, + "w": 182, + "h": 28 + } + }, + { + "aria": "fix/ticket-select-refresh*, Checkout Branch/Tag...", + "title": "", + "cls": "action-label", + "text": "fix/ticket-select-refresh*", + "innerHTML": " fix/ticket-select-refresh*", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 182, + "y": 207, + "w": 21, + "h": 20 + } + }, + { + "aria": "Publish Branch", + "title": "", + "cls": "action-label", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 207, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "action-label codicon codicon-toolbar-more", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 231, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "Commit Changes on \"fix/ticket-select-refresh\"", + "title": "", + "cls": "monaco-button monaco-text-button", + "text": "Commit", + "innerHTML": "Commit", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 266, + "w": 156, + "h": 28 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "monaco-button monaco-dropdown-button codicon codicon-drop-down-button", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 226, + "y": 266, + "w": 25, + "h": 28 + } + }, + { + "aria": "Open Changes", + "title": "", + "cls": "action-label codicon codicon-diff-multiple", "text": "", "innerHTML": "", "hasSvg": false, @@ -670,9 +451,9 @@ } }, { - "aria": "Maximize Secondary Side Bar Size", + "aria": "Discard All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-maximize", + "cls": "action-label codicon codicon-discard", "text": "", "innerHTML": "", "hasSvg": false, @@ -686,9 +467,9 @@ } }, { - "aria": "Hide Secondary Side Bar", + "aria": "Stage All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-close", + "cls": "action-label codicon codicon-add", "text": "", "innerHTML": "", "hasSvg": false, @@ -702,11 +483,251 @@ } }, { - "aria": "Agent Section", + "aria": "Open File", "title": "", - "cls": "pane-header expanded hidden", - "text": "Agent", - "innerHTML": "
<", "hasSvg": true, - "dataAttrs": {}, + "dataAttrs": { + "data-tooltip-id": "P0-1615" + }, "visible": true, "rect": { - "x": 772, - "y": 416, + "x": 1219, + "y": 1061, "w": 28, "h": 28 } @@ -745,52 +768,71 @@ "aria": "", "title": "", "cls": "", - "text": "Gemini 3 Flash", - "innerHTML": "
", + "hasSvg": false, + "dataAttrs": { + "data-tooltip-id": "input-send-button-cancel-tooltip" + }, + "visible": true, + "rect": { + "x": 1760, + "y": 1063, + "w": 24, + "h": 24 + } } ], "buttons": [ @@ -804,7 +846,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1227, + "x": 1433, "y": 6, "w": 22, "h": 22 @@ -852,7 +894,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1323, + "x": 1529, "y": 6, "w": 22, "h": 22 @@ -868,14 +910,14 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1356, + "x": 1562, "y": 6, "w": 22, "h": 22 } }, { - "aria": "编辑器特定设置", + "aria": "Editor-Specific Settings", "title": "", "cls": "action-label codicon codicon-gear", "text": "", @@ -884,26 +926,26 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1380, + "x": 1586, "y": 6, "w": 22, "h": 22 } }, { - "aria": "Profile - New Antigravity update available.", + "aria": "Profile - New Antigravity IDE update available.", "title": "", - "cls": "action-item icon", + "cls": "action-item icon antigravity-profile", "text": "1", "innerHTML": "
Publish Branch", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 42, - "y": 900, - "w": 296, - "h": 22 + "x": 69, + "y": 82, + "w": 182, + "h": 28 } }, { - "aria": "Pin the Current Timeline", + "aria": "council/FrontendReviewer, Checkout Branch/Tag...", "title": "", - "cls": "action-label codicon codicon-timeline-pin", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Refresh", - "title": "", - "cls": "action-label codicon codicon-timeline-refresh", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Filter Timeline", - "title": "", - "cls": "action-label codicon codicon-timeline-filter", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "More Actions...", - "title": "", - "cls": "action-label codicon codicon-toolbar-more", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", + "cls": "action-label", + "text": "council/FrontendReviewer", + "innerHTML": " council/FrontendReviewer", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 198, - "y": 40, + "x": 183, + "y": 115, "w": 20, "h": 20 } }, { - "aria": "Close (⌘W)", + "aria": "Publish Branch", "title": "", - "cls": "action-label codicon codicon-close", + "cls": "action-label", "text": "", - "innerHTML": "", + "innerHTML": "", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 430, - "y": 40, + "x": 207, + "y": 115, "w": 20, "h": 20 } }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 607, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 957, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1308, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1518, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1654, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1907, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2050, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2252, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2379, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Split Editor Right (⌘\\) [⌥] Split Editor Down", - "title": "", - "cls": "action-label codicon codicon-split-horizontal", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 636, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Back (⌃-)", - "title": "", - "cls": "action-label codicon codicon-arrow-left", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 662, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Forward (⌃⇧-)", - "title": "", - "cls": "action-label codicon codicon-arrow-right", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 688, - "y": 39, - "w": 22, - "h": 22 - } - }, { "aria": "More Actions...", "title": "", @@ -1364,16 +1070,112 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 714, - "y": 39, - "w": 22, - "h": 22 + "x": 231, + "y": 115, + "w": 20, + "h": 20 } }, { - "aria": "Hide Panel (⌘J)", + "aria": "Publish Branch \"council/FrontendReviewer\"", "title": "", - "cls": "action-label codicon codicon-panel-close", + "cls": "monaco-button monaco-text-button", + "text": "Publish Branch", + "innerHTML": "Publish Branch", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 174, + "w": 182, + "h": 28 + } + }, + { + "aria": "fix/ticket-select-refresh*, Checkout Branch/Tag...", + "title": "", + "cls": "action-label", + "text": "fix/ticket-select-refresh*", + "innerHTML": " fix/ticket-select-refresh*", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 182, + "y": 207, + "w": 21, + "h": 20 + } + }, + { + "aria": "Publish Branch", + "title": "", + "cls": "action-label", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 207, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "action-label codicon codicon-toolbar-more", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 231, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "Commit Changes on \"fix/ticket-select-refresh\"", + "title": "", + "cls": "monaco-button monaco-text-button", + "text": "Commit", + "innerHTML": "Commit", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 266, + "w": 156, + "h": 28 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "monaco-button monaco-dropdown-button codicon codicon-drop-down-button", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 226, + "y": 266, + "w": 25, + "h": 28 + } + }, + { + "aria": "Open Changes", + "title": "", + "cls": "action-label codicon codicon-diff-multiple", "text": "", "innerHTML": "", "hasSvg": false, @@ -1387,9 +1189,9 @@ } }, { - "aria": "Maximize Secondary Side Bar Size", + "aria": "Discard All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-maximize", + "cls": "action-label codicon codicon-discard", "text": "", "innerHTML": "", "hasSvg": false, @@ -1403,9 +1205,9 @@ } }, { - "aria": "Hide Secondary Side Bar", + "aria": "Stage All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-close", + "cls": "action-label codicon codicon-add", "text": "", "innerHTML": "", "hasSvg": false, @@ -1419,11 +1221,251 @@ } }, { - "aria": "Agent Section", + "aria": "Open File", "title": "", - "cls": "pane-header expanded hidden", - "text": "Agent", - "innerHTML": "
<", "hasSvg": true, - "dataAttrs": {}, + "dataAttrs": { + "data-tooltip-id": "P0-1615" + }, "visible": true, "rect": { - "x": 772, - "y": 416, + "x": 1219, + "y": 1061, "w": 28, "h": 28 } @@ -1462,52 +1506,71 @@ "aria": "", "title": "", "cls": "", - "text": "Gemini 3 Flash", - "innerHTML": "
", + "hasSvg": false, + "dataAttrs": { + "data-tooltip-id": "input-send-button-cancel-tooltip" + }, + "visible": true, + "rect": { + "x": 1760, + "y": 1063, + "w": 24, + "h": 24 + } } ], "buttons": [ @@ -1521,7 +1584,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1227, + "x": 1433, "y": 6, "w": 22, "h": 22 @@ -1569,7 +1632,7 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1323, + "x": 1529, "y": 6, "w": 22, "h": 22 @@ -1585,14 +1648,14 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1356, + "x": 1562, "y": 6, "w": 22, "h": 22 } }, { - "aria": "编辑器特定设置", + "aria": "Editor-Specific Settings", "title": "", "cls": "action-label codicon codicon-gear", "text": "", @@ -1601,26 +1664,26 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 1380, + "x": 1586, "y": 6, "w": 22, "h": 22 } }, { - "aria": "Profile - New Antigravity update available.", + "aria": "Profile - New Antigravity IDE update available.", "title": "", - "cls": "action-item icon", + "cls": "action-item icon antigravity-profile", "text": "1", "innerHTML": "
Publish Branch", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 42, - "y": 900, - "w": 296, - "h": 22 + "x": 69, + "y": 82, + "w": 182, + "h": 28 } }, { - "aria": "Pin the Current Timeline", + "aria": "council/FrontendReviewer, Checkout Branch/Tag...", "title": "", - "cls": "action-label codicon codicon-timeline-pin", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Refresh", - "title": "", - "cls": "action-label codicon codicon-timeline-refresh", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Filter Timeline", - "title": "", - "cls": "action-label codicon codicon-timeline-filter", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "More Actions...", - "title": "", - "cls": "action-label codicon codicon-toolbar-more", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": false, - "rect": { - "x": 0, - "y": 0, - "w": 0, - "h": 0 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", + "cls": "action-label", + "text": "council/FrontendReviewer", + "innerHTML": " council/FrontendReviewer", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 198, - "y": 40, + "x": 183, + "y": 115, "w": 20, "h": 20 } }, { - "aria": "Close (⌘W)", + "aria": "Publish Branch", "title": "", - "cls": "action-label codicon codicon-close", + "cls": "action-label", "text": "", - "innerHTML": "", + "innerHTML": "", "hasSvg": false, "dataAttrs": {}, "visible": true, "rect": { - "x": 430, - "y": 40, + "x": 207, + "y": 115, "w": 20, "h": 20 } }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 607, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 957, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1308, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1518, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1654, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 1907, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2050, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2252, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Close (⌘W)", - "title": "", - "cls": "action-label codicon codicon-close", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 2379, - "y": 40, - "w": 20, - "h": 20 - } - }, - { - "aria": "Split Editor Right (⌘\\) [⌥] Split Editor Down", - "title": "", - "cls": "action-label codicon codicon-split-horizontal", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 636, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Back (⌃-)", - "title": "", - "cls": "action-label codicon codicon-arrow-left", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 662, - "y": 39, - "w": 22, - "h": 22 - } - }, - { - "aria": "Go Forward (⌃⇧-)", - "title": "", - "cls": "action-label codicon codicon-arrow-right", - "text": "", - "innerHTML": "", - "hasSvg": false, - "dataAttrs": {}, - "visible": true, - "rect": { - "x": 688, - "y": 39, - "w": 22, - "h": 22 - } - }, { "aria": "More Actions...", "title": "", @@ -2081,16 +1808,112 @@ "dataAttrs": {}, "visible": true, "rect": { - "x": 714, - "y": 39, - "w": 22, - "h": 22 + "x": 231, + "y": 115, + "w": 20, + "h": 20 } }, { - "aria": "Hide Panel (⌘J)", + "aria": "Publish Branch \"council/FrontendReviewer\"", "title": "", - "cls": "action-label codicon codicon-panel-close", + "cls": "monaco-button monaco-text-button", + "text": "Publish Branch", + "innerHTML": "Publish Branch", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 174, + "w": 182, + "h": 28 + } + }, + { + "aria": "fix/ticket-select-refresh*, Checkout Branch/Tag...", + "title": "", + "cls": "action-label", + "text": "fix/ticket-select-refresh*", + "innerHTML": " fix/ticket-select-refresh*", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 182, + "y": 207, + "w": 21, + "h": 20 + } + }, + { + "aria": "Publish Branch", + "title": "", + "cls": "action-label", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 207, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "action-label codicon codicon-toolbar-more", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 231, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "aria": "Commit Changes on \"fix/ticket-select-refresh\"", + "title": "", + "cls": "monaco-button monaco-text-button", + "text": "Commit", + "innerHTML": "Commit", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 69, + "y": 266, + "w": 156, + "h": 28 + } + }, + { + "aria": "More Actions...", + "title": "", + "cls": "monaco-button monaco-dropdown-button codicon codicon-drop-down-button", + "text": "", + "innerHTML": "", + "hasSvg": false, + "dataAttrs": {}, + "visible": true, + "rect": { + "x": 226, + "y": 266, + "w": 25, + "h": 28 + } + }, + { + "aria": "Open Changes", + "title": "", + "cls": "action-label codicon codicon-diff-multiple", "text": "", "innerHTML": "", "hasSvg": false, @@ -2104,9 +1927,9 @@ } }, { - "aria": "Maximize Secondary Side Bar Size", + "aria": "Discard All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-maximize", + "cls": "action-label codicon codicon-discard", "text": "", "innerHTML": "", "hasSvg": false, @@ -2120,9 +1943,9 @@ } }, { - "aria": "Hide Secondary Side Bar", + "aria": "Stage All Changes", "title": "", - "cls": "action-label codicon codicon-auxiliarybar-close", + "cls": "action-label codicon codicon-add", "text": "", "innerHTML": "", "hasSvg": false, @@ -2136,11 +1959,251 @@ } }, { - "aria": "Agent Section", + "aria": "Open File", "title": "", - "cls": "pane-header expanded hidden", - "text": "Agent", - "innerHTML": "
订单号 票码 观演人手机号 座位信息 商品名 状态
{{$ticket.order_no|default='—'}} {{$ticket.ticket_code}} {{$ticket.real_name|default='—'}}{{$ticket.phone|default='—'}} {{if !empty($ticket.seat_info)}}{{$ticket.seat_info}}{{else}}无{{/if}} {{$ticket.goods_title|default='已删除商品'}} @@ -121,7 +139,7 @@ {{if !empty($ticket.issued_at)}}{{:date('Y-m-d H:i', $ticket.issued_at)}}{{else}}—{{/if}} - 查看详情 @@ -130,7 +148,7 @@ {{/volist}} {{else}}
暂无数据暂无数据