UNNC Computer Psycho Union 辩论赛计时系统
一个专业、灵活、易用的辩论计时器,适合各类辩论赛事使用
本项目是为 UNNC Computer Psycho Union 开发的辩论赛计时系统,旨在为辩论赛提供专业、灵活的计时解决方案。
本项目维护者为:@Gentle-Lijie, @HNRobert
核心特性:
- ✨ 可视化与 JSON 双模式配置
- ⏱️ 精确到毫秒的计时系统
- 🔔 智能响铃提醒(开始/警告/结束)
- ⌨️ 完整的键盘快捷键支持
- 🎨 优雅的渐变主题与动画效果
- 📱 响应式设计,支持多种屏幕尺寸
- 🎭 支持单边与双边计时模式
- 🚀 基于 Vue 3 + TypeScript + Vite 构建
- Node.js >= 18.0.0
- pnpm >= 8.0.0 (推荐) 或 npm
# 使用 pnpm (推荐)
pnpm install
# 或使用 npm
npm installpnpm dev
# 或
npm run dev访问 http://localhost:5173 查看应用
pnpm build
# 或
npm run buildpnpm preview
# 或
npm run preview| 快捷键 | 功能 |
|---|---|
Space |
开始/暂停计时 |
S |
切换计时侧面(双边模式) |
R |
重置当前计时器 |
← |
上一阶段 |
→ |
下一阶段 |
- 点击右上角 "配置" 按钮
- 选择 "可视化编辑" 或 "JSON源码" 模式
- 添加/编辑辩论阶段
- 配置发言者、时长、响铃时机
- 保存配置
debate-timer/
├── config/
│ ├── eslint.config.ts # ESLint 配置
│ ├── postcss.config.js # PostCSS 配置
│ ├── tailwind.config.js # Tailwind CSS 配置
│ ├── tsconfig.json # TypeScript 配置
│ ├── vite.config.ts # Vite 配置
├── src/
│ ├── components/
│ │ └── screen/
│ │ ├── debateTimer.vue # 核心计时器组件
│ │ └── TimerConfigPanel.vue # 配置面板组件
│ ├── views/
│ │ └── Screen.vue # 主屏幕视图
│ ├── types/
│ │ └── screen.ts # TypeScript 类型定义
│ ├── utils/
│ │ └── timerDefaults.ts # 默认计时器配置
│ ├── style/
│ │ └── index.css # 全局样式
│ ├── App.vue # 根组件
│ └── main.ts # 应用入口
├── index.html # HTML 模板
├── package.json # 项目依赖
└── README.md # 中文 README
-
优化配置面板的视觉效果
- 改进卡片阴影和间距
- 添加更流畅的过渡动画
- 优化颜色对比度,提升可读性
-
统一整体 UI 设计语言
- 统一按钮样式(大小、圆角、阴影)
- 统一字体大小和行高
- 制定完整的设计系统文档
-
改进计时器显示效果
- 添加更多的动画效果(如数字滚动)
- 优化时间变色的渐变效果
- 添加进度条指示器
-
响应式设计优化
- 优化平板设备显示
- 优化手机端显示
- 添加触摸手势支持
-
使用专业的 JSON 编辑器
- 集成 Monaco Editor 或 CodeMirror
- 添加语法高亮
- 添加自动补全和错误提示
-
配置管理功能
- 导出配置为 JSON 文件
- 从 JSON 文件导入配置
- 保存多个配置预设
- 配置模板库(不同辩论赛制)
-
铃声自定义
- 上传自定义铃声文件
- 调整铃声音量
- 测试铃声功能
-
全屏模式
- 添加全屏切换按钮
- 优化全屏模式下的布局
- 支持 ESC 键退出全屏
-
主题切换
- 明暗主题切换
- 多种配色方案
- 自定义主题编辑器
-
辅助功能
- 添加 ARIA 标签支持
- 键盘导航优化
- 屏幕阅读器支持
-
组件拆分
- 将
debateTimer.vue(400+ 行) 拆分为更小的子组件 - 提取
StageDisplay组件 - 提取
TimerDisplay组件 - 提取
NavigationControls组件
- 将
-
逻辑提取
- 创建
useTimercomposable 管理计时逻辑 - 创建
useBellcomposable 管理铃声逻辑 - 创建
useKeyboardcomposable 管理键盘事件
- 创建
-
工具函数提取
- 将铃声生成逻辑提取到
utils/audio.ts - 将时间格式化逻辑提取到
utils/time.ts
- 将铃声生成逻辑提取到
-
添加代码注释
- 为所有公共函数添加 JSDoc 注释
- 为复杂逻辑添加行内注释
- 创建组件使用示例文档
-
单元测试
- 为工具函数编写测试
- 为 composables 编写测试
- 使用 Vitest 搭建测试环境
-
组件测试
- 为关键组件编写测试
- 使用 Vue Test Utils
- 测试键盘快捷键功能
-
E2E 测试
- 使用 Playwright 或 Cypress
- 测试完整的计时流程
- 测试配置保存与加载
-
组件文档
- 为每个组件编写使用说明
- 添加 Props、Events、Slots 文档
- 创建组件 API 参考
-
用户手册
- 编写详细的用户操作指南
- 添加常见问题解答 (FAQ)
- 制作使用视频教程
-
开发者指南
- 编写贡献指南 (CONTRIBUTING.md)
- 代码规范说明
- Git 提交规范
- 多语言支持
- 集成 vue-i18n
- 提取所有中文文本
- 添加英文翻译
- 支持语言切换
-
代码优化
- 使用
computed优化重复计算 - 使用
v-memo优化列表渲染 - 懒加载大型组件
- 使用
-
构建优化
- 配置代码分割
- 优化资源加载
- 添加 PWA 支持
-
TimerConfigPanel 验证改进
- 在保存失败时显示具体错误信息
- 改进表单验证提示
- 添加数据格式校验
-
计时精度优化
- 处理浏览器后台标签页计时偏差
- 使用 Web Worker 提高精度
我们欢迎所有形式的贡献!无论是修复 bug、添加新功能、改进文档,还是提出建议。
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
# 检查代码风格
pnpm lint:check
# 自动修复代码风格
pnpm lint:fix
# 格式化代码
pnpm format使用 Conventional Commits 规范:
feat:新功能fix:Bug 修复docs:文档更新style:代码格式调整refactor:代码重构test:测试相关chore:构建/工具链相关
示例:
feat: 添加配置导出功能
fix: 修复计时器重置时的状态错误
docs: 更新 README 中的快捷键说明
- 框架: Vue 3.5 with Composition API
- 语言: TypeScript 5.8
- 构建工具: Vite 7.1
- 样式: Tailwind CSS 4.1 + DaisyUI 5.1
- 代码规范: ESLint + Prettier
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
感谢所有为这个项目做出贡献的同学!
- 组织: UNNC Computer Psycho Union
- GitHub: CompPsyUnion/debate-timer
如果这个项目对你有帮助,请给我们一个 Star ⭐️
Built with ❤️ by UNNC Computer Psycho Union
让每一场辩论都精准计时,让每一次发言都掷地有声