Council
a673c09746
fix(JsBarcode): 用 ShopXO 自带本地文件替代 CDN(修复条形码不显示)
...
- ticket_wallet.html: cdn.jsdelivr.net → {{}}static/common/lib/JsBarcode/JsBarcode.all.min.js
- Index.php: 控制器显式传递 public_host(插件不继承 Common 基类)
- ShopXO 自带 JsBarcode v3.11.5,比原 CDN 的 3.11.0 还新
2026-04-25 08:54:54 +08:00
Council
7cd07f63af
fix(Task1): JsBarcode改用CDN(jsdelivr),修复本地路径404问题
...
原路径 public/static/common/lib/hiprint/plugins/JsBarcode.all.min.js
在 HTML5 环境返回 HTML 404,导致 JsBarcode not loaded
2026-04-25 00:43:52 +08:00
Council
95db208162
fix(Task1): barcode canvas显式宽高 + 改善renderBarcode诊断日志
...
- canvas 加 width=300 height=80 属性(部分浏览器需显式尺寸才能渲染)
- renderBarcode 加诊断:JsBarcode未加载/canvas找不到/shortCode为空/渲染异常
- ticket_card.html (PHP模板) + ticket_card.js (静态JS) 同步修复
2026-04-25 00:35:00 +08:00
Council
4c04b094e2
fix(Task1): seat展示截断 + 短码改名核销码 + barcode渲染函数化
...
- WalletService: 移除 getUserTickets() 中重复的 seat_number 字段
- ticket_card.html (PHP模板):
- renderTickets(): seat_info → seat_number
- 短码标签: 短码 → 核销码
- showTicketBasic/Detail: seat_info → seat_number, 标签改名, canvas条码
- 新增 renderBarcode() 独立函数
- 清理 showTicketDetail/loadQrPayload/refreshQr 中的 inline try-catch JsBarcode
- ticket_card.js (静态JS): 同上修复, 同步跟上 PHP 模板的改动
- renderBarcode() 在 refreshQr 中调用
2026-04-25 00:12:28 +08:00
Council
29f4c61110
feat(Task1): seat_number display + CODE128 barcode rendering
...
- WalletService: add seat_number field (parseSeatNumber helper)
- ticket_card.html: seat_info → seat_number in all 3 locations
(card template + viewTicket modal + showTicketDetail modal)
- ticket_card.html: add barcode canvas in both modals
- ticket_card.html: JsBarcode() calls after renderQrCode (3 locations)
- ticket_wallet.html: load JsBarcode.all.min.js before ticket_card.js
2026-04-24 23:58:09 +08:00
Council
4e5aaeacd2
feat(Task1): 票夹页面左上角加返回按钮
...
- HTML: 固定定位返回按钮(history.go(-1))
- CSS: AmazeUI am-icon-angle-left 风格,圆形白底 + 阴影
- 同步 app/ + public/ 两份 ticket.css
- ShopXO 最佳实践: AmazeUI 内置图标,无需额外 iconfont 依赖
2026-04-24 16:57:43 +08:00
Council
8b15283376
feat(phase4.3): 完成 C端票夹
...
新增文件:
- api/Ticket.php: C端票夹API控制器(list/detail/refreshQr)
- service/WalletService.php: 票夹核心服务
- view/goods/ticket_card.html: 票卡片共享组件
- view/goods/ticket_wallet.html: 票夹列表页
修改文件:
- Hook.php: 注册订单详情页注入钩子(plugins_service_order_detail_page_info)
- install.sql: 添加 qr_issued_at 字段
数据库变更:
- ALTER TABLE vr_tickets ADD qr_issued_at INT UNSIGNED
2026-04-23 13:44:48 +08:00
Council
ffeda44ddc
feat(Phase 3): 演播室选择器+层级售罄灰化+短码Feistel架构规划
2026-04-22 16:39:39 +08:00
Council
6688a10d95
fix: submit 改为 AJAX POST 到 buy/add,base64 编码 goods_data,修复非法访问错误
...
- ticket_detail.html: form.submit() → jQuery AJAX POST
- 改为 POST 到 ?s=buy/add(直接走 OrderInsert)
- goods_data 用 CryptoJS.base64 编码(ShopXO BuyGoods 期望格式)
- 显式传 buy_type=goods, address_id=0, site_model=2
- 成功跳转 jump_url,code=-400 走登录页,失败 alert 提示
- footer.html: 追加 base64csvtojson.js + common.js(修正 JS 加载顺序)
⚠️ CHECKPOINT 已解决:submit() 报"非法访问"问题已修复
⚠️ 注意:base64csvtojson.js 由 ShopXO Docker 容器生成,需同步到 public/static/
⚠️ Phase 3 待完成:订单确认页/支付/观演人信息存储
2026-04-22 01:02:57 +08:00
Council
f6f02a0c79
fix: CSS 文件路径 - 同步到 public/plugins/ 目录
2026-04-21 13:12:27 +08:00
Council
fdd89fbb70
fix: 优化规格选择器样式 - 处理长名称显示和添加 tooltip
2026-04-21 13:09:48 +08:00
Council
de9134773f
feat: 添加场馆和分区选择器 + specTypeList 支持
...
- SeatSkuService: 返回 specTypeList 包含所有4维规格
- Goods.php: 注入 specTypeList
- ticket_detail.html:
- 添加 venueSelector 和 sectionSelector HTML 容器
- 添加 renderAllSelectors() 渲染场次/场馆/分区
- 添加 selectVenue/selectSection/filterSeats 函数
- CSS: 添加规格选择器样式
2026-04-21 13:02:38 +08:00
Council
461dd6b101
fix: 修复 seat map 数据结构 + selected seats UI + encoding + submit button
...
1. renderSeatMap: 修复 map.seat_map 数据结构访问
2. updateSelectedUI: 渲染 selectedList + 启用 submit button
3. 修复 GoodsSpecValue 中文编码问题
4. 添加 barCount/barPrice 更新
2026-04-21 12:30:09 +08:00
Council
82a5b2129d
fix: 修复 seatMap 数据结构错误 - vr_seat_template 已经是解码后的 seat_map
2026-04-21 12:08:48 +08:00
Council
fb300e00fc
feat(Phase2): 修复 seatSpecMap 生成 + room ID 硬编码问题
...
关键修复:
1. BatchGenerate(): 新增 extends.seat_key 字段写入 GoodsSpecBase
2. BatchGenerate(): 新增 type 字段写入 GoodsSpecValue(4维spec类型)
3. ticket_detail.html: renderSeatMap() 不再用 room_001_ 硬编码,改用模板实际 roomId
4. Goods.php: seatSpecMap 注入(已在上次提交)
数据库修复:
- 为 vrt_goods_spec_value 新增 type 字段
- 重新生成商品 118 的规格数据(含 seat_key 和 type)
2026-04-21 12:03:56 +08:00
Council
c581395a9c
feat(Phase2): Issue 1 修复购买提交流程
...
- Goods.php: 注入 seatSpecMap 到票务模板
- ticket_detail.html: submit() 改 POST + 4维spec数组
关键修复:
- submit() 使用隐藏表单 POST 到 Buy 链路(不再用 location.href)
- spec 从 seatSpecMap[seatKey].spec 读取完整4维数组
- extension_data 嵌套在 order_base 内
- 直接 JSON.stringify,不需要 base64
2026-04-21 11:41:59 +08:00
Council
1b0ac3276d
fix: 替换为票务专用精简 footer
...
移除 ShopXO 默认导航(关于我们/招聘/客户服务等)
保留:返回首页 + 版权 + ICP备案
2026-04-20 06:35:24 +08:00
Council
c894e70188
fix: 复制 ShopXO public 模板 + 修复 footer_page 不存在问题
...
- 将 ShopXO 默认主题 public/ 目录完整复制到插件 goods/public/
- ticket_detail.html 中 footer_page → footer(footer_page.html 不存在于 ShopXO)
- ModuleInclude() 现在可以正确解析:view_path(goods/) + public/header.html ✅
2026-04-20 06:29:37 +08:00
Council
349ec063c1
fix: 替换 ThinkTemplate 标签为 PHP ModuleInclude
...
路线 B:票务模板不依赖 ThinkTemplate 解析引擎
- {include file=...} → <?php echo ModuleInclude(...) ?>
- {:Config()} / {:IsMobileLogin()} → <?php echo Config() ?> / <?php echo IsMobileLogin() ?>
- {$var|default=...} → <?php echo $var ?? 'default' ?>
- {$var|json_encode|raw} → <?php echo json_encode($var ?? []) ?>
绕过 ThinkTemplate parseTemplateFile() 路径拼接 bug(Linux view_depr=/ 导致 include 路径解析错误)
2026-04-20 06:23:29 +08:00
Council
96337bc840
council(execute): BackendArchitect - Fix 2 bugs in P0-A/B/P1 implementations
...
Bug 1: SeatSkuService.php:381 - regex has syntax error
'/^([A-Za-z]+)(\d+)排(\d+)座$/' → '/^([A-Za-z]+)(\d+)排(\d)座$/'
The third capture group only needs single digit (col number 1-9).
Bug 2: ticket_detail.html:416 - frontend accesses specBaseIdMap as object
but PHP returns flat integer: specBaseIdMap['A_1'] = 2001 (int), not {spec_base_id: 2001}.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 20:09:22 +08:00
Council
93b70d4d50
council(execute): FrontendDev - Issue #9 P1 submit() refactor (seat-level goods_params)
...
- renderSeatMap(): add data-row-label + data-col-num attrs for specBaseIdMap key format
- toggleSeat(): change seatKey from "0_0" (numeric) to "A_1" (label_colNum) to match specBaseIdMap
- removeSeat(): use [data-row-label][data-col-num] selector
- submit(): refactor from 1 goods_params (zone-level) to N entries (seat-level, stock=1)
- Plan B fallback: if specBaseIdMap[key] missing, use sessionSpecId
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 19:56:25 +08:00
Council
098bcfe780
fix(P0): P0-1 idempotent ticket issuance, P0-3 XSS, P0-4 QR secret exception
...
P0-1: issueTicket() now checks for existing tickets by (order_id, spec_base_id)
before inserting. Prevents duplicate tickets on HTTP retry/multi-instance.
P0-3: Removed |raw from simple_desc and content in ticket_detail.html.
Prevents stored XSS via malicious admin content injection.
P0-4: getQrSecret() now throws exception if VR_TICKET_QR_SECRET is unset,
instead of falling back to insecure default key.
2026-04-15 16:59:22 +08:00
Council
1afd547444
feat: import ShopXO v6.8.0 sourcecode (vendor/runtime excluded)
...
- ShopXO core + plugins/vr_ticket
- Goods.php item_type=ticket routing (Phase 1)
- vr_ticket plugin skeleton (Phase 0/1)
- Admin auth Base controller (Phase 2)
- All Phase 0/1/2 code included
Closes: tracks all ShopXO core modifications in monorepo
2026-04-15 13:09:44 +08:00