观众端应用(Gateway 公开界面)
Timers Studio 观众端应用参考:观众在 /ask/<room> 看到的内容、无需登录的身份管理、权限以及房间品牌样式的继承方式。
最近更新
观众端应用(Gateway 公开界面)
观众端应用是 Gateway 模块的公开入口。当观众在手机上打开一个 Timers Studio 房间时真正看到的,就是它:一个轻量、免登录、部署在 timers.studio/ask/<room> 的页面。平台其余部分——Studio、Moderator、Player——对观众完全不可见。这个界面的边界是有意收窄的。
观众到达这里有两种方式:扫描舞台、幻灯片或活动手册上展示的二维码,或者输入主办方分发的短链接。两种方式路径一致:/ask/<room> 将房间与 controllers 表匹配后加载公开 UI。没有大厅页,不创建账号,也不提示填邮箱。
观众看到什么
应用采用移动优先设计,便于拇指操作,默认深色主题。页面一加载,观众就能访问以下功能:
- 提问 — 一个 280 字符的表单,写入
spatial_questions。可选的座位选择器(SeatSelector)会附带vector_position和zone_id,方便导演定位发言来源。 - 参与实时投票 — 导演开启投票的瞬间,
SpectatorPollVote会从底部弹出。在提交投票或投票关闭之前,它优先于提问表单。 - 议程 — 只读的日程视图,主办方保留开关打开时可见。数据与 Agenda 模块中编辑的完全一致。
- LIVE 标识 — 与
controllers.timer_state联动的小指示器,舞台上有计时器运行时切换为 LIVE。 - 成功页面 — 问题发送后显示确认界面和一个重置按钮,同一台设备可继续发送下一个问题。
标签页在后台保持订阅。导演开启投票时观众无需刷新,投票卡片会自动出现。
身份与隐私
观众端应用从不要求密码。身份保存在浏览器内的 spectator_id 中,而不是服务器会话里。
- 首次访问时,应用会生成一个
spectator_id,以房间维度的键(例如fp_<room>)保存在localStorage。 - 在
spectators表中插入一行,包含这个 id、room_id以及可选的nickname。 - 同一设备再次访问会复用同一个
spectator_id,因此重新打开页面的人不会在运营端的计数器里被重复计算。 - 清除浏览器存储即重置身份。这是有意的设计,符合观众”活动结束后不留痕迹”的预期。
因为不收集邮箱、电话或账号,Gateway 在 GDPR 层面处于友好一侧:收集到的数据只有匿名 id、可选昵称,以及观众明确输入的内容(问题文本、投票)。座位仅在被选择时才存储。
权限与限制
少数几条规则让这个界面在高负载下仍能保持稳定:
- 频率限制 — 同一个
spectator_id每 10 秒可发送 1 个问题,两次提交之间表单自动禁用。 - 问题长度 — 280 字符,客户端强制限制,插入时再次校验。
- 同时仅一个活跃投票 — 观众只看到状态为
active的投票。过往投票无法在此界面浏览。 - 不可编辑、不可删除 — 问题一旦发送,观众端无法重写,审核在运营端完成。
- 没有主持人工具 — 审核通过、推送到 Player、抽奖开奖都发生在 Studio 内。观众端应用不提供任何此类入口。
品牌样式
观众端应用继承所属房间的外观。驱动 Studio 顶栏和 Player 背景的同一套主题也会在这里生效:
- 主色与强调色读取自房间主题。
- 若 controller 上配置了主办方 logo,会显示在应用顶部。
- 默认深色模式,房间主题可以覆盖。
- 语言跟随 controller 的管理语言,阿拉伯语自动切换为 RTL 布局。
目标是让 /ask/<room> 上的观众感觉自己置身于与舞台屏相同的活动现场,而不是被 Timers Studio 的外壳喧宾夺主。
常见问题
观众需要注册账号吗?
不需要。观众端应用没有登录、没有注册、也没有邮箱字段。首次访问时在浏览器中生成一个匿名的 spectator_id。
Gateway 会收集哪些数据?
localStorage 中的匿名 spectator_id、可选昵称,以及观众明确发送的内容——问题文本、座位选择、投票。不收集邮箱、电话或账号。
不安装任何应用也能使用吗? 可以。观众端应用就是一个网页。任何现代的移动或桌面浏览器都能直接通过二维码或短链接打开,无需安装任何东西。
可以不让观众看到议程吗? 可以。主办方可在 Studio 中切换议程的可见性。关闭后观众端应用照常加载,只是不再出现议程标签。
延伸阅读
- Gateway 模块概览 — 观众端应用与运营端工作区如何衔接。
- 打开 Access Gateway — 运营端如何读取观众发送的内容。
- 参与实时投票(观众视角) — 聚焦投票流程。