⛷️ 跳绳比赛裁判系统

完整使用说明 · 图文版

管理员端 · 裁判员端(Web/小程序)· 大屏展示端 · Android/iOS 端

管理员端 裁判员端 (Web) 裁判员端 (小程序) 大屏展示端 Android App iOS App

📖 目录

1. 系统概览 #

本系统是一套面向跳绳比赛的实时成绩管理平台,支持比赛建档、项目编排、运动员分组、场地分配、裁判执裁、成绩录入、实时大屏展示与导出统计的全流程。

1.1 五大端的能力矩阵

主要用户 核心功能 访问方式
管理员端 比赛管理员 建赛、项目、组别、场地、运动员、裁判分配、大屏配置、成绩导出 浏览器访问 admin.html
裁判员端 Web 裁判员 登录、执裁、成绩录入(计数赛 + 规定赛三角色) 浏览器 judge.html(手机/平板)
裁判员端 小程序 裁判员 同上(移动体验更佳) 微信小程序搜索
大屏展示端 现场观众 实时成绩展示、场次切换动画、赛后庆祝 浏览器 display.html(大屏幕)
Android App / iOS App 裁判员 等同小程序,多端框架打包 多端应用模式构建

1.2 技术架构(极简版)

— Cloudflare 全栈架构 —
🌐
前端
HTML / Alpine.js / WXML
后端
Cloudflare Workers
🗄️
数据库
Cloudflare D1 (SQLite)
所有数据云端存储 · 多端实时同步

2. 系统入口与登录 #

2.1 三大端入口

访问部署后的主域名 https://你的域名/,进入系统门户:

跳绳比赛裁判系统
请选择您的角色入口
① 管理员端
比赛管理 · 数据查看
/admin
② 裁判员端
成绩录入 · 实时同步
/judge
③ 大屏端
实时展示 · 成绩大屏

2.2 默认账号

角色编号 / 账号密码备注
管理员 17653420201 环境变量配置 通过 ADMIN_PASSWORD 环境变量设置,无硬编码默认值
裁判员 自行注册 自行设置(必填,至少 4 位) 注册后需管理员审核通过
⚠️ 安全机制
• 管理员密码通过环境变量 ADMIN_PASSWORD 配置,不再有硬编码默认值
• 裁判员密码必填,至少 4 位,无默认密码
登录失败 5 次自动锁定 5 分钟(管理员 + 裁判员双端)
• 锁定期间即使输入正确密码也会被拒绝,5 分钟后自动解锁
• 管理员可在「审计日志」页面手动解除锁定

3. 管理员端使用 #

管理员端是整个系统的"驾驶舱",通过左侧导航切换功能模块:

3.1 侧边栏导航

🏆
比赛管理
📋
项目管理
👥
赛事组别
📍
场地管理
🏃
运动员管理
🖥️
大屏管理
📊
成绩总览
⚖️
裁判员管理
📝
审计日志

3.1.1 比赛管理

创建一场新比赛,作为所有数据(项目、组别、场地、运动员、成绩)的顶层容器

1
新建比赛:点击右上「+ 新建比赛」,填写比赛名称、举办时间、地点等信息。
2
设为大屏:在比赛列表中点击「📺 设为大屏」按钮,该比赛的数据将推送到 display.html
3
编辑/删除:点击「✏️ 编辑」可修改比赛信息,「🗑️ 删除」会级联删除该比赛下的所有项目、组别、场地、成绩(不可恢复,请谨慎)。

3.1.2 项目管理

管理比赛中的所有竞赛项目(如 30 秒单摇、3 分钟单摇接力、个人花样、规定套路等)。

1
批量导入预设项目(一次请求):点击「📥 批量导入」,从内置的预设项目库中勾选需要的项目(如「30 秒单摇」「3 分钟长绳」),支持搜索/筛选(按类型、按计分方式),点击「导入选中项」后一次 HTTP 请求完成全部导入(使用 D1 batch 一次性插入),无需逐个等待。
2
新建项目:点击「+ 新建项目」手动创建。必填字段:项目名称、所属类型(计数赛/规定赛/花样赛)、计分方式。花样赛可配置裁判角色(DP/DM/DR 等),规定赛可配置裁判数量。
3
批量删除(一次请求):勾选行首复选框 → 顶部「🗑️ 批量删除」按钮 → 确认后一次请求删除所有选中项目(使用 D1 batch 一次性执行所有 DELETE)。
💡 三大项目类型
计数赛(timing):1 名裁判计数 30 秒/3 分钟内的跳绳个数,得分 = 跳绳个数
规定赛(prescribed):3 名裁判分别评分(T1 创意 + T2 完成 + T3 主裁扣分),满分 100
花样赛(freestyle):多角色裁判(DP/DM/DR 难度分 + 完成分 + 创意分 + 规定扣分 + 主裁扣分),按官方计分规则

3.1.3 赛事组别

为比赛划分组别(如「男子组 - 三年级」「女子组 - 四年级」「混合组 - 五年级」「不限性别」),便于成绩分组统计。

1
批量导入预设组别:点击「📥 导入预设组别」,从预置的「男子组/女子组/混合组 × 各年级」组合中勾选添加。
2
新建组别:手动填写「组别名称」(如"男子组 - 三年级"),选择「性别」(男子组/女子组/混合组/不限性别)、「年龄段」。
3
批量删除(一次请求):勾选行首复选框 → 批量删除按钮 → 确认后一次请求删除所有选中组别。

3.1.4 场地管理

这是系统的核心调度界面,用于把"裁判员 + 运动员 + 项目"三者绑定到具体场地。

1
新建场地:点击「+ 新建场地」,输入场地编号(如 1/2/3 号)、场地名称。设置该场地容纳的运动员数
2
分配裁判员:在场地卡片上点击「⚖️ 分配裁判」,勾选要承担本场地的裁判员(计数赛规定赛-主裁判/创意/完成)。同一裁判员可分配到多个场地
3
分配运动员:点击「👥 分配运动员」,从左侧运动员池中勾选要加入本场地的运动员,右侧用「↑↓ 上下移」调整出场顺序。这个出场顺序将决定裁判员的录入顺序。
🎯 调度技巧
• 一个场地通常安排 3-8 名运动员,避免选手等待过长
• 规定赛场地需要 3 名裁判同时在岗(主裁判 + 创意 + 完成)
• 计数赛只需 1 名裁判(或 1 名计数 + 1 名计时分工)

3.1.5 运动员管理

1
新增运动员:手动填写姓名、性别、所属学校/单位、组别。支持全选所有页(分页时使用),以便一次性批量操作。
2
批量导入:点击「📥 批量导入」下载 Excel 模板 → 填好后上传 → 系统实时预览并校验分组 → 「确认导入」。
3
编辑/移除:点击行内「编辑」可修改运动员信息;「移除」是从当前比赛中移除(不会删除账号本身)。

批量导入 · 分组校验详解

系统采用两层防护机制,确保只有分组正确的运动员才能被导入:

— 批量导入预览界面 —
# 姓名 学校 分组
1 张三 清华附小 青年组混合组 ✓
2 李四 北大附小 少年组 分组不匹配:运动员所属分组[少年组]不在赛事组别中
⚠️ 1 条标红记录将被跳过,仅导入 1 条有效记录
确认导入 1 条有效记录
取消

导入完成后,系统会弹出导入结果汇总

1
成功导入
1
导入失败
2
共计

失败记录支持:📥 导出 Excel(便于修正后重新导入)、重新导入失败记录(快速重试)。

⚠️ 分组校验规则
• 运动员的「分组」字段必须与「赛事组别」中已配置的组别名称完全一致(含空格、全半角)
• 若赛事尚未配置任何组别,则所有运动员均可通过分组校验(视为不限组别)
• 分组为空的运动员不会触发校验,可正常导入
• 双层防护:预览阶段前端校验标红提示 + 提交阶段后端再次验证,确保数据一致性

3.1.6 大屏管理

在管理员端无需打开大屏窗口,就能直接调整大屏的呈现样式。

1
选择布局:从内置的多种网格布局中选用(如 2 列、2×2、3×3、4 列、6 列)。
2
选择背景:内置 9+ 套主题(火焰烈焰、深蓝光电、紫罗兰、森林绿、夕阳橙、风暴 v2,以及 3 套蓝绿渐变运动风格跳绳照片背景:蓝绿剪影、流光弧线、极速竞技场)+ 支持自定义上传图片。
3
自动切换 / 手动下一场:开启「自动模式」后大屏将按倒计时自动切换场次;也可点「手动下一场」即时切换。
4
自定义滚动播报文案:底部跑马灯支持自定义公告(如"请下一组选手准备")。
5
实时预览:右侧"实时成绩预览"模块会即时显示大屏当前状态,所见即所得。

3.1.7 成绩总览

查看、修改、导出所有已录入的成绩。

1
视图切换:顶部两个标签「成绩列表 / 成绩统计表」。
2
成绩列表:支持按「全部 / 计数赛 / 规定赛 / 花样赛 / 场地 N」筛选。表格包含场地号、场次号(session-venue 格式如 1-1)、姓名、单位、项目、成绩、状态、操作列,所有内容单行显示不换行。每行可「修改」成绩或「撤销」误操作。
3
导出成绩:点击「📊 导出成绩」下拉菜单,选择导出范围(全部 / 计数赛 / 规定赛 / 花样赛 / 按场地)。纯类型导出使用各自专用表头(计数赛 7 列、规定赛 10 列含 T1/T2/T3、花样赛 13 列含难度/完成/创意等);混合导出(全部/按场地)使用通用 7 列表头,每行根据 scoreType 自动显示正确类型和成绩格式。
4
成绩统计表:按项目 × 组别自动生成模板表,支持打印(带边框)和导出 Excel。
💡 导出表头说明
计数赛专用:场地号、场次号、姓名、单位、项目、类型、成绩(7 列)
规定赛专用:场地号、场次号、姓名、单位、项目、类型、成绩、T1(创意)、T2(完成)、T3(主裁扣分)(10 列)
花样赛专用:场地号、场次号、姓名、单位、项目、类型、最终成绩、难度总分、完成均值、创意均值、规定扣分、主裁扣分、排名(13 列)
混合导出:通用 7 列,每行根据类型自动显示"计数赛 N 个"或"规定赛 N 分"或"花样赛 N 分"
💡 打印小技巧
• 统计表已优化 @media print 样式,打印预览时会自动带上边框
• 推荐在 Chrome 浏览器中打印 → 设置边距为"默认"或"无"以获得最佳效果

3.1.8 裁判员管理

1
审核注册:新裁判员注册后「审核状态」显示为待审核,点击「通过审核」按钮激活账号(审核通过后自动启用)。
2
新增/编辑裁判:管理员可直接创建裁判员账号(用于纸质登记),设置裁判类型(计数赛 / 规定赛-主裁判/创意/完成)和默认密码。管理员创建的裁判员默认为"审核通过"状态。
3
禁用/启用切换:审核通过的裁判员操作列显示「禁用」或「启用」切换按钮。点击后根据当前状态自动切换:
禁用(橙色)→ 点击后账号停用,裁判员无法登录
启用(灰色)→ 点击后账号恢复,裁判员可正常登录
💡 审核状态 vs 启用状态
审核状态(独立显示):表示裁判员是否通过了管理员审核,只有"待审核"和"审核通过"两种
启用/禁用(切换按钮):审核通过后才出现,用于临时停用或恢复裁判员登录权限
• 两者完全独立:禁用裁判员不影响其审核通过状态,启用也不需要重新审核

3.1.9 审计日志

记录所有登录(成功/失败/拒绝)、成绩提交、账号锁定/解锁操作,生产事故可一键回溯"谁在什么时间做了什么"。

1
统计卡片:页面顶部显示 3 个卡片 — 成功操作数、失败操作数、被拒绝数。
2
锁定账号管理:显示当前被锁定的账号列表(管理员/裁判员),包含失败次数和解锁时间。点击「解除锁定」可手动解锁。
3
筛选与查询:支持按用户类型、操作类型、时间段等 6 个维度筛选日志。点击单条日志可展开详情 JSON。

4. 裁判员端 Web 版 #

4.1 登录与执裁任务选择

1
登录:访问 judge.html,输入裁判员编号 + 密码。错误时密码框会变红(编号不存在时编号框变橙色),并显示引导按钮。
2
注册:未注册的裁判员点「注册账号」→ 填写姓名、手机号、编号、密码(密码必填,至少 4 位)。
3
任务中心(Hub):登录后进入任务中心,卡片列表显示你被分配的所有执裁任务(如「1号场地 - 计数赛」「2号场地 - 规定赛-主裁判」「3号场地 - 花样赛-难度裁判DP」)。点卡片进入对应执裁界面。
🔒 安全机制
单点登录:同一裁判员账号同一时间只能在一个设备上登录(不限 Web 或小程序)
失败锁定:密码错误 5 次自动锁定 5 分钟,锁定期间即使输入正确密码也会被拒绝
断网提示:网络断开时页面顶部显示红色断网横幅,恢复后自动消失
加载状态:数据加载时显示全屏加载遮罩,防止误操作
💡 PWA 安装(推荐)
首次访问 judge.html 时,手机浏览器会提示「添加到主屏幕」。安装后即可全屏使用,体验接近原生 App。

4.2 计数赛执裁流程

执裁场次
场次:1-1 | 1号场地
比赛项目
30秒单摇
完成进度 2/5 人
第 3 位 / 共 5 位
张三
清华附小 · 男子组-三年级
156
输入成绩(个)
1
2
3
4
5
6
7
8
9
0
抢跳
×2
弃权
确认提交 156 个 →
1
输入成绩:使用屏幕底部数字键盘逐位输入运动员跳绳个数(0-9999)。回车键 = 快速提交。
2
特殊处理:抢跳:运动员提前起跳,自动扣除 10 个或直接置 0
×2:计数 × 2(用于多人同时跳)
弃权:标记为弃权
3
跳过:点击底部「暂时跳过」可在不录入成绩的情况下移动到下一位。
4
返回:顶部「←」按钮返回任务中心,可切换到其他场地。
5
全部完成:所有运动员成绩录入完毕后,显示「全部完成」汇总页(金银铜牌 + 同步到大屏提示)。

4.3 规定赛执裁(3 个角色)

规定赛由3 名裁判员分工评分,各角色登录后会自动进入对应执裁界面(judge-head.html / judge-creative.html / judge-completion.html)。

角色页面打分范围说明
主裁判 (T3) judge-head.html 扣分 0-100 勾选犯规减分(如脚触地 +5、绳触地 +5)和取消资格项;得分 = 100 − 扣分
创意裁判 (T1) judge-creative.html 0-20 分 整体创意编排 + 现场表现效果
完成裁判 (T2) judge-completion.html 0-80 分 动作准确性 / 熟练性 / 合拍性 / 一致性

最终得分 = T1 + T2 − T3扣分(满分 100)。每位裁判独立提交,前端实时显示"我已提交"状态,3 名裁判全部提交后大屏自动显示最终成绩。

4.4 花样赛执裁(多角色)

花样赛按官方计分规则实现多角色执裁,各角色登录后进入对应执裁界面:

角色打分范围说明
难度裁判 DP 难度分 评定难度动作分值
难度裁判 DM 难度分 评定难度动作分值(与 DP 独立打分)
难度裁判 DR 难度分 评定难度动作分值(与 DP/DM 独立打分)
完成裁判 扣分 0-5 完成质量扣分(0/1/2/3/5 分档)
创意裁判 0-10 分 创意编排评分
规定扣分裁判 扣分 规定动作缺失扣分
主裁判 扣分 总体印象扣分

计分规则:难度分 = min(50, DP + DM + DR 总和);最终成绩 = 难度分 + 完成分(×0.5) + 创意分(×0.5) − 规定扣分 − 主裁扣分。

💡 单维度独立出分
任一维度(如完成分)所有裁判提交后,大屏立即显示该维度分数,不用等所有维度完成。方便现场观众和教练实时了解评分进度。

4.5 SSE 实时同步

计数赛页面使用 SSE(Server-Sent Events)实时推送技术:

4.6 查看历史成绩

小程序端提供"我的历史"页面(history.wxml),可查看本裁判员历史上报的所有成绩,便于赛后回顾和申诉。

5. 裁判员端 小程序 / App #

移动端(微信小程序 / Android / iOS App)使用流程与 Web 版完全一致,但 UI 针对小屏做了优化(数字键盘更大、按钮更易点击)。

5.1 登录与界面

1
错误提示样式: • 密码错误 → 密码框红框 + 错误卡片带 ✕ 图标
• 编号不存在 → 编号框橙框 + 错误卡片带 ⚠ 图标 + 「立即注册」快捷按钮
• 账号审核中 → 带 ⏳ 图标
• 已禁用 → 带 🔒 图标
• 已在其他设备登录 → 带 🔒 图标 + 「账号已在其他设备登录,请等待当前用户退出后再尝试」
2
任务列表:登录后显示与 Web 版完全相同的执裁任务卡片。
3
规定赛:主裁判界面勾选扣分项(多选);创意/完成裁判用滑块或数字键盘输入分数。

5.2 Android / iOS App 构建

  1. 在微信开发者工具中切换到「多端应用模式」。
  2. 点击菜单「工具」→「多端框架」→「生成 Android 工程」 / 「生成 iOS 工程」 → 自动生成原生项目壳。
  3. Android:使用 Android Studio 打开生成的工程 → 编译 APK。
    iOS:使用 Xcode 打开 → 配置证书 → 编译 IPA。
  4. App 内核与小程序完全一致,无需重复开发业务逻辑。
💡 配置要求
project.miniapp.json 中需包含 mini-android / mini-ios 段(首次生成时开发工具会自动创建)
• 详见 APK快速构建指南.md

6. 大屏展示端 #

大屏端面向现场观众,通过浏览器全屏运行,使用 SSE 实时同步裁判员录入的成绩(延迟 < 300ms)。

6.1 启动与全屏

1
打开大屏:访问 display.html,浏览器自动连接到管理员设置的比赛。
2
进入全屏:F11(或点击右上角 ⛶ 按钮)→ 全屏显示,Esc 退出。
💡 SSE 实时同步
大屏通过 EventSource 连接 /api/display/:id/stream SSE 端点,裁判员提交成绩后 < 300ms 推送到大屏。SSE 断开后自动重连,同时保留版本号轮询作为 fallback。

6.2 界面布局

14:32:08
2026-06-14 周六
2026 全国跳绳锦标赛
项目:30 秒单摇
第 1 场次 ● 实时
共 5 名运动员 3/5 已录入 · 60%
1-1
张三
清华附小
156
1-1
李四
北大附小
142
1-1
王五
复旦附小
--

6.3 场次切换动画

当管理员切换到下一场次时,大屏会显示"第 X 场次 → 第 Y 场次"的过渡卡片,旧场次卡片向左滑出,新场次卡片从右滑入。

6.4 赛后庆祝特效

当某场次所有运动员成绩录入完成时,大屏会触发:

6.5 底部跑马灯

滚动播报最新成绩或管理员自定义的公告文案。右侧实时显示「已录 / 总人数」统计。

7. 完整比赛流程 #

下面以一场 30 人 30 秒单摇计数赛为例,演示从开赛到结束的完整操作流。

赛前 1 天:管理员准备
创建比赛 → 批量导入项目(如"30秒单摇")→ 批量导入组别(男子/女子 × 各年级)→ 批量导入 30 名运动员 → 至少新建 5 个场地 → 给每个场地分配运动员(3-8 人/场)→ 审核通过所有注册裁判员 → 把大屏调到目标比赛。
赛前 30 分钟:裁判员就位
裁判员用手机/平板打开 judge.html,登录后在 Hub 中确认自己负责的场地 → 等待比赛开始。
比赛进行中
每位裁判员按出场顺序逐个录入成绩 → 提交后实时同步到大屏 → 观众实时看到最新排名。管理员可在「成绩总览」实时查看进度。
比赛结束
当某场次所有运动员成绩录入完毕 → 大屏触发🏆庆祝特效 → 管理员切到下一场次 → 重复。
赛后归档
管理员进入「成绩总览」→「成绩统计表」标签 → 切换到「成绩统计表」视图 → 打印或导出 Excel → 装订成纸质证书/奖状。

8. 常见问题 FAQ #

Q1. 裁判员登录时一直显示"账号审核中"怎么办?

显示"账号审核中"说明该裁判员注册后尚未通过管理员审核。需要管理员在「裁判员管理」中找到该裁判员,点击「通过审核」按钮。审核通过后账号自动启用,裁判员即可登录。

Q2. 输入密码错误时只有通用错误,没有红色边框?

检查后端是否正确返回 errorCode: 'WRONG_PASSWORD'。如果后端没问题但前端没显示,尝试清除浏览器缓存(Ctrl+Shift+R 强制刷新)。

Q3. 成绩提交后大屏没有立即更新?

大屏使用 SSE 实时同步,裁判员提交后 < 300ms 推送到大屏。如出现延迟:

Q4. 打印成绩统计表时没有边框?

如打印时没有边框,请使用 Chrome 浏览器,且在打印设置中将边距设为"默认"或"无"。

Q5. 多个裁判员同时录入同一运动员会冲突吗?

不会。系统在数据库层使用唯一约束 + 后写入覆盖原则。同一个运动员的规定赛 T1/T2/T3 来自不同裁判员,互不冲突;计数赛成绩以后提交者为准。花样赛各维度(难度/完成/创意)也由不同裁判独立打分,互不影响。

Q6. 大屏显示"暂无比赛"?

需要在管理员端「比赛管理」中找到目标比赛,点击「📺 设为大屏」按钮。每个时刻只能有一个比赛被设为大屏。

Q7. 小程序编译报错 "Cannot read property of undefined"?

通常是用了 ?.?? 这类 ES2020 语法。微信小程序编译器默认不支持,需要改写成传统写法

// ❌ 不支持
const name = app.globalData.judgeInfo?.name
// ✅ 改写为
const info = app.globalData.judgeInfo || {}
const name = info.name

Q8. 如何重置管理员密码?

管理员密码通过 Cloudflare 环境变量 ADMIN_PASSWORD 配置。重置方法:登录 Cloudflare Dashboard → Pages → 你的项目 → Settings → Environment Variables → 修改 ADMIN_PASSWORD 的值 → 重新部署。

Q9. 裁判员登录失败 5 次被锁定了怎么办?

系统有登录失败锁定机制:密码错误 5 次自动锁定 5 分钟。解决方式:

Q10. 部署到 Cloudflare Pages 失败?

常见原因:wrangler.tomldatabase_id 没改成真实 ID。详见 DEPLOY.md

Q11. 大屏可以连接投影仪吗?

可以。推荐用一台笔记本电脑连接投影仪 → 浏览器打开大屏 → F11 全屏 → 设置浏览器开机自启。系统对宽屏(1920×1080+)和超宽屏(21:9)都做了适配。

Q12. 批量导入运动员时,分组名称不匹配怎么处理?

预览阶段会将分组不匹配的行标红,并在分组列下方显示具体原因(如"分组不匹配:运动员所属分组[少年组]不在赛事组别中")。处理方式:

🎯 避免分组不匹配的最佳实践
先在「赛事组别」中配置好所有组别,再下载运动员 Excel 模板填写数据,并从组别列表中复制粘贴组别名称,确保完全一致。

Q12. 批量导入时提示"确认导入"按钮是灰色的?

这说明预览中所有记录都不符合分组要求(全部标红),没有可导入的有效数据。需要先修正 Excel 中的组别名称,重新上传文件。

Q13. 分组字段为空的运动员能导入吗?

可以。分组为空的运动员不触发分组校验,会直接导入。导入后可在运动员管理列表中手动编辑补充组别。

Q14. 裁判员提示"账号已在其他设备登录"怎么办?

系统采用严格单点登录机制——同一裁判员账号同一时间只能在一个设备上使用(不限 Web 或小程序)。出现此提示说明该账号已在其他设备登录。解决方式:

Q15. 裁判员页面显示红色"网络已断开"横幅?

这是断网检测功能。当网络断开时,裁判端和管理端页面顶部会显示红色横幅提示。解决方式:

Q16. 成绩总览导出 Excel 时表头不对?

导出逻辑分为 4 个分支:

Q17. 批量导入/删除项目很慢?

批量导入预设项目和批量删除项目/组别都采用一次 HTTP 请求完成(使用 D1 batch 一次性执行所有 SQL),不再逐个调用 API。选 10 个项目导入或删除,只需 1 次网络请求。

💡 单点登录要点
• 先登录者不受影响,不会被挤下线
• 退出登录即可释放,无需等待超时
• Web 端和小程序端共享同一套登录限制

Q18. 审计日志怎么看?

管理员端侧边栏 → 「审计日志」菜单。页面包含: