灵伴桌面宠物 — 功能模块说明
1. 宠物窗口模块
1.1 视觉呈现
| 特性 |
实现方式 |
| 透明背景 |
Electron 窗口 transparent: true + CSS background: transparent |
| 无边框 |
frame: false |
| 置顶显示 |
alwaysOnTop: true |
| 阴影效果 |
CSS filter: drop-shadow() |
| 光晕 |
.aura 元素,glow 动画 3s 脉冲 |
1.2 动画系统
| 动画名 |
时长 |
效果 |
breathe |
4.8s |
上下浮动 4px + 缩放 1→1.03→1 |
sway |
11s |
左右旋转 ±1.5deg |
glow |
3s |
光晕透明度 0.6→1→0.6 |
greet |
760ms |
点击跳动:上弹+旋转+缩放 |
heart-rise |
1.3s |
爱心粒子上升+旋转+缩放消失 |
动画控制:
- 通过
animation 设置控制开关
- 尊重系统
prefers-reduced-motion: reduce 设置
1.3 交互行为
| 交互 |
行为 |
实现 |
| 拖拽 |
移动宠物位置 |
pointerdown/move/up → IPC → 主进程 win.setPosition() |
| 滚轮 |
缩放 0.5x ~ 1.75x |
wheel 事件,40ms 防抖 |
| 单击 |
爱心粒子 + 跳动动画 |
在点击位置生成随机 ♥/✦ 粒子 |
| 双击 |
打开控制中心 |
dblclick → IPC openManager() |
| 右键 |
上下文菜单 |
contextmenu → IPC showContextMenu() |
1.4 自定义图片
- 支持格式:PNG, JPG, GIF, WebP, APNG
- 图片复制到用户数据目录
- 加载成功/失败通过
reportDiagnostic 记录日志
2. 控制中心模块
2.1 布局结构
┌──────────────┬─────────────────────────────────┐
│ 左侧边栏 │ 右侧工作区 │
│ │ │
│ ┌────────┐ │ ┌───────────────────────────┐ │
│ │宠物预览 │ │ │ 任务列表 │ │
│ │ 卡片 │ │ │ ┌───┐ ┌───┐ ┌───┐ │ │
│ └────────┘ │ │ │任务│ │任务│ │任务│ ... │ │
│ │ │ └───┘ └───┘ └───┘ │ │
│ ┌────────┐ │ └───────────────────────────┘ │
│ │宠物设置 │ │ │
│ │·开机自启│ │ ┌───────────────────────────┐ │
│ │·总在最前│ │ │ 任务编辑器 │ │
│ │·动态效果│ │ │ 名称: [____] │ │
│ │·大小 │ │ │ 时间: [____] │ │
│ └────────┘ │ │ 启用: [switch] │ │
│ │ │ 说明: [____] │ │
│ ┌────────┐ │ │ 脚本: [textarea] │ │
│ │旧任务 │ │ │ [保存] [删除] [运行] │ │
│ │迁移 │ │ └───────────────────────────┘ │
│ └────────┘ │ │
└──────────────┴─────────────────────────────────┘
2.2 视觉设计
- 主题:深色主题,CSS 变量驱动
- 主色调:紫色
#9573f2 + 青色强调 #43d8c2
- 面板:毛玻璃效果
backdrop-filter: blur()
- 背景:渐变光晕
- 交互:自定义 checkbox 开关、range 滑块、滚动条
2.3 功能操作
| 操作 |
说明 |
| 新建任务 |
点击”新建”按钮,清空编辑器 |
| 编辑任务 |
点击任务列表中的任务,填充编辑器 |
| 保存任务 |
点击”保存”,校验后通过 IPC 持久化 |
| 删除任务 |
点击”删除”,确认后移除 |
| 启用/禁用 |
点击任务开关或编辑器开关 |
| 手动运行 |
点击”运行”立即执行 PowerShell 脚本 |
| 重置任务 |
恢复为 3 个默认内置模板 |
3. 系统托盘模块
3.1 托盘功能
| 操作 |
行为 |
| 左键单击 |
切换宠物显示/隐藏 |
| 左键双击 |
打开控制中心 |
| 右键菜单 |
显示宠物 / 隐藏宠物 / 控制中心 / 退出 |
3.2 托盘图标
- 文件:
assets/tray.png (32x32)
- 随应用启动创建,退出时销毁
4. 配置存储模块
4.1 数据持久化
- 格式:JSON
- 路径:
%APPDATA%/<Electron userData>/config.json
- 写入策略:先写
.tmp → fs.rename(原子操作)
4.2 容错机制
读取配置:
try JSON.parse → 成功 → 合并默认值
→ 失败 → 备份为 config.json.broken-{timestamp}
→ 使用默认配置
4.3 数据校验
| 字段 |
校验规则 |
| 任务名称 |
非空字符串 |
| 任务时间 |
HH:mm 格式 |
| 任务脚本 |
非空,最大长度限制 |
5. 任务调度模块
5.1 调度策略
- 轮询间隔:每 5 秒
- 匹配精度:分钟级别(HH:mm)
- 防重复:
lastRunDate 记录每日运行状态
5.2 执行流程
1. tick() 触发
2. 遍历所有 enabled 任务
3. 比对当前时间与任务时间
4. 检查 lastRunDate !== today
5. 写入 .ps1 临时文件 (UTF-8 BOM)
6. 执行 powershell.exe -File xxx.ps1
7. 收集 stdout/stderr (最近16KB)
8. 写入 task-runs.log
9. 发送事件通知 UI
5.3 内置任务详情
早起 (08:00)
# 启动 Wallpaper Engine
Start-Process -FilePath "steam://rungameid/431960"
锻炼 (20:00)
# 切换 Wallpaper Engine 壁纸
# 通过 Steam 协议启动并传参
早睡+关机 (23:00)
# 停止 Wallpaper Engine
Stop-Process -Name "wallpaper64" -Force -ErrorAction SilentlyContinue
Stop-Process -Name "wallpaper32" -Force -ErrorAction SilentlyContinue
# 15分钟后关机
shutdown /s /t 900
6. 旧任务迁移模块
6.1 功能说明
检测并接管用户已有的 Windows 计划任务(早起、锻炼、早睡),将其禁用并启用应用内对应模板。
6.2 实现方式
- 以管理员权限运行 PowerShell
- 禁用旧的计划任务
- 启用应用内对应的内置模板
6.3 触发方式
控制中心 → 旧任务迁移面板 → 点击对应按钮 → 确认对话框 → 执行迁移