本文档作为 Rubick 效率工具箱实战开发的总体设计文档,涵盖项目背景、核心功能需求、技术架构、非功能性需求等内容,为后续各模块开发提供权威指南。
在日常的开发和工作中,我们经常需要在不同的工具和应用之间频繁切换,这极大地影响了我们的工作效率。为了解决这一痛点,我们构思并开发了一款名为 Rubick 的桌面端效率工具箱。它旨在通过一个统一的入口,集成各种常用工具,并通过插件化的方式,让用户可以根据自己的需求进行功能扩展,从而打造一个个性化、高效率的工作环境。
本实战篇将以 Rubick 项目为原型,详细介绍如何从零开始,一步步实现一个功能强大、可扩展的桌面端工具箱。
本系列文章主要面向以下读者:
Rubick 的实现原理,或者寻求在自己的项目中实现类似功能的灵感。Rubick 简介Rubick 是一款基于 Electron 开发的开源、免费的桌面端效率工具箱。它的核心理念是通过一系列辅助插件,解决工作、学习、开发中遇到的效率问题。
您可以将 Rubick 理解为一个类似于微信的平台,而插件则是基于 Rubick 开发的“小程序”。不同的是,微信的核心功能是“聊天”,而 Rubick 的核心功能是“效率工具”。
为了提供现代化和简洁的用户界面,Rubick 的窗口将采用无边框设计。这要求我们自行实现窗口的拖拽和缩放功能。
主搜索窗口拖拽
插件窗口控件
作为效率工具,快速检索并启动本地应用是核心功能之一。
Rubick 需要能够扫描并索引用户系统中所有已安装的应用程序。为了保持核心应用的轻量和灵活性,Rubick 必须采用插件化的设计体系
Webview 中,拥有独立的进程,确保了环境隔离。IPC (Inter-Process Communication) 进行通信。超级面板是一个系统级的增强菜单,旨在提供比传统右键菜单更强大、更可定制的功能。
为了持久化用户数据并支持在不同设备间同步,需要设计一套可靠的数据存储和同步方案。
我们将采用 JSON 格式来存储数据,因为它具有良好的可读性和灵活性。
用户配置 (user_config.json)
{
"theme": "dark",
"hotkey": {
"show_hide": "Option+Space",
"super_panel": "Command+Shift+Space"
},
"auto_launch": true
}插件数据 (plugin_data.json)
{
"installed_plugins": [
{
"name": "translator",
"version": "1.0.0",
"enabled": true
},
{
"name": "image_compressor",
"version": "1.2.0",
"enabled": true
}
],
"plugin_specific_data": {
"translator": {
"default_language": "en"
}
}
}除了核心功能外,Rubick 还将提供一些基础的桌面端工具。
Vue.js 和 Element Plus 构建,提供流畅的搜索和交互体验。Webview 中,实现了安全的沙箱环境。Vue.js 构建,响应迅速,提供上下文相关的操作。lowdb,一个轻量级的 JSON 文件数据库,易于集成和使用。RESTful API 与后端服务通信,实现数据同步。Electron 提供的 API,实现与操作系统的深度集成,如系统托盘、全局快捷键等。Windows 10 及以上、macOS 10.13 及以上、以及主流 Linux 发行版Rubick 上依然可用Rubick 提供了一套完整的 API 接口,供插件开发者调用。这些接口主要通过 preload.js 注入到渲染进程中,通过 window.rubick 对象访问。
| 接口名称 | 功能描述 | 参数说明 | 返回值 |
|---|---|---|---|
hideMainWindow() | 隐藏主搜索窗口 | 无 | void |
showMainWindow() | 显示主搜索窗口 | 无 | void |
copyText(text) | 复制文本到剪贴板 | text: string - 要复制的文本 | void |
showNotification(msg) | 显示系统通知 | msg: string - 通知内容 | void |
getDbValue(key) | 获取本地存储数据 | key: string - 数据键名 | Promise<any> |
setDbValue(key, value) | 设置本地存储数据 | key: string, value: any | Promise<void> |
shellOpenPath(path) | 在文件管理器中打开路径 | path: string - 文件路径 | void |
interface WindowAPI {
/**
* 设置窗口尺寸
* @param width 窗口宽度
* @param height 窗口高度
*/
setSize(width: number, height: number): void;
/**
* 设置窗口位置
* @param x 横坐标
* @param y 纵坐标
*/
setPosition(x: number, y: number): void;
/**
* 最小化窗口
*/
minimize(): void;
/**
* 最大化/还原窗口
*/
maximize(): void;
/**
* 关闭当前插件窗口
*/
close(): void;
}插件与主进程之间的通信采用 Electron 的 IPC 机制:
// 渲染进程 -> 主进程
window.rubick.ipcInvoke(channel, ...args): Promise<any>
// 主进程 -> 渲染进程(监听)
window.rubick.on(channel, callback): void
// 移除监听
window.rubick.removeListener(channel, callback): void系统插件支持以下生命周期钩子:
| 钩子名称 | 触发时机 | 用途 |
|---|---|---|
beforeReady() | Electron App ready 事件前 | 初始化配置、注册协议 |
onReady(ctx) | Electron App ready 事件后 | 创建窗口、注册快捷键 |
onRunning(ctx) | 应用运行时 | 处理激活、多实例事件 |
onUnload() | 插件卸载时 | 清理资源、注销监听 |
onQuit() | 应用退出时 | 保存状态、清理资源 |
config.json){
"version": "1.0.0",
"theme": {
"mode": "system",
"primaryColor": "#1890ff"
},
"hotkey": {
"showHide": "Option+Space",
"superPanel": "Command+Shift+Space",
"screenshot": "Command+Shift+A"
},
"autoLaunch": true,
"language": "zh-CN"
}| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
version | string | - | 配置文件版本号 |
theme.mode | 'light' | 'dark' | 'system' | 'system' | 主题模式 |
theme.primaryColor | string | '#1890ff' | 主题色 |
hotkey.showHide | string | 'Option+Space' | 显示/隐藏主窗口快捷键 |
hotkey.superPanel | string | 'Command+Shift+Space' | 超级面板快捷键 |
autoLaunch | boolean | true | 是否开机自启动 |
language | string | 'zh-CN' | 界面语言 |
package.json)UI 插件和系统插件的配置字段略有不同:
UI 插件配置:
{
"name": "plugin-name",
"pluginName": "插件显示名称",
"version": "1.0.0",
"description": "插件描述",
"author": "作者名称",
"main": "index.html",
"preload": "preload.js",
"logo": "logo.png",
"pluginType": "ui",
"features": [
{
"code": "feature-code",
"explain": "功能说明",
"cmds": ["关键词1", "关键词2"]
}
],
"development": "http://localhost:8080"
}系统插件配置:
{
"name": "system-plugin-name",
"pluginName": "系统插件名称",
"version": "1.0.0",
"description": "插件描述",
"author": "作者名称",
"pluginType": "system",
"main": "index.js"
}| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 插件唯一标识,npm 包名格式 |
pluginName | 是 | 插件在界面显示的名称 |
version | 是 | 插件版本号,遵循语义化版本 |
description | 否 | 插件功能描述 |
author | 否 | 作者信息 |
main | 是 | 入口文件路径 |
preload | 否 | 预加载脚本路径(仅 UI 插件) |
logo | 否 | 插件图标,支持本地路径或 URL |
pluginType | 是 | 插件类型:'ui' 或 'system' |
features | 是 | 功能定义数组(仅 UI 插件) |
development | 否 | 开发环境地址(仅 UI 插件) |
features 数组定义了插件提供的所有功能:
interface PluginFeature {
/** 功能唯一标识 */
code: string;
/** 功能描述,显示在搜索结果中 */
explain: string;
/** 触发关键词列表 */
cmds: string[];
/** 功能图标(可选) */
icon?: string;
}示例:
{
"features": [
{
"code": "translate",
"explain": "翻译选中的文本",
"cmds": ["翻译", "translate", "fy"]
},
{
"code": "dictionary",
"explain": "查词典",
"cmds": ["词典", "字典", "dict"]
}
]
}Rubick 使用 Accelerator 格式定义快捷键:
| 修饰键 | macOS | Windows/Linux |
|---|---|---|
| Command/Control | Command / Cmd | Ctrl |
| Option/Alt | Option / Alt | Alt |
| Shift | Shift | Shift |
| Super/Windows | Super | Super / Meta |
常用快捷键组合:
const defaultHotkeys = {
// macOS
darwin: {
showHide: 'Option+Space',
superPanel: 'Command+Shift+Space',
screenshot: 'Command+Shift+A'
},
// Windows/Linux
win32: {
showHide: 'Alt+Space',
superPanel: 'Ctrl+Shift+Space',
screenshot: 'Ctrl+Shift+A'
}
};注意:快捷键设置应避免与系统快捷键冲突。推荐使用包含
Option(macOS) 或Alt(Windows/Linux) 的组合。
本篇作为实战部分的开篇,我们对即将开发的 Rubick 工具箱进行了全面的需求梳理和设计。我们不仅定义了其核心功能,如无边框窗口、应用检索、插件化体系、超级面板和数据同步,还明确了其技术架构和非功能性需求。
这份文档将作为后续开发工作的权威指南,确保我们能够清晰、高效地将这些设计理念转化为一个功能强大、体验出色的桌面端效率工具。
| 文档 | 描述 |
|---|---|
| 快速检索功能 | 跨平台应用扫描与检索实现 |
| 05-超级面板实现 | 系统级增强菜单开发 |
| 09-右键菜单注入 | 应用集成到系统右键菜单 |
| 12-系统插件开发 | 系统插件与取色器实战 |
接下来的章节,我们将深入到每个模块的实战开发中,逐一实现这些激动人心的功能。