Skip to content

观众端应用(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_positionzone_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 中切换议程的可见性。关闭后观众端应用照常加载,只是不再出现议程标签。

延伸阅读