ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【开源小工具】桌面闹钟

【开源小工具】桌面闹钟 simpl-clock · 桌面闹钟本地win系统自带闹钟应用不知道咋的启动不了估计是盗版系统引起的于是自己写一个简单闹钟小程序。一个基于Tauri 2 Vue 3 TypeScript的轻量桌面闹钟。到点后弹出一个独立于主窗口的提醒窗口屏幕居中、置顶主窗口最小化或隐藏到托盘时依然能看到支持单次与「每 N 天」重复提醒、稍后提醒、系统托盘常驻。下载地址【桌面闹钟源码 https://gitee.com/aqu415/kk-alarm-clock.git】【桌面闹钟releases https://gitee.com/aqu415/kk-alarm-clock/releases】界面预览① 新建 / 管理闹钟主窗口主窗口分为上下两部分上半区填写「日期时间 / 备注说明 / 提醒频率」并保存下半区是闹钟列表每条可执行「修改 / 失效生效/ 删除」。② 到点提醒独立弹窗提醒窗口是独立顶层窗口默认出现在屏幕中央并置顶不占用任务栏显示触发时间与备注可「关闭」或「5 分钟后提醒」。功能特性功能说明闹钟管理新建、修改、删除按触发时间升序展示失效的闹钟显示删除线提醒频率单次或每 1~7 天重复重复闹钟触发后自动顺延到下一次独立提醒窗口脱离主窗口的顶层窗口屏幕居中、始终置顶、无边框、不在任务栏显示稍后提醒弹窗内一键「5 分钟后提醒」以当前时间 5 分钟重新排期系统托盘左键切换主窗口显示/隐藏右键菜单「关闭」退出程序本地持久化每次变更实时写入~/.clock/tasks.json重启不丢数据错过不补弹进程未运行期间已过点的闹钟只静默处理不会在启动时弹出一堆过期提醒纯自绘提醒提醒完全由应用自己的窗口呈现不向操作系统推送系统通知深色模式跟随系统prefers-color-scheme自动适配主窗口配色技术栈层面技术版本用途桌面框架Tauri2.xRust窗口、托盘、系统集成产物体积小、内存占用低前端框架Vue^3.5Composition API script setup单文件组件开发语言TypeScript~6.0前端类型安全vue-tsc做类型检查构建工具Vite^8.0 vitejs/plugin-vue^6开发服务器端口 1420与生产构建包管理pnpm—依赖安装与脚本执行Tauri APItauri-apps/api^2 /tauri-apps/cli^22.x前端调用 Rust 命令、事件通信、窗口控制打开外链tauri-plugin-opener2.x平台默认程序打开链接/文件Rust 依赖tauri启用tray-icon、serde、serde_json、dirs—托盘图标、序列化、定位用户主目录渲染内核WebView2 / WKWebView / WebKitGTK—Windows / macOS / Linux 的系统 WebViewRust 侧[profile.release]开启了lto、strip、panic abort、codegen-units 1、opt-level 3用于压缩发布产物体积。项目结构tauri-demo/ ├── doc/ # 文档截图操作演示 │ ├── 01创建闹钟.png │ └── 02闹钟提醒.png ├── src/ # 前端源码 │ ├── main.ts # 入口按 URL 参数决定挂载哪个根组件 │ ├── App.vue # 主窗口新建/列表/定时检查/弹窗调度 │ ├── alarm.ts # 闹钟类型、读写、时间格式化与下次触发计算 │ ├── assets/ # 前端静态资源 │ └── components/ │ ├── AlarmWindow.vue # 提醒窗口容器接收事件、关闭/稍后提醒 │ └── AlarmDialog.vue # 提醒内容纯展示组件 ├── src-tauri/ # Rust 后端 │ ├── src/lib.rs # 命令、托盘、窗口事件、应用入口 │ ├── src/main.rs # 二进制入口调用 lib.rs 的 run() │ ├── tauri.conf.json # 应用/窗口/打包配置 │ ├── capabilities/default.json # 窗口权限ACL │ ├── icons/ # 全套应用图标含圆角源图 │ ├── build.rs # tauri-build 构建脚本 │ └── Cargo.toml ├── public/ # 免构建的静态资源favicon 等 ├── index.html # Vite 页面模板 ├── vite.config.ts # 端口 1420、忽略 src-tauri 监听 ├── tsconfig.json # TypeScript 配置 └── package.json运行与构建环境要求Node.js 18 与 pnpmRust 稳定版工具链Windows 需 MSVC 生成工具WebView2 运行时 Win10/11 一般已内置系统依赖参考 Tauri prerequisites# 安装前端依赖pnpminstall# 开发模式自动启动 Vite 并拉起桌面窗口支持热更新pnpmtauri dev# 构建发布包先 vue-tsc 类型检查 vite 构建再编译 Rust 并打包安装程序pnpmtauri build# 仅前端本地开发服务器 / 生产构建产物在 dist/pnpmdevpnpmbuildbundle.targets为all会依据当前平台生成对应安装包Windows 下为 NSIS/MSImacOS 为 dmg/appLinux 为 deb/rpm/AppImage。实现要点双窗口与路由应用声明了两个窗口见src-tauri/tauri.conf.jsonlabel用途关键属性main主窗口闹钟管理800×600标题「闹钟」alarm提醒窗口368×264、center、alwaysOnTop、resizable:false、skipTaskbar:true、decorations:false、visible:false启动即隐藏复用而不重建两个窗口共用同一份前端产物通过 URL 查询参数区分渲染内容// src/main.tsconstisAlarmWindownewURLSearchParams(window.location.search).get(window)alarm;createApp(isAlarmWindow?AlarmWindow:App).mount(#app);数据流主窗口 main —— App.vue · 新建 / 修改 / 删除闹钟列表按时间升序展示 · 每 1 秒检查一次到期闹钟命中后进入 ringing 状态 │ │ ① invoke(show_alarm_window) → 由 Rust 创建/显示窗口并置顶聚焦 │ ② emit(alarm-show, payload) → 广播闹钟数据localStorage 兜底 ▼ 提醒窗口 alarm —— AlarmWindow.vue → AlarmDialog.vue · 展示触发时间与备注提供「关闭」/「5 分钟后提醒」 │ │ ③ emit(alarm-close) / emit(alarm-snooze, newTimestamp) │ ④ invoke(hide_alarm_window) → 由 Rust 隐藏窗口窗口保留复用 ▼ Rust 后端 src-tauri/src/lib.rs · 命令load_tasks / save_tasks / show_alarm_window / hide_alarm_window · 系统托盘、窗口关闭拦截、窗口显隐与置顶 │ ▼ ~/.clock/tasks.json —— 本地持久化主 → 提醒窗口主窗口先写入localStorage兜底再emit(alarm-show, payload)广播数据最后invoke(show_alarm_window)由 Rust 显示窗口置顶 聚焦。窗口常驻隐藏、监听器已就绪因此不会有首次弹出的白屏或丢数据问题。提醒 → 主窗口点「关闭」emit(alarm-close)点「5 分钟后提醒」emit(alarm-snooze)携带新时间戳主窗口据此清理状态或重排闹钟。窗口关闭一定生效隐藏动作由 Rust 的hide_alarm_window完成即使事件异常也先兜底getCurrentWindow().hide()避免弹窗关不掉。定时检查与「错过不补弹」主窗口每 1 秒执行一次检查找出所有「有效且已到点」的闹钟取触发时间最早的一个重复闹钟推进到下一次触发时间单次闹钟置为失效否则会被定时器反复命中弹窗停不下来置为ringing状态并弹出提醒窗口同一时刻只保留一个弹窗。启动时还会调用一次skipMissedAlarms()触发时间早于本次进程启动时刻的闹钟视为「应用没运行时错过的提醒」重复闹钟静默顺延到下一次、单次闹钟直接置为失效都不弹窗。因此「建 12:45 的闹钟 → 关闭进程 → 12:46 再打开」不会再补弹过期提醒保留 30 秒启动容差避免恰好在到点瞬间重启时误判。托盘与关闭行为系统托盘使用应用图标创建左键单击切换主窗口显示/隐藏右键菜单「关闭」调用app.exit(0)真正退出。主窗口与提醒窗口的CloseRequested事件都被拦截为prevent_close() hide()所以点窗口右上角的关闭按钮只是隐藏到托盘程序继续在后台守候闹钟要退出请用托盘右键菜单。数据文件数据保存在用户主目录下的~/.clock/tasks.jsonWindows 为C:\Users\用户名\.clock\tasks.json目录不存在时自动创建[{id:1730000000000-ab12cd,timestamp:1730003600000,remark:开会,enabled:true,repeatDays:0}]字段类型说明idstring唯一标识由时间戳 随机串生成timestampnumber触发时间戳毫秒remarkstring备注说明空值时展示为「闹钟」enabledboolean是否有效失效后不再提醒repeatDaysnumber0单次1~7表示每 N 天重复读取时会做字段校验与兼容处理缺失repeatDays的旧数据按每天重复处理文件不存在或内容非法时返回空列表不会导致启动失败。权限配置Tauri 2 通过 capability 控制前端可调用的能力src-tauri/capabilities/default.json对main、alarm两个窗口同时授权core:default事件监听/广播等核心能力opener:default调用系统默认程序打开链接core:window:allow-set-focus/allow-show/allow-hide/allow-unminimize窗口显隐与聚焦窗口的创建、置顶与隐藏主要由 Rust 侧命令完成前端无需额外的窗口管理权限。应用图标src-tauri/icons/下是打包与任务栏使用的全套图标PNG 各尺寸、icon.ico、icon.icns、Windows Store 方形图。需要更换图标时用一张正方形 PNG 重新生成即可pnpmtauri icon src-tauri/icons/icon-source-rounded.png其中icon-source-rounded.png是当前的 1024×1024 圆角源图白底方图去掉四角、半径约为边长的 18%图案零裁切。图标会内嵌进可执行文件修改后需重新构建才能在任务栏/快捷方式上看到新图标Windows 图标缓存偶尔滞后重启应用或重新登录即可刷新。下载地址【桌面闹钟源码 https://gitee.com/aqu415/kk-alarm-clock.git】【桌面闹钟releases https://gitee.com/aqu415/kk-alarm-clock/releases】over~~
返回列表