Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

辩论赛计时器(DebateTimer)

版本:3.1.0 | 作者:Chen Yu | 许可证:GPL-3.0

DebateTimer 是一款基于 Electron 的离线桌面辩论赛计时器,提供编辑器与计时两种视图,支持导出为独立 Windows 安装程序以便比赛现场脱机使用。

破坏性变更 / Breaking Changes(3.0.0)

3.0.0 引入不兼容的配置 schema 变更与导出方式调整,首次启动时旧配置会自动迁移并备份,无需手动干预:

  • 配置自动迁移:旧版 config.json(无 version 字段或 version < 3)会在首次启动时自动迁移到 version: 3 格式。迁移前系统会将原始配置备份为 config.json.v2.bak(位于用户数据目录)。
  • 字段变更theme.backgroundImageSettings.scale 已被移除并拆分为 scaleXscaleY;迁移函数会自动将旧 scale 值复制到 scaleX / scaleY
  • 导出方式:WinRAR SFX 导出已正式移除;独立计时器导出仅支持 NSIS 安装包。

功能特性

  • 所见即所得编辑界面:直接在计时器预览中编辑所有文本元素,支持点击修改内容/字体/字号/颜色,拖动调整位置
  • 赛事配置:编辑赛事名称、正反方队伍与辩题
  • 环节管理:支持无计时、单边计时、单边发问、中立计时、双边对辩等多种环节类型;可自由增删改环节、调整顺序
  • 名称模板:通过"持方 + 辩位 + 模板名称 + 附加项"快速生成规范环节名
  • 主题样式
    • 自定义单个颜色(正反方色、中立色、标题色、背景色)
    • 支持纯色/渐变/图片三种背景类型,图片支持透明度、缩放、XY偏移
    • 调整字体(系统字体)与字号缩放
    • 支持上传自定义 TTF/OTF 字体文件(仅用于文本显示)
    • 状态栏支持高度拖拽和颜色/透明度/渐变自定义
  • 导入/导出配置:将当前比赛配置保存为 JSON 文件,或从外部 JSON 文件导入配置;支持背景图片 Base64 硬编码
  • 导出独立计时器:将当前配置与 Electron 运行时打包为单个安装程序 EXE,双击后按向导安装到本地,自动创建桌面和开始菜单快捷方式,安装完成后直接启动;赛前可修改队伍名称与辩题,不可修改其他配置。安装包版本号与元数据统一使用 package.json 中的真实版本号。无需目标电脑安装 Node.js
  • 自动更新:集成 electron-updater,启动时自动检测 GitHub Releases 新版本并提示安装
  • 跨平台构建配置:除 Windows NSIS/Portable 外,同时配置 macOS(dmg / zip)与 Linux(AppImage)分发目标
  • GitHub Actions 自动发布:推送 v* 标签即可触发工作流自动构建并上传分发包到 Release
  • 安装包体积优化:清理 vendor/nsis 非必需目录并裁剪 Electron 运行时,减小最终分发包体积
  • 计时控制:启动/暂停、停止、重置、切换环节、环节跳转、设置时间、切换持方、全屏、音效试播等
  • 现代化界面:玻璃拟态卡片、底部悬浮胶囊控制面板、数字倒计时进度条、Toast 通知系统
  • 完全离线:不依赖任何外部 CDN 或网络资源,所有字体使用系统字体

技术栈

  • Electron 42.x
  • 原生 HTML / CSS / JavaScript(无框架、无构建工具)
  • Web Audio API 提示音(零外部音频文件)
  • NSIS(Nullsoft Scriptable Install System)独立计时器安装包生成
  • electron-updater 自动更新
  • CommonJS(主进程)+ 全局脚本(渲染进程)
  • preload.js 安全 IPC 桥接(遵循 Electron 安全最佳实践)

安装与运行

npm install
npm start

首次启动会打开编辑页。修改配置后点击"保存配置"即可进入计时页;点击计时页控制面板的"返回(B)"可回到编辑页。也可直接点击"进入计时页"在不保存的情况下预览计时效果。

编辑页说明

编辑页采用左侧导航栏 + 右侧内容面板布局。

  • 编辑界面
    • 直接嵌入完整的计时器预览,所见即所得
    • 点击文本元素(队伍名称、辩题、赛事名称等)弹出浮动工具栏,可编辑内容、字体、字号、颜色
    • 拖动文本元素可调整位置,对称元素(正反方)自动同步移动
    • 状态栏底部拖拽手柄可调整高度,点击空白处编辑颜色/透明度/渐变
    • "修改背景"按钮进入背景编辑模式,支持纯色/渐变/图片三种类型
    • 背景图片支持透明度、缩放、XY偏移,以 Base64 编码存储到配置中
  • 环节管理
    • 环节管理面板采用左侧固定边栏 + 右侧可滚动列表布局
    • 左侧边栏包含:
      • 导航栏:纵向列出所有环节,支持鼠标拖拽排序,左键拖拽时选中项虚化,跟随鼠标显示放大倾斜预览,其他项自动滑动让位,并显示蓝色发光占位条
      • 快捷操作+ 无计时 / + 陈词 / + 质询 / + 中立计时 / + 对辩 / + 自由辩论 按钮始终可见,不受列表滚动影响
      • 右键菜单:在导航栏任意环节上右键可执行:定位到该环节 / 上移 / 下移 / 删除
    • 在环节卡片中修改名称、类型、时长与持方
    • 使用名称模板下拉框快速生成规范名称,点击"确认名称"应用
    • 通过"上移/下移/删除"调整环节顺序或移除环节
  • 导入/导出
    • 导入配置:从 JSON 文件加载比赛配置,自动校验字段,自动迁移旧版配置
    • 导出配置:将当前完整配置保存为 JSON,包含所有布局、状态栏、背景设置,便于备份或分享
    • 导出独立计时器:生成一个 NSIS 安装程序 EXE,双击按向导安装后即可启动;打开后仅允许修改队伍名称与辩题
  • 顶部操作栏:包含保存配置、重置默认、导入配置、导出配置、导出独立计时器、进入计时页等按钮

计时页说明

  • 顶部全宽状态栏:左侧显示正方队伍(红色背景)+ 辩题,右侧显示反方队伍(蓝色背景)+ 辩题,中间显示赛事名称。状态栏高度和颜色可在编辑页自定义
  • 中央显示赛事名称、当前环节名称
  • 单边计时显示单个大型倒计时器,颜色随持方变化(正方红 / 反方蓝 / 中立白)
  • 双边对辩显示正反方两个独立倒计时器,颜色区分
  • 中立计时显示单个大型白色倒计时器,用于中场暂停或评委限时述票,不区分正方反方
  • 无计时环节以超大字号展示环节名称,不显示计时器
  • 进度条:单边计时和中立计时模式下数字下方显示进度条,最后 30 秒变黄,最后 5 秒变红并脉冲闪烁
  • 控制面板:底部居中悬浮胶囊,半透明 + 毛玻璃背景,分组按钮(主控/导航/操作/音效/系统),hover 显示快捷键提示
  • 快捷键:
    • Space 启动/暂停(双边计时为切换发言方)
    • P 暂停
    • Q/W/E 试播 30 秒/5 秒/结束提示音
    • F 全屏
    • B 返回编辑页(独立运行时为"队伍设置")
    • ←/→ 切换环节
    • C 切换持方(仅对单边计时有效)

开发检查

在提交代码或发起 Pull Request 前,建议在本地依次执行以下检查,确保代码风格、测试与语法正确:

# 1. 代码风格检查
npm run lint
# 2. 运行测试
npm test# 3. 检查主进程与核心模块语法
node --check main.js
node --check js/timer-core.js
node --check js/editor-app.js
node --check js/timer-app.js
node --check js/main/ipc.js
node --check js/main/windows.js
node --check js/main/export.js
# 4. 打包验证(不发布)
npx electron-builder --publish never

以上步骤与 .github/workflows/ci.yml 中的持续集成流程保持一致。

打包与发行

项目内置 electron-builder 配置,支持以下分发目标:

  • Windows:NSIS 安装包(64-bit)、便携版(Portable)
  • macOS:dmg / zip
  • Linux:AppImage

生成分发包:

npm run dist

构建输出位于 dist/ 目录(安装包命名会包含版本号)。

自动更新

DebateTimer 3.0.0 集成 electron-updater,启动时会检查 GitHub Releases 中的最新版本。若存在新版本,将提示用户下载并安装更新。

独立计时器安装包(应用内导出)

在编辑页点击“导出独立计时器”,应用会将当前配置和 Electron 运行时打包为一个 NSIS 安装程序 EXE。安装包版本号与元数据统一使用 package.json 中的真实版本号。运行该安装程序会:

  1. 检测旧版本并提示卸载
  2. 按用户选择目录安装
  3. 创建桌面快捷方式和开始菜单文件夹
  4. 安装完成后自动启动计时器

目标电脑无需安装 Node.js 或 NSIS。

发布流程

通过推送符合 v* 格式的 Git 标签触发 GitHub Actions 自动发布:

git tag v3.1.0
git push origin v3.1.0

工作流 .github/workflows/release.yml 会自动执行 npm cinpm run dist,并将 dist/ 下的 .exe.blockmap.yml.zip 文件上传到对应版本的 GitHub Release 中。

目录结构

.
├── main.js # Electron 主进程(窗口管理、IPC、配置持久化、日志、EXE 导出、自动更新)
├── preload.js # 渲染进程 IPC 安全桥接
├── editor.html # 编辑页(所见即所得预览 + 环节管理)
├── timer.html # 计时页
├── js/
│ ├── audio.js # Web Audio API 提示音生成(零外部音频文件)
│ ├── timer-core.js # 计时引擎核心(计时逻辑、状态管理)
│ ├── timer-app.js # 计时页 UI 控制(渲染、快捷键、主题应用)
│ ├── editor-app.js # 编辑页逻辑(预览交互、文本编辑、背景编辑、环节管理、拖拽排序)
│ └── toast.js # Toast 通知系统 + 自定义确认对话框
├── styles/
│ ├── variables.css # CSS 变量系统 + 通用组件(Toast、模态框、按钮、卡片)
│ ├── editor.css # 编辑页样式(预览区域、浮动工具栏、侧边栏、环节卡片、拖拽排序、响应式)
│ └── timer.css # 计时页样式(顶栏、计时器、进度条、控制面板、模态框)
├── vendor/
│ ├── embedded-binaries.js # 嵌入的 Electron 默认图标
│ └── nsis/ # 内置 NSIS 编译器(用于应用内导出独立计时器安装包)
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions 自动发布工作流
├── package.json
├── README.md
├── CHANGELOG.md # 版本变更日志
├── .gitignore
├── .npmrc
└── LICENSE # GPL-3.0

许可

GPL-3.0

© Chen Yu 2026 All rights reserved.

About

一款基于 Electron 的桌面辩论赛计时器,支持配置赛事信息、环节、主题样式,并在计时页进行倒计时展示与提示音提醒。

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages