feat: add Admin Control Panel, voting status check, and router security

Admin Control Panel:
- Add full AdminControl.vue with 3 sections (Voting, Lottery, Global)
- Add AdminLogin.vue with access code gate (20268888)
- Add admin.ts store with state persistence
- Add admin.types.ts with state machine types
- Add router guards for /admin/director-console

Voting System Fixes:
- Add voting status check before accepting votes (VOTING_CLOSED error)
- Fix client to display server error messages
- Fix button disabled logic to prevent ambiguity in paused state
- Auto-generate userId on connect to fix UNAUTHORIZED error

Big Screen Enhancements:
- Add LiveVotingView.vue with particle system
- Add LotteryMachine.ts with 3-stage animation (Galaxy/Storm/Reveal)
- Add useSocketClient.ts composable
- Fix MainDisplay.vue SCSS syntax error
- Add admin state sync listener in display store

Server Updates:
- Add admin.service.ts for state management
- Add isVotingOpen() and getVotingStatus() methods
- Add admin socket event handlers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
empty
2026-01-15 15:34:37 +08:00
parent e7397d22a9
commit 30cd29d45d
45 changed files with 7791 additions and 715 deletions

109
联调测试方案.md Normal file
View File

@@ -0,0 +1,109 @@
# 年会互动大屏系统 - 联调测试方案 (Integration Test Plan)
| 项目名称 | 年会互动大屏系统 (马年国潮版) | 版本号 | V1.0 |
| :--- | :--- | :--- | :--- |
| 文档状态 | **执行中** | 负责人 | 技术总监 |
| 涉及端 | 移动端 H5、大屏端 Web、导播台 Admin、服务端 Node | 更新日期 | 2026-01-15 |
---
## 1. 测试目标与范围
本次联调旨在验证各子系统间的**数据流转**、**实时通信**及**视觉同步**是否符合预期。重点关注 150 人并发场景下的稳定性及“操作-反馈”的延迟体验。
### 核心联调链路
1. **投票链路**:手机端盖戳 -> Socket 传输 -> Redis 原子计数 -> 大屏粒子特效生成。
2. **抽奖链路**:导播台控制 -> 状态机切换 -> 算法筛选 -> 大屏三阶段动效展示。
3. **管理链路**:名单导入 -> 数据清洗 -> 实时控制 -> 紧急重置。
---
## 2. 环境准备 (Pre-requisites)
### 2.1 硬件环境
* **大屏幕端**:高性能 PC (建议独立显卡),连接 LED 大屏(或 1080P+ 显示器)。
* **导播台**:操作员笔记本电脑 (Chrome 浏览器)。
* **用户端**:准备至少 5 台不同型号的手机 (含 iOS/Android, 高端/低端机型)。
### 2.2 网络环境
* **局域网 (LAN)**:大屏 PC 必须连接有线网络。
* **Wi-Fi/4G**:手机端测试混合网络环境。
* **服务端**Redis 与 Node.js 服务已启动Socket 端口开放。
### 2.3 数据准备
* [ ] 导入测试用员工名单 Excel (含 1960-2005 不同年份出生,含 200 人以上数据)。
* [ ] 配置 7 个测试节目及对应的封面图。
* [ ] 配置 7 个奖项名称 (最佳创意、最佳视觉等)。
---
## 3. 详细测试用例 (Test Cases)
### 3.1 模块 A身份验证与连接
| ID | 测试场景 | 操作步骤 | 预期结果 | 状态 |
| :--- | :--- | :--- | :--- | :--- |
| A01 | 员工扫码登录 | 微信扫码访问首页 | 1. 显示“请输入姓名”<br>2. 提交后进入首页,显示“已连接”绿灯 | ☐ |
| A02 | 导播台登录 | 访问 `/admin/director-console` | 1. 拦截跳转至登录页<br>2. 输入 `20268888` 后进入控制台 | ☐ |
| A03 | 大屏连接 | 访问 `/screen/display-mode` | 1. 全屏显示“马到成功”主视觉<br>2. 左下角“在线人数”实时更新 | ☐ |
### 3.2 模块 B节目投票 (核心交互)
**前置条件**:导播台已开启某节目的“投票通道”。
| ID | 测试场景 | 操作步骤 | 预期结果 | 状态 |
| :--- | :--- | :--- | :--- | :--- |
| B01 | **明信片入场** | 导播开启投票通道 | 手机端节目卡片(明信片)**淡入并上滑**出现,伴随震动提示 | ☐ |
| B02 | **盖戳体验 (乐观UI)** | 拖动/点击底部“最佳创意”印章 | 1. **手机端**:印章手柄下压 -> 震动 -> 留下带有**用户昵称**的红色印迹 (Multiply模式)<br>2. **大屏端**(<1s延迟) 底部飞出一颗金色粒子,击中对应节目,炸开金粉 | ☐ |
| B03 | 重复投票拦截 | 对同一节目投第二张票 | 手机端提示“该节目已评价”,无法盖第二个戳 | ☐ |
| B04 | 撤回/改票 | 点击卡片上已盖的印迹 | 1. 印迹消失,底部印章恢复高亮<br>2. 大屏端该节目热度值回落 (可选,或仅停止增长) | ☐ |
| B05 | **断网投票 (弱网)** | 手机开启飞行模式 -> 盖戳 -> 关闭飞行模式 | 1. 断网时:盖戳动画正常执行 (乐观UI)<br>2. 联网后Socket 自动重连,大屏随后收到粒子动画 | ☐ |
### 3.3 模块 C幸运抽奖 (全流程)
**前置条件**:已导入名单,导播台切换至“幸运抽奖”面板。
| ID | 测试场景 | 操作步骤 | 预期结果 | 状态 |
| :--- | :--- | :--- | :--- | :--- |
| C01 | 筛选逻辑验证 | 导播选择“第四轮 (属马)” | 导播台显示“当前奖池人数X人” (需核对 X 是否等于 Excel 中属马人数 - 已中奖人数) | ☐ |
| C02 | **阶段 1聚气** | 导播点击【准备】 | 大屏进入“星河旋转”状态,仅高亮显示属马员工的名字 | ☐ |
| C03 | **阶段 2风暴** | 导播点击【开始】 | 大屏名字汇聚成“红色风暴”高速旋转,背景音效激昂 | ☐ |
| C04 | **阶段 3揭晓** | 导播点击【停止】 | 1. 风暴炸裂<br>2. 红色卷轴展开<br>3. 弹出中奖者头像与姓名 (防抖动,只弹一次) | ☐ |
| C05 | 去重验证 | 第一轮中奖者张三,在第四轮再次被抽中 | **严重Bug**。系统应确保张三不在第四轮奖池中 (除非配置允许重复) | ☐ |
### 3.4 模块 D全局控制与稳定性
| ID | 测试场景 | 操作步骤 | 预期结果 | 状态 |
| :--- | :--- | :--- | :--- | :--- |
| D01 | 紧急重置 | 导播点击【重置大屏】 | 大屏立即强制刷新,回到待机主页 (用于动效卡死时自救) | ☐ |
| D02 | **高并发压测** | 使用脚本或组织 20 人,每人每秒点击 5 次 | 1. Redis 票数统计准确 (无丢票)<br>2. 大屏 FPS 保持在 30 以上,无崩溃<br>3. Node 服务内存无溢出 | ☐ |
---
## 4. 视觉与体验验收标准 (Design QA)
* **色值检查**
* 主红:`#C21F30` (丹砂红)
* 主金:`#F0C239` (香槟金)
* **明信片质感**
* 背景是否有棉纸纹理噪点?
* "From/To" 是否为手写体且微微倾斜?
* **印章效果**
* 印迹是否使用了 `mix-blend-mode: multiply` (正片叠底)
* 印迹是否有随机旋转角度?
* 印迹中是否包含“当前用户昵称”?
* **大屏特效**
* 粒子背景是否深邃且有层次感 (3D 景深)
* 抽奖名字是否有动态模糊 (Motion Blur)
---
## 5. 故障应急预案 (Emergency Plan)
如果在现场测试或实际活动中出现以下问题,按此方案执行:
1. **大屏白屏/卡死**
* *动作*:导播台点击“重置大屏”;若无效,按 F5 刷新大屏 PC 浏览器。
* *话术*:主持人:“看来我们的系统也被大家的热情冲晕了头脑,正在重启能量场...”
2. **手机端无法投票**
* *动作*:导播台广播“切换为备用通道” (实际上是重启 Socket 服务)。
* *降级*如果网络彻底瘫痪改用“分贝仪”App 测现场欢呼声大小来决定奖项。
3. **抽奖名单出错**
* *动作*:导播台手动输入中奖者 (假装系统抽出),或切换为“全员随机模式”。
---