一个基于 Electron + Vite + Vue 3 制作的趣味桌面摸鱼宠物。它会陪伴你度过忙碌的工作时光,实时显示下班倒计时,并在下班时刻准时提醒你"快跑"!
- 下班倒计时:实时显示距离下班的时间,精准到分钟。
- 持久化配置:自定义下班时间,重启应用后自动恢复设置(含鱼的位置记忆)。
- 喝水提醒:每 45 分钟温馨提醒喝水,点击确认后重新计时。💧
- 开机自启动:可选随系统登录自动启动。
- 系统托盘:支持最小化到托盘,右键菜单快速设置与退出,附带小鱼图标。
- 全局鼠标追踪:基于 uiohook-napi 的全局鼠标钩子(30Hz 节流),驱动鱼眼跟随与避鼠行为;可在托盘菜单开关。支持 Windows 与 Linux X11,Wayland 下自动降级为窗口内追踪。
小鱼会根据剩余工作时间变换状态:
- 🌊 平静 (蓝色):剩余时间 > 2小时 —— "安心摸鱼,老板没看我。"
- 🌟 开心 (黄色):剩余时间 < 2小时 —— "胜利在望,准备起飞!"
- 💦 紧张 (粉色):剩余时间 < 30分钟 —— "流汗冲刺,马上解放!"
- 😭 悲伤 (紫色):加班进行时 —— "别卷了,快跑吧!"
- 自主漫游:小鱼在全屏游乐场中连续游动,偶尔停下发呆;游动方向自动翻转朝向。
- 避鼠本能:鼠标靠近时小鱼会悄悄游走;快速挥向它则会触发受惊逃窜。🐟💨
- 眼神随动:小鱼的眼睛会实时追踪你的鼠标位置。
- 触碰反馈:鼠标悬停触发加速游动与金色光效。
- 随机自言自语:每隔一段时间冒出有趣的吐槽。
- 受惊模式:鼠标快速冲到鱼身边会让它变红、剧烈抖动并逃开一段距离。
- 自动睡眠:静置 3 分钟后,小鱼会进入 Zzz 睡眠状态。
- 连击彩蛋:3 秒内点击 5 次,解锁全屏彩虹特效与皇冠装饰!👑
- 框架: Electron 31 + Vue 3
- 构建工具: electron-vite
- 语言: TypeScript
- 测试: Vitest(fake timers,65 个单元测试)
- 打包: electron-builder
src/
├── main/ # Electron 主进程
│ ├── index.ts # 游乐场窗口、托盘接线、IPC 注册
│ ├── config.ts # configStore:配置唯一属主(去抖持久化)
│ ├── menu.ts # 菜单模块:tray / 右键菜单 / 自启动序列
│ └── globalMouse.ts # 全局鼠标钩子模块(uiohook-napi,30Hz 节流)
├── preload/ # 预加载脚本 (安全的 API 桥接)
├── shared/ # 跨进程共享类型 (Config / window.api 契约)
└── renderer/ # Vue 渲染进程
└── src/
├── App.vue
├── components/
│ └── DesktopPet.vue # 宠物状态组合与模板
├── composables/
│ ├── PetScheduler.ts # 定时器调度模块(after/every/cancel)
│ ├── usePetScheduler.ts
│ └── useDrag.ts # 拖拽模块(位移、点击判定)
└── lib/
├── petTime.ts # 时间推导模块(心情阈值与文案)
├── fishPosition.ts # 鱼位置纯逻辑(初始落点、屏幕收敛)
└── fishMotion.ts # 运动模块:漫游/避鼠/逃窜转向力(MOTION 参数)
npm installnpm run devnpm test# 构建并打包成安装包 (Windows .exe / Linux)
npm run dist- 移动:左键长按小鱼可拖拽至屏幕任意位置。
- 设置:右键点击小鱼或托盘图标,选择“设置下班时间”。
- 互动:尝试点击、快速晃动鼠标或静置屏幕,探索更多动画细节。
- 全屏游乐场窗口:320×200 小窗改为覆盖主屏的透明置顶游乐场窗口,鱼变为窗口内可拖拽的定位元素,活动范围扩展至全屏
- 自主漫游与避鼠:定时小幅漂移升级为 ~30Hz 转向力积分(漫游 + 边缘软斥力 + 鼠标回避场,参数集中在
MOTION);鼠标进入回避半径鱼会悄悄游走,快速贴近触发受惊逃窜,游动方向自动翻转朝向 - 全局鼠标追踪:基于 uiohook-napi 的全局鼠标钩子(30Hz 节流),鱼眼在全屏范围注视鼠标;托盘菜单可开关,支持 Windows 与 Linux X11,Wayland 下自动降级
- 动态点击穿透:默认全屏穿透,光标位于鱼或交互 UI 上时经
elementFromPoint命中检测临时恢复交互 - 系统托盘图标:补齐托盘小鱼图标(
scripts/generate-tray-icon.mjs生成,PNG 内联进主进程 bundle) - 位置持久化改为"停靠点"语义:停歇、逃窜结束、拖拽结束、退出时落盘
- 架构重构(行为零变化):
- 全部定时行为收归
PetScheduler模块,修复组件卸载后定时器继续触发的隐患 - 拖拽逻辑收归
useDrag模块;菜单构建收归menu模块;时间/心情推导收归petTime模块 - 配置收归
configStore唯一属主:写盘去抖、退出时兜底落盘、坏配置自动回退默认值 Config与window.api类型统一至src/shared/,三进程共享单一契约
- 全部定时行为收归
- 测试基建:引入 Vitest(29 个单元测试),push / PR 时由 GitHub Actions 自动运行
- 新增喝水提醒系统与交互视觉
- 支持开机自启动
- 睡眠 / 受惊模式、连击系统与粒子特效
GNU General Public License v3.0 or later(GPL-3.0-or-later)
Copyright (C) 2026 jimmyshe